网上也有很多手动脱壳的教程,但是光看不写总觉的像自己没学过似的。
操作环境:
操作系统:Windows 7 Ultimate
OD版本:Olldbg 1.10
被脱壳软件:文章最后提供下载
下边利用ESP原理脱壳。
首先使用OD载入图标王程序,出现提示确定即可。开头的代码如下:
00405A99 > $ B8 D0C74200 MOV EAX,图标王.0042C7D0
00405A9E . 50 PUSH EAX
00405A9F . 64:FF35 00000>PUSH DWORD PTR FS:[0]
00405AA6 . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00405AAD . 33C0 XOR EAX,EAX
00405AAF . 8908 MOV DWORD PTR DS:[EAX],ECX
00405AB1 . 50 PUSH EAX
00405AB2 . 45 INC EBP
单步执行完00405A9E处的PUSH EAX后,观察ESP寄存器为:
ESP 0012FF8C
下一步就在ESP指向的位置设置硬件访问断点,在命令框中输入:
hr 12ff88
按下F9,使程序直接运行,在我运行时出现违规异常,按下Shift+F9忽略异常。
程序运行到这里中断:
76DC8D0B 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
76DC8D0E 72 09 JB SHORT ntdll.76DC8D19
76DC8D10 3B45 F4 CMP EAX,DWORD PTR SS:[EBP-C]
76DC8D13 0F82 E9EF0400 JB ntdll.76E17D02
那么在这之后一直单步执行直到:
0042C87D 8985 23120010 MOV DWORD PTR SS:[EBP+10001223],EAX
0042C883 8BF0 MOV ESI,EAX
0042C885 59 POP ECX
0042C886 5A POP EDX
0042C887 03CA ADD ECX,EDX
0042C889 68 00800000 PUSH 8000
0042C88E 6A 00 PUSH 0
0042C890 57 PUSH EDI
0042C891 FF11 CALL DWORD PTR DS:[ECX]
0042C893 8BC6 MOV EAX,ESI
0042C895 5A POP EDX
0042C896 5E POP ESI
0042C897 5F POP EDI
0042C898 59 POP ECX
0042C899 5B POP EBX ; 7FFD6000
0042C89A 5D POP EBP
0042C89B FFE0 JMP EAX
当执行完0x0042C89B中JMP EAX指令后,程序就会跳到程序入口点执行:
00405A99 > $ 55 PUSH EBP
00405A9A ? 8BEC MOV EBP,ESP
00405A9C ? 6A FF PUSH -1
00405A9E . 68 089D4100 PUSH 图标王.00419D08
00405AA3 ? 68 D08B4000 PUSH 图标王.00408BD0
00405AA8 ? 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00405AAE ? 50 PUSH EAX
00405AAF . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
这时,使用OllyDump插件进行脱壳即可。
注意的是,并不是程序刚刚运行到程序入口点才能够使用OllyDump脱壳,如果一不小心运行过了之后,在脱壳设置时,手动将入口点地址处的数值修改为入口点地址-起始地址即可,如本程序中入口点地址应该是405A99 - 400000 = 5A99
好了,到这里就脱壳完毕了。
软件下载:实验程序----图标王
在此感谢图标王编写作者~