通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
用OD脱DEDE的Armadillo 1.xx - 2.xx壳
责任编辑:酷酷の鱼   更新日期:2008-4-28
 

来源:安全中国

前言: 
前段时间破一个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兄能看看是怎么回事。

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 最近更新
    固顶文章 企业网络组建与维护班正式开课
    普通文章 瑞星公司04月28日发布 每日计算机病毒及木马播报
    普通文章 黑客借windows补丁找漏洞
    普通文章 天才黑客释放后出任IT顾问
    普通文章 6月停售XP遭抵制 鲍尔默:将考虑延长XP寿命
    普通文章 专家:Windows版QuickTime存在零日攻击漏洞
    普通文章 WindowsUpdate需改进 30秒开发出攻击代码
    普通文章 假期要特别防范U盘杀手、网游大盗等病毒
    普通文章 用OD脱DEDE的Armadillo 1.xx - 2.xx壳
    普通文章 最近比较流行的数据库挂马
    热门文章
    普通文章美一黑客承认侵入25万计算机 可能面临60年监禁
    普通文章ISBS:恶意软件感染率降低60%
    普通文章iPhone浏览器存漏洞 可能导致崩溃
    普通文章黑客利用社会工程学偷资料敲诈被判刑
    普通文章病毒预警:木马情书"风花雪月"背后暗藏杀机
    普通文章计算机新病毒已超过36万种 同比增长了5倍
    普通文章黑客利用木马程序偷业务资料敲诈被判4年
    普通文章埃森哲:12%被访者“借用”他人Wi-Fi信号
    普通文章104种清除木马方法之一
    普通文章104种清除木马方法之二
    精彩专题