手动修改二进制文件,实现在代码区中添加自己的一段代码

需要有一定的PE文件结构知识。

以notepad++为例实现运行前先弹出一个空对话框

为了方便,先用任意一款PE解析器查看结构,找到text节区

手动修改二进制文件,实现在代码区中添加自己的一段代码_第1张图片

PointTorawDate+VirtualSize=0x10e7d6到代码区的代码结束处

手动修改二进制文件,实现在代码区中添加自己的一段代码_第2张图片

我们从0x10e7e0处开始添加代码

用OD加载文件,下断MessageBox


记下地址0x7602FDE6

将MessageBox需要的四个参数压栈,这里我们实验一个空窗口参数都为0

push对应的硬编码为6A,CALL对应的硬编码为E8 jmp对应的硬编码为E9

我们调用完这个函数后再jmp到程序原始入口处

用一个公式CALL 一个地址的硬编码X=(call的地址)-(call的下一个指令的地址)

以下图为例


0x4f52f3-0x4e33a7=0x11f4c  如图所示 一样

CALL指令的下一个指令的文件偏移为0x10e7ed

计算出对应的内存偏移0x10e7ed-(PointToRawDate 0x400)+(VirtualAddress 0x1000)=0x10f3ed

再加上基地(ImageBase 0x400000)计算出真正的内存地址0x50f3ed

所以对应的硬编码为0x7602FDE6-0x50f3ed=0x75b209f9

E9后面的地址应为程序入口点的硬编码

手动修改二进制文件,实现在代码区中添加自己的一段代码_第3张图片

程序入口点内存地址(AddressOfEntryPoint+imageBase)=0X4E33A2

文件偏移0x10e7f2对应的内存地址0x10e7f2-(PointToRawDate 0x400)+(VirtualAddress 0x1000)+(ImageBase 0x400000)=0x50f3f2

所以jmp到程序入口处的硬编码为0X4E33A2-0x50f3f2=0xFFFD3FB0

所以我们修改的代码为


最后应该修改程序入口点,使它指向我们的代码

我们代码的起始文件偏移0x10e7e0-(PointToRawDate)+(virtualSize 0x1000)=0x10f3e0

找到AddressOfEntryPoint的地址 将其值修改为0x10f3e0

保存文件运行,程序按照我们的目的执行,先弹出一个空窗口

手动修改二进制文件,实现在代码区中添加自己的一段代码_第4张图片

点确定后正常程序界面弹出

手动修改二进制文件,实现在代码区中添加自己的一段代码_第5张图片

整个过程结束,主要难在对各种地址的深刻理解和计算!



你可能感兴趣的:(逆向,PE文件结构)