170722 逆向-DLL基础

来源:互联网 发布:电视机网络电视怎么调 编辑:程序博客网 时间:2024/06/15 17:07

1625-5 王子昂 总结《2017年7月22日》 【连续第293天总结】
A. DLL基础
B.

DLL工作方式

构建DLL

  头文件,其中包含待导出函数的原型、结构和符号的声明
  C/C++源文件,其中包含待导出函数的实现和变量
  编译器为每个C/C++源文件生成.obj文件
  连接器将每个.obj模块合并,从而生成DLL
  如果至少导出了一个函数/变量,那么连接器会同时生成.lib文件

构建EXE

  头文件,其中包含待导出函数的原型、结构和符号的声明
  C/C++源文件,其中包含待导出函数的实现和变量
  编译器为每个C/C++源文件生成.obj文件
  链接器将每个.obj模块合并,并使用.lib文件来解析对导入的函数/变量的引用,从而生成.exe(包含一个导入表,其中列出了必需的DLL和导入的符号)

运行应用程序

  加载程序为.exe创建地址空间
  加载程序将必需的DLL载入到地址空间中
  进程的主线程开始执行,应用程序开始运行

构建DLL模块

  在创建DLL的时候,事实上是创建了一组可供可执行模块(或其他DLL)调用的函数。
  一个DLL可以导出变量、函数或C++类来供其他模块使用,但在实际开发中应避免导出变量和C++类
  创建DLL时需要一个头文件包含想导出的变量和函数原型,并且定义用到的符号和数据结构;这个头文件需要分发给调用者

运行可执行模块

  启动可执行模块时,先创建虚拟地址空间,接着把可执行模块映射到地址空间中,再检查可执行模块的导入段来对DLL定位并把它们映射到地址空间中
  由于导入段只包含DLL的名称而没有路径,因此需要按照下列顺序搜索:
    包含可执行文件的目录
    Windows系统目录,通过GetSystemDirectory得到
    16位的系统目录,即Windows/System
    Windows目录,通过GetWindowsDirectory得到
    进程的当前目录
    PATH环境变量中所列出的目录
  注意对应用程序当前目录的搜索位于Windows目录之后,这个改变从XP SP2开始,为了防止夹在程序在应用程序的当前目录中找到伪造的系统DLL并将它们载入。注册表中有一个值可以改变搜索顺序。
  DLL被加载入地址空间以后,加载程序还会检查每个DLL的导入段,从而继续将额外的DLL映射进入。
C. 明日计划
逆向