最近在看滴水的逆向视频,看到如何向pe文件中添加messagebox,主要添加过程如下:
说明:
给小bug刷钻.exe程序添加一个messagebox的弹窗
1、添加思路
为了实现给目标程序添加弹框,由于程序在运行时都是二进制形式,所以先要获取添加的shellcode的编码,然后在程序的可执行区域加入恶意代码,此处的可执行区域主要是指代码区的空白区。(只有代码区才有可有可执行权限,空白区主要是指VirtualAddress补齐后的区域,如下图标注区域)
添加完后,需要执行call函数调佣恶意代码的位置,执行完毕后jump到oep,即回到程序的入口点,保证程序在弹框结束后,可以正常运行。
2、准备工作
模型如下:
恶意代码+E8 00 00 00 00+E9 00 00 00 00
(1)获取call函数 jump函数的硬编码
通过定义一个call函数,查看其返汇编代码
真正要跳转的地址=E8当前指令的下一行代码+x
由于e8当前指令占用为5位,所以该公式可变形为
真正要跳转的地址=E8当前指令+5 +x
从而可获取x数值
jump指令同样可以计算得到
(2)获取恶意代码指令shellcode
MessageBox(0,0,0,0)的shellcode
6A 00 6A 00 6A 00 6A 00
(3)获取MssageBox的函数地址
通过在od中执行bp MessageBoxA ,对MessageBox下断点,找到MessageBoxA 函数的入口通过查找发现调用该函数的位置为7754D710
(4)代码区中添加代码
查找代码区的空白区域,通过petool工具查看发现,该程序有4个节,将数据写入到.text中,因为该区域Characteristics 参数为60000020,具有执行代码权限
根据SizeOfRawData PointerToRawData两个参数可以确定,.txt节的结束位置为87000,即下一个节的开始位置
在空白区域进行shellcode填充 ,本次在86220开始处进行填充,首先填充shellcode
计算e8后面的数值,即call函数地址,利用如下公式计算
x=7754D710-(400000+8622D)=770C74E3
说明:此处需要注意文件对齐,我们要计算的是在内存中的偏移位置,由于我们的测试程序文件对齐和内存对齐均相同为1000,所以在实际内存中的偏移位置也相同;86222需要加上可选文件头中偏移地址400000即内存中地址;
计算e9后面的数值,e9即跳转到原来的入口点,即00065AF8
同样利用公式计算如下:
x=(00065AF8+400000)-(86232+400000)=FFFDF8C6
最终修改结果如下:
最后修改原来的函数入口点oep 00065AF8 为现在的地址86220,原来的oep在可选头里,如下图
修改完成后保存即可,再次打开该程序弹出messagebox窗口
点击确定后即可打开正常的程序
3、小结
简单总结下,首先应该转备好需要添加的恶意代码,并且转换为相应的机器码;
然后确定源程序中哪部分为可执行的代码节,找到其中的空白代码,进行shellcode添加;
确定E8 E9后面的值,在进行地址计算时应该注意不是文件中的地址,要转换为运行中的地址,所以要加上IMAGE BASE的地址;
在查找节的起始位置时,要注意SizeOfRawData、PointerToRawData,即文件对齐后的大小以及文件中的偏移地址,节的结束位置即下一个节的开始位置,应该是SizeOfRawData加上PointerToRawData。
还应该注意文件对齐,我们在计算E8或E9后面的数值时,实际计算的是在内存中偏移位置,所以应该注意文件偏移与内存偏移是否相同。最后,利用该种方法修改,由于软件在不同的机器上运行,地址是不同的,所以改好的文件是无法在其他机器正常运行的,只能在当前机器上运行。