【作者】shy88488
【工具】loadPE, Ollydbg,PEID,Import_REC 1.6
【平台】WINXP
【软件名称】桌面提醒精灵5.02(在多特上找到的)
【加壳方式】UPX 0.89.6 - 1.02 / 1.05 - 1.24 ->Markus & Laszlo
【声明】学习之用并无商业企图!
-----------------------------------
【内容】
一.脱壳
-------------PEID查壳------------
UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus& Laszlo
OD载入直接单步向下 不要让他会跳!到达
0086B038 /7407 je shortzmtxjl.0086B041
0086B03A|8903 mov dwordptr ds:[ebx],eax
0086B03C |83C304 addebx,4
0086B03F^|EBD8 jmp shortzmtxjl.0086B019;这个地方回跳了
0086B041 FF9660FB4600 call dword ptrds:[esi+46FB60] ;但是在这边F4不能断下来会飞掉(原因我也不知)
0086B047 8BAE54FB4600 mov ebp,dword ptrds:[esi+46FB54]
0086B04D 8DBE00F0FFFF lea edi,dword ptrds:[esi-1000] ;在这个地方F4断下
0086B053 BB00100000 mov ebx,1000
继续向下单步走!!
0086B075 58 popeax
0086B076 61 popad
0086B077 8D442480 lea eax,dwordptr ss:[esp-80]
0086B07B 6A00 push 0
0086B07D 39C4 cmpesp,eax
0086B07F^ 75FA jnz shortzmtxjl.0086B07B
0086B081 83EC80 subesp,-80
0086B084- E93F55CFFF jmpzmtxjl.005605C8;到达这边在单步直接到达OEP
---------------jmp zmtxjl.005605C8 到达----------
005605C8 55 pushebp;跳到这里OEP
005605C9 8BEC movebp,esp
005605CB 6AFF push-1
005605CD 6820B37E00 push zmtxjl.007EB320
005605D2 68BC295600 push zmtxjl.005629BC
005605D7 64:A100000000 mov eax,dword ptrfs:[0]
005605DD 50 pusheax
005605DE 64:8925 00000000 movdword ptr fs:[0],esp
loadPE脱壳!
import_REC 修复!没有无效指针!!!
点击程序! 程序一闪而过!自动退出了!!!说明程序存在自校验!!
接下来是解除自校验!
================================================
二.自校验解除
OD载入修复文件!在命令行直接下段bpx ExitProcess!!!(记住大小写区分)
Shief+F9运行!
-------------------------------------------
004FB575 FF15F0425800 call dword ptrds:[<&kernel32.ExitP>;kernel32.ExitProcess;断在这里!查看堆栈信息!
004FB57B 5D popebp
004FB57C C3 retn
-----------堆栈信息--------------------
0012FC80004FB571dumped_.004FB571
0012FC8400000000ExitCode= 0
0012FC88/0012FCF4
0012FC8C|00432454返回到dumped_.00432454 来自 dumped_.004CFC9D;说明这个退出CALL由004CFC9D调过来的。并且004CFC9D可能是由00432454上面的某一个CALL到达的!
0012FC90|00000000
---------crtl+g来到00432454-----------------
00432429 53 pushebx
0043242A E850D80900 call dumped_.004CFC7F
0043242F 83C404 addesp,4
00432432 837D AC00 cmp dword ptr ss:[ebp-54],0
00432436 0F8407000000 jedumped_.00432443; 3
0043243C B801000000 mov eax,1
00432441 EB02 jmp shortdumped_.00432445 ; 2
00432443 33C0 xoreax,eax
00432445 85C0 testeax,eax
00432447 0F840A000000 jedumped_.00432457; 跳过calldumped_.004CFC9D将他改成JNE保存!!!
0043244D 6A00 push 0
0043244F E849D80900 calldumped_.004CFC9D;来到这边向上翻有三个跳
00432454 83C404 addesp,4
修改:
00432447 0F840A000000 jedumped_.00432457;将JE改成JNE保存!!!
运行新文件 依旧自动退出 ! MB还有自校验··
-------------载入新文件crtl+g来到00432454 ------
00432447 /750E jnz shortdumped_.00432457 ; 修改过的在此处下断 重新载入运行,在这边断下
00432449 |90 nop
0043244A |90 nop
0043244B |90 nop
0043244C |90 nop
0043244D |6A00 push 0
0043244F |E849D80900 call dumped_.004CFC9D
00432454 |83C404 addesp,4 ;这里到 向上翻
00432457 E90C000000 jmp dumped_.00432468
0043245C E900000000 jmp dumped_.00432461
---------------再下bpxExitProcess断点Shief+F9运行-------------------
004FB560 55 pushebp
004FB561 8BEC movebp,esp
004FB563 8B4508 moveax,dword ptr ss:[ebp+8]
004FB566 50 pusheax
004FB567 B9381D8200 mov ecx,dumped_.00821D38
004FB56C E80F85FFFF call dumped_.004F3A80
004FB571 8B4D08 movecx,dword ptr ss:[ebp+8]
004FB574 51 pushecx
004FB575 FF15F0425800 call dword ptrds:[<&kernel32.ExitP>;kernel32.ExitProcess;来到这边查看堆栈
004FB57B 5D popebp
004FB57C C3 retn
-----------堆栈
0012FC88004FB571dumped_.004FB571
0012FC8C00000000ExitCode= 0
0012FC90/0012FCF4
0012FC94|00432C99返回到dumped_.00432C99 来自dumped_.004CFC9D;到00432C99处看看
0012FC98|00000000
0012FC9C|0012FCB4
0012FCA0|00000001
----------------来到00432C99处----------
00432C88 33C0 xoreax,eax
00432C8A 85C0 testeax,eax
00432C8C 0F840A000000 jedumped_.00432C9C;跳过下面的CALL
00432C92 6A00 push 0
00432C94 E804D00900 call dumped_.004CFC9D;CALL退出函数
00432C99 83C404 addesp,4
00432C9C 8B5DFC movebx,dword ptr ss:[ebp-4]
00432C9F 85DB testebx,ebx
--------- 修改
00432C8C 0F840A000000 jedumped_.00432C9C;将JE改成JNE,保存··
-------------运行程序----------
可以运行了@!!··呵呵··过程应该蛮详细的吧!
又重新看了一遍我自己写的这篇脱文!觉得这是到目前我写过的最好的文章之一!
虽然脱壳思路清晰,但是其实我对加壳原理什么的还真是不懂!现在也是一点不懂。不过这应该算是一个启蒙吧!让我觉得电脑这东西,万变不离其宗,乖乖学C++去!