本节要做一个功能,那就是在程序中植入一段代码,程序打开前会先弹出我们的界面,经过我们的界面之后,再正常运行。这个要怎么做呢?
步骤如下
一:修改编译器随机基址为否
别问为什么,我被坑了1小时,因此这个放在第一步
二:编写shellcode
找一块空白区域代码(我这里找的是.text),插入一个MessageBox程序,首先准备好几个值。
ImageBase,我用的程序是0x00400000
AddressOfEntryPoint,我用的程序是0x00011023,
MessageBoxAddr,我的电脑是0x754B88A0
VirtualAddressOffset,拉伸后的.text偏移,我电脑是0x11000
RawAddress,拉伸前的.text偏移,我电脑是0x400
NewEntryPoint,插入程序的位置,我选择0x00006750,这个值是未拉伸的值
准备好之后插入如下shellcode
shellcode解释
1.6A 00 6A 00 6A 00 6A 00
这一段是MessageBox需要的参数,我们来看反汇编
2.E8
汇编call的字节码
3.43 15 0A 75
这个值是什么意思呢?因为是小端序显示,这段真正的值是75 0A 15 43。
这个值是怎么来的呢?不是说E8是call吗,这个是不是MessageBox的地址,不,这个值不是MessageBox的地址,但是确实是根据它的地址计算出来的,公式如下
我们把75 0A 15 43看成为x,那么,要跳转的地址=E8字节码的地址+5+x;
也就是MessageBoxAddr=E8的地址+5+x=>754B88A0=E8的地址+5+x;
那E8的地址又怎么来?E8的地址也是要经过计算出来的。如下:
E8Address = ImageBase+VirtualAddressOffset+(NewEntryPoint-RawAddress)+8;
根据上面的值可以得到
E8Address=417358;
754B88A0=417358+5+x; => x=754B88A0-417358-5=75 0A 15 43;
4.E9
jmp指令字节码
5.C1 9C FF FF
调到原入口点计算出来的值,计算方式和E8后面的值一样,这里我就不在重复了
原入口点地址+ImageBase=E9地址+5+(FF FF 9C C1)
所有的都计算完毕之后,shellcode就变成了
6A 00 6A 00 6A 00 6A 00 E8 43 15 0A 75 E9 C1 9C FF FF
三:修改入口点
我的入口点偏移位置是0x110,公式为VirtualAddressOffset+(NewEntryPoint-RawAddress)
因此值为0x11000+0x6750-0x400=17350
至此,一切准备就绪,看效果
修改前:
修改后: