-
-
[旧帖] [分享]Safeguard脱壳探究 0.00雪花
-
发表于: 2010-4-10 09:36 1378
-
首先我还是用OD加载,结果这个挨千刀的壳说不允许在调试模式下运行!我晕菜~~ @_@
重新加载,然后在user32.messageboxa下断,再次运行。这次程序暂停在messageboxa了,然后我就这样子反向跟踪,最终找到了关键代码
我原以为将以下代码全部用NOP填充就可以了
00F12113 E9 1D0C0000 JMP 00F12D35
00F12D62 E9 CEFFFFFF JMP 00F12D35
00F12DA8 EB B8 JMP SHORT 00F12D62
00F12DEE 0F84 6EFFFFFF JE 00F12D62
00F12E96 E8 9AFEFFFF CALL 00F12D35
结果实事证明,确实要用NOP填充,但还漏了一个地方,那就是这个壳还有个时间保护,通过在ExitProcess下断,最终找到以下关键代码。
00F10EFC MOV EAX,DWORD PTR DS:[F1495C]
00F10F01 CMP BYTE PTR DS:[EAX+40],0
00F10F05 JE SHORT 00F10F5E
00F10F07 CALL DWORD PTR DS:[F01028] ; kernel32.GetTickCount
00F10F0D MOV ECX,EAX
00F10F0F SUB ECX,DWORD PTR DS:[F14720]
00F10F15 CMP ECX,1388
00F10F1B JBE SHORT 00F10F5E
00F10F1D PUSH DWORD PTR DS:[F14724]
00F10F23 MOV DWORD PTR DS:[F14720],EAX
00F10F28 CALL DWORD PTR DS:[F0105C] ; kernel32.ResumeThread
00F10F2E CMP DWORD PTR DS:[F14F7C],3
00F10F35 JL SHORT 00F10F3F
00F10F37 PUSH 0
00F10F39 CALL DWORD PTR DS:[F0101C] ; kernel32.ExitProcess
将00F10F1B处的JBE修改为JMP,这样子就可以随便调试代码了。
接着还有一个麻烦,这个壳还保护了相关API调用,形如这样:
004480CC PUSH 8510D64F
004480D1 JMP shua.00448360
这就使得无从得知到底是什么API,而且如果要脱壳的话,也必须得弄明白这代码。经过研究,PUSH 8510D64F后面的32位16进制数类似CALL_ID,
通过以下解密算法
INDEX=(((CALL_ID+CC8EC20) xor 94C5F)xor 68B65FD9)+6992EBF
就可以得知一个数组索引数,而API的真实调用地址全部都在某数组内
API_ADDRESS=API_ARY[INDEX]
不过脱壳时不处理被处理过的API,应该问题不大,也许就是速度慢些吧~ 毕竟这个壳的花指令是相当的多。
重新加载,然后在user32.messageboxa下断,再次运行。这次程序暂停在messageboxa了,然后我就这样子反向跟踪,最终找到了关键代码
我原以为将以下代码全部用NOP填充就可以了
00F12113 E9 1D0C0000 JMP 00F12D35
00F12D62 E9 CEFFFFFF JMP 00F12D35
00F12DA8 EB B8 JMP SHORT 00F12D62
00F12DEE 0F84 6EFFFFFF JE 00F12D62
00F12E96 E8 9AFEFFFF CALL 00F12D35
结果实事证明,确实要用NOP填充,但还漏了一个地方,那就是这个壳还有个时间保护,通过在ExitProcess下断,最终找到以下关键代码。
00F10EFC MOV EAX,DWORD PTR DS:[F1495C]
00F10F01 CMP BYTE PTR DS:[EAX+40],0
00F10F05 JE SHORT 00F10F5E
00F10F07 CALL DWORD PTR DS:[F01028] ; kernel32.GetTickCount
00F10F0D MOV ECX,EAX
00F10F0F SUB ECX,DWORD PTR DS:[F14720]
00F10F15 CMP ECX,1388
00F10F1B JBE SHORT 00F10F5E
00F10F1D PUSH DWORD PTR DS:[F14724]
00F10F23 MOV DWORD PTR DS:[F14720],EAX
00F10F28 CALL DWORD PTR DS:[F0105C] ; kernel32.ResumeThread
00F10F2E CMP DWORD PTR DS:[F14F7C],3
00F10F35 JL SHORT 00F10F3F
00F10F37 PUSH 0
00F10F39 CALL DWORD PTR DS:[F0101C] ; kernel32.ExitProcess
将00F10F1B处的JBE修改为JMP,这样子就可以随便调试代码了。
接着还有一个麻烦,这个壳还保护了相关API调用,形如这样:
004480CC PUSH 8510D64F
004480D1 JMP shua.00448360
这就使得无从得知到底是什么API,而且如果要脱壳的话,也必须得弄明白这代码。经过研究,PUSH 8510D64F后面的32位16进制数类似CALL_ID,
通过以下解密算法
INDEX=(((CALL_ID+CC8EC20) xor 94C5F)xor 68B65FD9)+6992EBF
就可以得知一个数组索引数,而API的真实调用地址全部都在某数组内
API_ADDRESS=API_ARY[INDEX]
不过脱壳时不处理被处理过的API,应该问题不大,也许就是速度慢些吧~ 毕竟这个壳的花指令是相当的多。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [求助]我用WinLicense V2.0.6.0给文件加了壳,急求脱壳 2299
- [求助]急求EXE Encryptor 2288
- [原创]急需一款多层次加壳的软件! 1034
- [原创]ACProtect 1.4x DLL脱壳 1319
- [分享]Safeguard脱壳探究 1379
赞赏
雪币:
留言: