PELock 1.0x -> Bartosz Wojcik简单脱壳
最近碰到PELock 1.0x -> Bartosz Wojcik的壳,以前没见过,索性研究了一下。
准备工作,忽略除内存异常外的其他异常。11次异常程序运行。
脱这个壳主要是要解决三个问题。
1:输入表。程序的输入表被替换到壳中去了。
00374661 MOV DWORD PTR DS:[ECX],EBX
00374663 JMP SHORT 00374668
EBX中指向壳的地址,EAX为api的地址。直接改EBX为EAX的话后面的crc校验会出错。所以要想改就要先搞定crc。jingulong大虾给了一段代码,不过本人比较懒,用的是fxyang的script,速度有点慢,两三分钟才解出整个输入表
=======================================
//获取iat表Script
//by fxyang 2005.5.20
//由于只想得到iat表,所以没有检查表的结束。
var index
#LOG
gpa "LoadLibraryA", "kernel32.dll"
bprm $RESULT,1
mov index,1
eob exp1
run
exp1:
cmp index,0
je exp2
dec index
esto
exp2:
bpmc
rtu
bprm 00374661,1
mov index,1
eob exp3
esto
exp3:
cmp index,0
je exp4
dec index
esto
exp4:
mov [ecx],eax
add eip,2
mov index,1
esto
=========================================
2。搞定了输入表,接下来就是壳转移数据的问题了。
用401000内存断点方法dump下来,修复一下后会出现这个问题
00402814 $Content$nbsp; 53 push ebx
00402815 . 85C0 test eax,eax
00402817 . 7E 15 jle short dumped_.0040282E
00402819 .- E9 FFDBE900 jmp 012A041D //这里出错
0040281E 00 db 00
0040281F . 8BD8 mov ebx,eax
00402821 . 85DB test ebx,ebx
原来这个壳把程序的一部分参数和函数的调用都弄到了动态申请的地址,dump下来的程序当然没有这个地址了,跟踪一下源程序八次异常后来到处理上面数据的地方
00378367 3017 xor byte ptr ds:[edi],dl //特殊处理,edi放填充地址
00378369 47 inc edi
0037836A 8B16 mov edx,dword ptr ds:[esi]
0037836C 83C6 04 add esi,4
0037836F C602 E9 mov byte ptr ds:[edx],0E9
00378372 8BC7 mov eax,edi
00378374 2BC2 sub eax,edx
00378376 83E8 05 sub eax,5
00378379 8942 01 mov dword ptr ds:[edx+1],eax
0037837C 8A06 mov al,byte ptr ds:[esi]
0037837E 46 inc esi
0037837F 0FB6C8 movzx ecx,al
00378382 83E0 03 and eax,3
00378385 C1E9 02 shr ecx,2
00378388 F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
0037838A 8BC8 mov ecx,eax
0037838C F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
00