用VC2010编译出来的EXE程序跟DLL很像,在PE文件里的基址一般写着0X400000,但是一般不会被加载到这个位置。这就意味着,如果加壳工具去除了EXE程序的原始重定位表,我们似乎只能用两种方法来处理壳:1.在壳代码中强制它以0X400000为重定位基址,然后DUMP 2.像处理DLL一样修复它的重定位表。本文以UPX加EXE为例试验了第二种方法,修复EXE的重定位与修复DLL的重定位原理差不多,坛上帖子多,我就不废话了。 大致操作过程如下: 1.使用的ESP定律迅速找到OEP 2.找到OEP以后进入原程序的代码,找几个需要重定位的地址,下内存断点,中断两三次后会发现类似下面这样的代码,拦截ebx,保存起来后处理一下即可得到重定位表。 add eax,esi mov [ebx],eax 详细操作见OD代码:
var bp1rva=10546
var pcurrmem_ori=0
var pcurrmem
var membase=0
var memsize=2000
var hdaddr=0
msgyn
"是否要执行本脚本?"
cmp
0,$RESULT
jnz next
next:
mov memsize,2000
alloc memsize
//
分配内存用作重定位表的修复
mov pcurrmem,$RESULT
mov pcurrmem_ori,pcurrmem
log pcurrmem
gmemi eip,MEMORYOWNER
mov membase,$RESULT
获取当前加载基址
mov bp1rva,10546
add bp1rva,membase
bp bp1rva
在这个地址下断
//ESP
定律
sti
mov hdaddr,esp
log hdaddr
bphws hdaddr,
"r"
run
eob manytimes
manytimes:
会先停在bp1
eip,bp1rva
jnz maybetheend
mov [pcurrmem],ebx
保存即可
add pcurrmem,4
指针加4
maybetheend:
dm pcurrmem_ori,memsize,
"d:\desktop\reloc.hex"
bphwc hdaddr
[注意]看雪招聘,专注安全领域的专业人才平台!