来个简单一点的,以系统自带的计算器程序为例,给它添加一个简单的启动消息框,在这里通过插入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就会先启动一个消息框,点击确定按钮会回到原始程序。整个过程很简单哦。
- 标 题:为PE文件添加stub
- 作 者:DebugFan
- 时 间:2009-07-23 19:38:38
- 链 接:http://bbs.pediy.com/showthread.php?t=94185