目录
一.程序模块划分 1
二.主要模块描述 1
2.1 Shellcode 的生成 1
2.2 infect.cpp 简介 5
1. SetBytes 用于向文件指定位置覆盖写入 5
2. GetBytes 用于读取文件指定位置内容 5
3. 获得 Dos 头中的 e_lfanew,即 PE 头的 RVA 6
三.传染模块的设计与实现 6
1. 验证 PE 文件 8
2.获取 PE 头位置 9
四.PE 文件格式简述 10
1. Dos 头 10
2. PE header 11
3. SECTION TABLE 节表 13
4. 节 13
1).text 代码节 13
2).rdata 导入函数节 13
3)数据节 .data 14
4)导出函数节 14
五.实验思考与建议 14
一.程序模块划分
整体流程主要分为两部分, 一是 shellcode 的生成;
二是向目标程序植入 shellcode。植入过程主要分为两步: 1)检验当前文件是否为 PE 文件,是否已被感染 (参照 judgePE 函数)
2)将 shellcode 植入目标节,并依据 PE 文件格式,进行相关参数的修改(参照 infect 函数)
二.主要模块描述
2.1Shellcode 的生成
已知,本实验任务为建立一个指定名称文件夹,需要调用的函数为 CreateFileA。该函数在 kernel32.dll 中。
插 入 的 shellcode 需 要 利 用 导 入 函 数 节 找 到 kernel32.dll 的 基 地 址 , 再 在
kernel32.dll 的导出函数节中找到函数 CreateFileA 的地址,最后进行调用。在此我们利用 c++语言生成 shellcode 的二进制代码,主要流程如下1:
1.找到 kernel32.dll 基地址
已知,在 NT 内核系统中,fs 寄存器指向 TEB 结构,TEB+0x30 处指向 PEB 结构,PEB+0x0c 处 指 向 PEB_LDR_DATA 结 构 。 而 PEB_LDR_DATA+0x1c 处 为 一 个 叫 作
inInitialzationOrderModuleList 的 成 员 , 存 放 着 动 态 链 接 库 地 址 , 第 2 个 指 向
kernel32.dll。