首页
社区
课程
招聘
[旧帖] [分享]Safeguard脱壳探究 0.00雪花
发表于: 2010-4-10 09:36 1314

[旧帖] [分享]Safeguard脱壳探究 0.00雪花

2010-4-10 09:36
1314
首先我还是用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,应该问题不大,也许就是速度慢些吧~ 毕竟这个壳的花指令是相当的多。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//