来个简单一点的,以系统自带的计算器程序为例,给它添加一个简单的启动消息框,在这里通过插入stub的形式来实现。所谓stub,就是一段字节型数据,是汇编代码的数据形式,在插入目标进程后可以被执行。
1.增加一个区块
用LordPE可以非常方便地为PE文件增加一个区块,但Windows自带的计算器程序在区块表后面仅跟着着是绑定输入表的数据,直接增加区块会破坏这些数据,这样可能会导致程序不能正常运行,要解决这个问题,我们可以将这些数据移到别处,再修改绑定输入表的偏移地址就可以了,但更简单的方法是直接将绑定输入表的偏移地址和大小全部清零,因为绑定输入表对PE来说并不是必须的。我们用LordPE先将calc.exe的绑定输入表清零,再添加一个区块,区块的虚拟大小和物理大小均设为1000h(都随便啦).
 
 名称   虚拟地址   虚拟大小  物理偏移  物理大小  标志
.text   00001000  000126B0  00000400  00012800  60000020
.data   00014000  0000101C  00012C00  00000A00  C0000040
.rsrc   00016000  00008960  00013600  00008A00  40000040
.NewSec 0001F000  00001000  0001C000  00001000  E00000E0
 
其中.NewSec是新增的区块,增加区块之前,要注意LordPE选项设置的自动修正镜像大小的对勾要打上,不然就要自己修改这个值了。由于LordPE简单的增加区块只是修改了PE文件头,并不增加相应的数据段,要增加相应的数据段可以使用WinHex,在物理偏移0001C000处(即文件末)增加4096字节(即1000h).
 
2.插入stub。
由于我们要实现的功能是增加一个消息框,会用到user32.dll中的MessageBoxA函数,我们用LordPE在calc.exe的导入表中增加这个函数,并记下该导入函数的ThunkRVA,如我测试时为00020019,加上calc.exe的基地址01000000,那么其虚拟地址为01020019。用OllyDbg载入添加区块后的calc.exe,先准备2个字符串以供MessageBoxA函数调用。如:
 
0101F100  B2 E5 C8 EB 73 74 75 62 00 00 00 00 00 00 00 00  插入stub........
0101F110  D5 E2 CA C7 D2 BB B8 F6 BC F2 B5 A5 B5 C4 C0 FD  这是一个简单的例
0101F120  D7 D3 00                                         子..
 
接着开始插入汇编代码了,从0101F000开始插入汇编代码。
 
0101F000    60              pushad
0101F001    6A 00           push    0
0101F003    68 00F10101     push    0101F100
0101F008    68 10F10101     push    0101F110
0101F00D    6A 00           push    0
0101F00F    FF15 19000201   call    [01020019]  //调用MessageBoxA
0101F015    61              popad
0101F016  - E9 5A34FFFF     jmp     01012475  //原入口地址
 
把修改后的程序保存下来。保存时要注意:先在CPU窗口中转到0101F000,才可以复制到可执行文件。
 
3.修改入口地址
用LordPE打开修改后的文件,把入口地址从00012475改为0001F000,就完成了这个简单的实验,现在只要运行这个修改后的calc.exe就会先启动一个消息框,点击确定按钮会回到原始程序。整个过程很简单哦。