专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
青岛新闻网  ·  时间定了!油价又要变 ·  5 小时前  
青岛新闻网  ·  时间定了!油价又要变 ·  5 小时前  
山东市场监管  ·  省市场监管局党组书记、局长吴承丙到日照调研网 ... ·  18 小时前  
山东市场监管  ·  省市场监管局党组书记、局长吴承丙到日照调研网 ... ·  18 小时前  
云头版  ·  2.96 ... ·  2 天前  
计算机与网络安全  ·  2024年度全球软件漏洞与威胁情报报告 ·  2 天前  
51好读  ›  专栏  ›  看雪学苑

Windows PE 文件格式入门:手写最小PE

看雪学苑  · 公众号  · 互联网安全  · 2025-05-14 17:59

正文

请到「今天看啥」查看全文



基础PE内容总览


8.编写导入内容:库+函数

◆根据导入内容思考设计:实现弹框需要写入两项内容:1.库名(user32);2.函数名(MessageBoxA)。根据两个字符串的长度(+00结束符)找到最合适的位置并写入:

    文件偏移+0x30, dll名 "user32 ",7Byte

    文件偏移+0x0C, 函数名 " MessageBoxA ",12Byte

    img


写入库名和函数名


9.编写导入表项

◆导入表IMAGE_IMPORT_DESCRIPTOR 置于 0xB0处 ,因为PE加载后,0xB0-0xC3处内存会被初始化为全0。


文件偏移+0xBC :DWORD Name→RVA指向dll名: 0x00000030


文件偏移+0xC0 :DWORD FirstThunk→RVA指向IAT表: 0x0000009C


img



10.编写IAT表 IMAGE_THUNK_DATA32

文件偏移+0x9C ,PIMAGE_IMPORT_BY_NAME AddressOfData→指向IMAGE_IMPORT_BY_NAME: 0x0000000A

    因为 IMAGE_IMPORT_BY_NAME结构体的指向函数名的NAME成员前还有一个WORD Hint成员,所以指向的地址需要跳过一个WORD 2字节,以实现NAME指向函数名。


文件偏移+0xA0 ,以全0作结尾项: 0x00000000


img


11.将导入表位置写入数据目录中

文件偏移+0x80 ,DataDirectory[1]导入表位置:0x000000B0


img


◆OD检测:内存窗口中跟随地址0x40009C,以"长型→地址"方式查看,可见导入成功。


img


12.编写汇编指令:获取MessageBoxA函数地址并传参调用

文件偏移+0x60 ,在选项头的堆栈空间值区编写弹框文本:"hello world"


img


◆*选线头主版本号不可用,故以副链接器版本号成员处(0x1F)开始非重要区域编写指令:


文件偏移+0x1F ,参数4 UINT uType→对话框按钮类型:6A 00 = push 0(注3)


文件偏移+0x21 ,参数3 LPCTSTR lpCaption→消息框标题:6A 00 = push 0


文件偏移+0x23 ,参数2 LPCTSTR lpText→消息框内容,指向"hello world":68 64004000 = push 00400064


文件偏移+0x25 ,参数1 HWND hWnd→窗口句柄:6A 00 = push 0


文件偏移+0x2A ,短跳至空闲区以备调用函数:EB18= jmp short 00400044


文件偏移+0x44 ,从IAT表中获取API地址并调用:FF15 9C004000= CALL 0040009C


文件偏移+0x4A ,调用后返回:C3=ret


img


14.修改OEP

文件偏移+0x44 ,OEP:FF15 9C004000= CALL 0040009C


img


15.完整PE总览


img


操作

img


img

img

修改导入表,导入表占 20字节 但前面 12个字节都没用


img


上述操作之后的代码


img


点击运行发现报错,说明我们的代码有问题


img


用OD 查看,发现导入函数并没有加载进来,说明我们的导入表构件的有问题


img


初步检查发现如下错误


img


继续寻找错误并把没用的数据用CC填充


img

img


还是有错误,继续寻找


img

img







请到「今天看啥」查看全文