首页
社区
课程
招聘
请给我脱Armadillo 1.xx-2.xx的工具吧!
发表于: 2004-7-13 00:11 5847

请给我脱Armadillo 1.xx-2.xx的工具吧!

2004-7-13 00:11
5847
今天“脱”Armadillo1.xx-2.xx 郁闷了一天,没有进展。听说象1.xx-2.xx这种版本教低的脱壳工具已经有了!但是我在网上却老是找到死连接!各位大哥,帮帮我这个“脱”界新秀啊!不要再打击我的信心了!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 2
支持
分享
最新回复 (8)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
Armadillo1的脱壳工具很少能成功脱壳的

用Ollydbg + 你的努力
2004-7-13 00:24
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
但是现在的 Armadill 总是很难懂呀!能不能给个初级水平的教程上来哦 fly哥哥!
2004-7-13 00:30
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
4
坛子里很多Armadill的脱壳教程
2004-7-13 00:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你确定是1.xx-2.xx吗?
2004-7-13 01:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
同样遇到这种上壳,还没搞懂
2004-8-8 18:17
0
雪    币: 93908
活跃值: (200199)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
2004-8-8 19:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这方面的资料太少了
能不能多给一点
谢了
2004-8-8 19:23
0
雪    币: 93908
活跃值: (200199)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
用OD脱DEDE的Armadillo 1.xx - 2.xx壳

   
  
作者 正文
lzqgj

时间: 2004-2-02 周一, 下午11:06    标题: 用OD脱DEDE的Armadillo 1.xx - 2.xx壳   

--------------------------------------------------------------------------------

用OD脱DEDE的Armadillo 1.xx - 2.xx壳
程序名称:DeDe2.50
下载地址:可能已经很少有了,都升级到3.5了
破解工具:OD,PEID,ImportRec
破解平台:WinXP

前言:
前段时间破一个Delphi程序,用到DeDe,但提示输入密码,我哪有?SHIT!只好拿它来开刀。开工!正好有关Armadillo的文章较少,来一篇凑个热闹,不当之处请指正。

第一步、跳过调试器检查:
先IsDebuggerPresent插件隐藏OD,然后载入DEDE,忽略所有异常。
F9运行,程序提示有Debugger运行,点击OK后退出。看看在什么地方可以跳过NAG,故点击前BP DestroyWindow,然后点击OK,程序中断,CTRL+F9返回到程序
003E3247  CALL DWORD PTR DS:[3E64A8]               ; USER32.DestroyWindow
003E324D  MOV EAX,ESI                              --->在这
继续按Ctrl+F9返回直到如下代码:
003E088A  JE SHORT 003E08CD                        --->可以跳过NAG!
...........................
003E08B5  ADD ESP,28
003E08B8  PUSH EAX
003E08B9  CALL 003E328D                            --->CALL NAG
003E08BE  MOV EAX,DWORD PTR DS:[3F328C]            --->返回到这,向上看!
003E08C3  ADD ESP,0C
003E08C6  XOR DWORD PTR DS:[EAX+74],3366
003E08CD  JMP SHORT 003E08D2
注意在003E088A处可以跳过。重来一遍,下G 3E088A,提示无效地址。原来这地址是程序运行动态后生成的。只好让程序先运行一会在中断下来下断点。因为Armadillo壳有页保护,故BP VirtualProtect,F9运行,中断后下G 3E088A,程序再次中断,改变标志位令其强行跳转,然后Ctrl+F9返回,并将EAX值改为0,程序将往下运行,出现过期提示,要求输入注册码。

第二步、挫败注册要求:
要注册码?都有这玩意还要Cracker干吗?好,继续BP DestroyWindow,什么也不用输入,点Cancel,中断后三次CTRL+F9返回到如下代码:
003DCB24  CALL 003D80DF                            --->CALL NAG
003DCB29  MOVZX EAX,AL                             --->返回到此,明显是否注册的标志,改为1
003DCB2C  TEST EAX,EAX
003DCB2E  JNZ SHORT 003DCB38
至此程序能正常运行了,但工作还远远没有结束,你总不希望每次都用OD载入来运行程序吧?

第三步、避开修改文件头:
有文章说Armadillo会修改文件头,但没有具体说明怎么修改,怎么避开。看了书中Armadillo脱壳的文章,仍一知半解,没办法,只好恶补PE文件格式,总算明白了Armadillo修改文件头的原理。为了这个及修复IAT,花了差不多三天时间。原来PE文件有个PE标志,这里就是PE文件头,包含PE文件重要信息。而在程序起始代码+3C的地方(即40003C)总是指向PE标志的地址,用Winhex打开一个程序就会发现规律。Armadillo将会修改40003C处的数据,使其指向错误地址,并将原地址+6处的Section数目改变,脱壳后的程序自然就会运行不了,甚至使一些脱壳程序无法DUMP。
下断点BP VirtualProtect,我们希望在在Armadillo去掉页保护准备修改文件头时中断下来。F9运行,注意观察堆栈数据,这样就不用数中断次数了。几十次中断后到堆栈数据如下时:
0012BFE8   003E1063  /CALL 到 VirtualProtect 来自 003E1061
0012BFEC   00400000  |Address = Dede.00400000        --->页保护地址
0012BFF0   00000040  |Size = 40 (64.)                --->长度
0012BFF4   00000004  |NewProtect = PAGE_READWRITE    --->解除保护,可读写   
0012BFF8   0012C014  \pOldProtect = 0012C014
这里解除保护,不过还不是修改文件头的地方,估计这里只是还原代码。继续F9运行,中间还会中断,不过是恢复保护。直到再次堆栈数据为:
0012BFE8   003E10B9  /CALL 到 VirtualProtect 来自 003E10B7
0012BFEC   00400000  |Address = Dede.00400000
0012BFF0   00000040  |Size = 40 (64.)
0012BFF4   00000004  |NewProtect = PAGE_READWRITE
0012BFF8   0012C014  \pOldProtect = 0012C014
CTRL+F9返回到:
003E10B7  CALL ESI                                    --->Call VirtualProtect
003E10B9  PUSH EAX                                    --->返回到此
003E10BA  NOT EAX
F8单步跟踪,直到:
003E1100  SUB EBX,EDI
003E1102  ADD DWORD PTR DS:[EAX+3C],EBX               --->EAX=400000,修改文件头40003C
原值为00000040,即PE标志地址为400040,加EBX后就错误了。将EBX修改为0,继续F8单步跟踪,注意VirtualProtect保护的地址(应到400040了),到:
003E1185  ADD WORD PTR DS:[EDI+6],AX                  --->EDI=400040,修改文件头的Section数目
将AX修改为0,至此击败了对文件头的修改。

第四步、寻找OEP并DUMP程序:
CTRL+F9几次返回到如下代码:
008116BA  MOV DWORD PTR SS:[EBP-1C],EAX
008116BD  PUSHAD
008116BE  XOR EAX,EAX
008116C0  JNZ SHORT Dede.008116C4
008116C2  JMP SHORT Dede.008116D9
008116C4  JMP SHORT Dede.008116F9
以下在OD中显示乱码,应该容易找到的。OEP就快到了,一定要F8慢慢跟踪。到出现第一个Call [******]时跟入(否则程序)运行,应该是在:
008117C0  CALL DWORD PTR DS:[8520D4]                  --->F7跟入
继续F8单步跟踪到第一个CALL EDI处,在
003E2191  CALL EDI                                    --->EDI=00809001
这里EDI本来是Armadillo加壳程序的OEP地址,但这个明显不是,F7跟入进去看看。
00809001  PUSHAD
00809002  JMP Dede.00809444
继续F8单步跟踪,注意花指令,并在一些循环处直接在下一代码F4跳出循环。如:
0080945D  CALL Dede.00809476                          --->花指令
F7进入,否则程序运行。
0080955F  CMP EBX,DFAEE568
00809565  JNZ Dede.008094AE                           --->循环
0080956B  MOV BX,AX                                   --->在此处F4跳出,
程序最后又跳回到
0080900E  MOV EBX,Dede.00443930
00809013  ADD EBX,EBP
00809015  SUB EBX,DWORD PTR SS:[EBP+443FD0]
到这里感觉象是进了另一个壳,似乎是ASPACK,继续F8跟踪。要想快,可以向下翻页,直到看到:
008093AA  POPAD
008093AB  JNZ SHORT Dede.008093B5
008093AD  MOV EAX,1
008093B2  RETN 0C
008093B5  PUSH 0                                       --->这段是典型的ASPACK壳特征。
008093BA  RETN
在8093B5处F4,代码变化为:
008093B5  PUSH Dede.0051FE18                           --->Thank God, OEP!!!
008093BA  RETN
F8两次到51FE18,到达OEP。用OEDUMP插件DUMP程序。

第五步、获得正确的输入表:
因为壳会加密IAT,DUMP出的程序无法运行,还要修复IAT。运行ImportRec,在程序列表中选择DEDE.EDE,OEP填11FE18(51FE18-400000=11FE18),点IAT AutoSearch,Get Import获得输入表,有很多无效指针。查看其中任何一个,如:
RVA: 0012F1B0  ptr 003CA9E7
表示在RVA为0012F1B处为无效指针,指向003CA9E7,明显是错误的。
重新运行程序,这次我们先在OD的DUMP窗口中显示52F1B0(52F1B0-400000=12FB10)处的内容,按以上步骤运行程序,看什么时候会被变成3CA9E7。发现是在第三步之后壳还原输入表并加密输入表。
再次运行程序,并在第三步后停下,在DUMP窗口中52F1B0处(或往前一点)右键下内存写入断点,F9运行直到中断两次。第一次中断是还原数据,第二次才是加密。
此时程序在一个循环中,还会有其它API函数还原、加密。所以继续单步跟踪,看看程序什么时候会获得API函数地址。注意API函数的地址一般是77******,观察EAX的值。到:
008092F6  CALL DWORD PTR SS:[EBP+444AFC]                 
008092FC  TEST EAX,EAX                     --->EAX=77E577EF,kernel32.InterlockedIncrement
上面的那个CALL就是获得API地址的,某些重要的API会在里面被跳过,因而无法获得正确地址。再次来到8092F6时F7跟入,F8跟踪,注意在一些循环处下一代码F4跳出循环。到:
003C7146  PUSH EBX                                 ; Dede.0071DC62
003C7147  XCHG EAX,EDI
003C7148  XCHG BX,BX
003C714B  XCHG EAX,EDI
003C714C  XOR EBX,EBX
003C714E  TEST WORD PTR SS:[EBP+E],0FFFF
003C7154  JNZ SHORT 003C7159
003C7156  MOV EBX,DWORD PTR SS:[EBP+C]
003C7159  PUSH EDI
003C715A  CALL DWORD PTR DS:[3E60C4]               ; kernel32.GetModuleHandleA
003C7160  CMP DWORD PTR SS:[EBP+8],EAX   
003C7163  JNZ SHORT 003C716C
003C7165  MOV ECX,3EA220
003C716A  JMP SHORT 003C71BE
003C716C  CMP DWORD PTR DS:[3EA830],EDI
003C7172  MOV ECX,3EA830
003C7177  JE 003C720F                               --->书上说这就是Magic Jump
重要函数会在此处不能跳过,就无法获得正确地址(书上也介绍找MAGIC JUMP有另一种方法,即可直接在GetModuleHandleA处设断,并辅以CTRL+F9观察返回代码,当返回以上代码并且将要还原IAT时就是Magic Jump了)。将其改为JMP 003C720F,然后G 51FE18,直接来到OEP处,再用ImportRec获得IAT,所有指针有效,FIX刚才DUMP出的程序,正常运行。

总结:
首先BP VTualProtect让程序中断,或直接F9运行,在出现NAG之前F12暂停,再G 3E088A。修改跳转方向并在RET处修改EAX值为0。
然后在出现注册窗口后下BP DestroyWindow断点,点Cancel中断后,CTRL+F9三次并将EAX返回值改为1。
G 3e1102,中断后将EBX值改为0;G 3E1185,中断后将AX值改为0。防止修改文件头。
G 3C7177,中断后将JE改为JMP,跳过IAT加密。
最后G 51FE18,在为OEP处DUMP程序并用ImportRec修复IAT。

最后一点说明:我这里如果先载入DEDE再隐藏OD,程序会退出,用FLYOBG可以不被检测到,但下BP DestroyWindow时程序不会中断,而查看断点明明已经有了。希望FLY兄能看看是怎么回事。

感谢各位观众有耐心看完。
2004-8-8 19:27
0
游客
登录 | 注册 方可回帖
返回
//