|
欢迎您注册加入!这里有您将更精采!
您需要 登录 才可以下载或查看,没有账号?注册
x
促进钢蛋壳升级-简单分析及脱VProtect1.72demo版加密VB程序
到达OEP后直接跑脚本就可以了 脚本跑完后 UIF修复一下 然后DUMP 修复 就可以了,但是这样修复的程序只能在本机 运行 不能跨平台,IAT脚本中查找IAT的方法不变,只是在之前的基础上修改而来的,查找效率有了不小的提升,目前只知道支持1.72DEMO 估计不支持 VP加壳的程序,因为VP主程序 修复的时候相当的慢 ,基本上今天一天我都在修改脚本,有兴趣的可以自己测试一下脚本能否使用,我这里可以顺利跑完,也就是只修复了00401000那部分的IAT ,对于主程序那里的IAT也都被壳处理了,但是我同时都修复后 却没有成功,只修复00401000那部分还可以本机运行,功能也可以正常使用,所以就没有再做大强度的测试了,因为用脚本完全跑完真个VP程序 不止一个小时呢,我个人感觉应该可以分两步来完成修复IAT ,先修复00401000那部分修复好后可以本机运行 然后在修复主程序段段内IAT,不过我是没有精力再搞了。还是放下脚本让有兴趣的继续研究吧。
脚本共两个,第一个脚本是修复00401000段内调用的IAT的,第二个脚本是修复主程序段也就是OEP所在的段内调用IAT的,另外第脚本二在运行过程中当EIP 也就是运行到0080a938这行时会出错,这个时候要手动该脚本为单步,然后在脚本合适的地方重新运行那样停止的程序就会能重新运行,然后重新在OEP处新建EIP,并修改一下ESP的值,保证堆栈平衡,然后重新再跑一遍脚本二 就可以修复完的 好了不多说了有兴趣的自己看看吧!再次支持苦力升级!
注意:一定要先运行脚本一,修复完后再运行脚本二!因为004010000那里的调用IAT时 第一个跳转就是调向主程序段调用的IAT那里的!
脚本一:
var oep
var ptr
var ip1
var addr
var refaddr
var refaddr2
var temesp
var ptr1
var kebase1
var kebase2
var iataddr1
var iataddr2
var iatstartaddr
mov kebase1,007fc000
mov kebase2,00bde000
mov iatstartaddr,00401000
start:
mov oep,eip
mov temesp,esp
findkebase1tzm:
mov eip,kebase1
find eip, #595B588BC18B4F24519D03C38B5F4489039C58#
cmp $RESULT,0
je findkebase2tzm
add $RESULT,11
bp $RESULT
findkebase2tzm:
mov eip,kebase2
find eip, #595B588BC18B4F24519D03C38B5F4489039C58#
cmp $RESULT,0
je start
add $RESULT,11
bp $RESULT
start:
mov esp,temesp
mov eip,iatstartaddr
mov ptr1,eip
iatfind:
mov temesp,esp
find ptr1, #e9??????00008bc0#
cmp $RESULT,0
je exit
mov ptr,$RESULT
mov ptr1,ptr
mov eip,ptr
mov refaddr, ptr
sti
sti
sti
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp9c:
cmp ip1,9c
jnz tzm1iataddrfind
je iat23addrfind
tzm1iataddrfind:
sti
mov iataddr,eax
gn iataddr
cmp $RESULT,0
je tzm1iataddrfind
tzm1iatfix:
sub eax,refaddr
SUB eax,5
mov refaddr,ptr
mov [refaddr],#e99090909090#
add refaddr,1
mov [refaddr],eax,4
mov esp,temesp
nextfind:
add ptr1,3
jmp iatfind
iat23addrfind:
esto
mov iataddr,eax
gn iataddr
cmp $RESULT,0
jne tzm3iatfix
mov iataddr,ebx
gn iataddr
cmp $RESULT,0
je iat23addrfind
tzm2iatfix:
sub ebx,refaddr
SUB ebx,5
mov refaddr,ptr
mov [refaddr],#e99090909090#
add refaddr,1
mov [refaddr],ebx,4
mov esp,temesp
jmp nextfind
tzm3iatfix:
sub eax,refaddr
SUB eax,5
mov refaddr,ptr
mov [refaddr],#e99090909090#
add refaddr,1
mov [refaddr],eax,4
mov esp,temesp
jmp nextfind
exit:
mov esp,temesp
mov eip,oep
ret
脚本二:
var oep
var ptr
var ip1
var addr
var refaddr
var temesp
var ptr1
var code
var kebase1
var kebase2
var iataddr
mov kebase1,007fc000
mov kebase2,00bde000
mov oep,eip
mov temesp,esp
start:
mov esp,temesp
mov eip,kebase1 //查找的起始位置
mov ptr1,eip
tzm3iatfind:
mov temesp,esp
find ptr1,#E9??????
00?????????????????????????????????????????????????CCCCC#
cmp $RESULT,0
je exit
mov ptr,$RESULT
mov ptr1,ptr
mov eip,ptr
mov refaddr, ptr
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
finde9:
cmp ip1,e9
jnz find68
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp ip1,50
jnz nextfind
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp ip1,e9
jnz nextfind
je tzm3iataddrfind
find68:
cmp ip1,68
jnz find50
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp ip1,9c
jnz nextfind
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp ip1,81
jnz nextfind
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp ip1,9d
jnz nextfind
je tzm3iataddrfind
find50:
cmp ip1,50
jnz nextfind
sti
mov ip1, eip
mov ip1, [ip1]
and ip1, 0ff
cmp ip1,e9
jnz nextfind
tzm3iataddrfind:
sti
mov iataddr,eax
gn iataddr
cmp $RESULT,0
je tzm3iataddrfind
tzm3iatfix:
sub eax,refaddr
SUB eax,5
mov refaddr,ptr
mov [refaddr],#E9909090909#
add refaddr,1
mov [refaddr],eax,4
mov esp,temesp
nextfind:
add ptr1,3
jmp tzm3iatfind
exit:
mov esp,temesp
mov eip,oep
ret
又重新看了下主程序 主程序中的IAT可以修复了 但是还有一种IAT加密没有修复 运行会出错的 就是这种 估计要把这种也修复了 才可以运行的 不过这种加密的修复是最简单的 先不修复了 有空再看看
008194D8 50 PUSH EAX
008194D9 60 PUSHAD
008194DA 9C PUSHFD
008194DB B8 B3D0FDC3 MOV EAX,C3FDD0B3
008194E0 BB 6D74833C MOV EBX,3C83746D
008194E5 03C3 ADD EAX,EBX
008194E7 8B00 MOV EAX,DWORD PTR DS:[EAX]
008194E9 8D0418 LEA EAX,DWORD PTR DS:[EAX+EBX]
008194EC 874424 24 XCHG DWORD PTR SS:[ESP+24],EAX
008194F0 9D POPFD
008194F1 61 POPAD
008194F2 C3 RETN
类似这个代码的 如果这个代码全部修复的话 理论上是可以 运行的 很怪的一件事就是 我DUMP后的程序 直接添加了一个区段 然后把IAT自己拷贝进去 在OD里面 脱壳后的程序就可以运行了 但是我DUMP那个区段 补上区段后 就出错了 运行不起来 还没有看清楚是哪里的问题
针对上面的地三种加密方式 写的处理脚本 运行完1 和2 后运行第三个脚本,然后修复OK
脚本三:
var oep
var ptr
var ip1
var addr
var refaddr
var temesp
var ptr1
var code
var kebase1
var kebase2
var iataddr
mov kebase1,007fc000
mov kebase2,00bde000
mov oep,eip
mov temesp,esp
start:
mov esp,temesp
mov eip,kebase1 //查找的起始位置
mov ptr1,eip
tzm3iatfind:
mov temesp,esp
find ptr1,#50609CB8????????BB????????
03C38B008D0418874424249D61#
cmp $RESULT,0
je exit
mov ptr,$RESULT
mov ptr1,ptr
mov eip,ptr
mov refaddr, ptr
add $RESULT,14
bp $RESULT
jne tzm3iataddrfind
tzm3iataddrfind:
esto
mov iataddr,eax
gn iataddr
cmp $RESULT,0
jnz tzm3iatfix
msg "请手动修复错误的,然后再次重新运行脚本"
tzm3iatfix:
sub eax,refaddr
SUB eax,5
mov refaddr,ptr
mov [refaddr],#E9909090909#
add refaddr,1
mov [refaddr],eax,4
mov esp,temesp
nextfind:
add ptr1,3
jmp tzm3iatfind
exit:
mov esp,temesp
mov eip,oep
ret
|
|