首页 > 逆向调试 > Armadillo(穿山甲)简单脱壳处理

Armadillo(穿山甲)简单脱壳处理

Armadillo,理论上来说,应该翻译成“犰狳”,而不是“穿山甲”;不过关于壳方面很多人都把他叫做穿山甲。这里简单说一下处理的一个壳,只是穿山甲壳中的一种情况,仅供参考

OD下断点GetModuleHandleAPEID查克,一时“Armadillo 3.00a – 3.61 -> Silicon Realms Toolworks”,直接OD载入目标程序。用bp GetModuleHandleA+5进行下断点。为什么要在API后面加5呢?主要是防止穿山甲从中作梗,另外调试的时候注意通过插件来隐藏OD。每次断下之后都要接着继续运行,如果发现某一次经过相对很长时间才断下来,则说明来到了目标了。到这里之后,因为是系统的领空,所以要选择返回到用户代码。同时通过bc GetModuleHandleA+5来取消原来下的断点。回到用户之后的代码:

00AF532A    50              PUSH EAX
00AF532B    FF15 A450B100   CALL DWORD PTR DS:[B150A4]       ; kernel32.GetModuleHandleA
00AF5331    8B0D 60D8B100   MOV ECX,DWORD PTR DS:[B1D860]
00AF5337    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
00AF533A    A1 60D8B100     MOV EAX,DWORD PTR DS:[B1D860]
00AF533F    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
00AF5342    75 16           JNZ SHORT 00AF535A
00AF5344    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
00AF534A    50              PUSH EAX
00AF534B    FF15 B850B100   CALL DWORD PTR DS:[B150B8]      ; kernel32.LoadLibraryA
00AF5351    8B0D 60D8B100   MOV ECX,DWORD PTR DS:[B1D860]
00AF5357    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
00AF535A    A1 60D8B100     MOV EAX,DWORD PTR DS:[B1D860]
00AF535F    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
00AF5362    0F84 AD000000   JE 00AF5415		         ;Magic Jump,改为JMP
00AF5368    33C9            XOR ECX,ECX
00AF536A    8B03            MOV EAX,DWORD PTR DS:[EBX]
00AF536C    3938            CMP DWORD PTR DS:[EAX],EDI
00AF536E    74 06           JE SHORT 00AF5376
00AF5370    41              INC ECX

说明一下:OD调试要把异常都忽略掉,否则会很麻烦。
OD调试选项-忽略所有异常

在上面的代码中可以看到一个比较长的JE跳转,这个就是Magic Jump了,需要把JE改成JMP。然后继续下断点:bp GetCurrentThreadId。
然后跟上一个GetModuleHandleA断点一样,经过几次短的间隔断点之后会有一次长的间隔,经过这个间隔之后返回到用户代码,并删除GetCurrentThreadId断点,代码如下:

00B0CF2D    A3 F018B200     MOV DWORD PTR DS:[B218F0],EAX	;断在这里
00B0CF32    E8 2487FEFF     CALL 00AF565B
00B0CF37    6A 00           PUSH 0
00B0CF39    E8 4BD9FEFF     CALL 00AFA889
00B0CF3E    59              POP ECX
00B0CF3F    E8 7D39FFFF     CALL 00B008C1
00B0CF44    8BF8            MOV EDI,EAX
00B0CF46    A1 E018B200     MOV EAX,DWORD PTR DS:[B218E0]
00B0CF4B    8B48 74         MOV ECX,DWORD PTR DS:[EAX+74]
00B0CF4E    3348 5C         XOR ECX,DWORD PTR DS:[EAX+5C]
00B0CF51    3308            XOR ECX,DWORD PTR DS:[EAX]
00B0CF53    03F9            ADD EDI,ECX
00B0CF55    8B0E            MOV ECX,DWORD PTR DS:[ESI]
00B0CF57    85C9            TEST ECX,ECX
00B0CF59    75 2E           JNZ SHORT 00B0CF89
00B0CF5B    8B78 5C         MOV EDI,DWORD PTR DS:[EAX+5C]
00B0CF5E    E8 5E39FFFF     CALL 00B008C1
00B0CF63    8B0D E018B200   MOV ECX,DWORD PTR DS:[B218E0]            ; gz_LibIn.00479258
00B0CF69    FF76 14         PUSH DWORD PTR DS:[ESI+14]
00B0CF6C    8B51 74         MOV EDX,DWORD PTR DS:[ECX+74]
00B0CF6F    FF76 10         PUSH DWORD PTR DS:[ESI+10]
00B0CF72    33D7            XOR EDX,EDI
00B0CF74    3311            XOR EDX,DWORD PTR DS:[ECX]
00B0CF76    FF76 0C         PUSH DWORD PTR DS:[ESI+C]
00B0CF79    03C2            ADD EAX,EDX
00B0CF7B    8B51 78         MOV EDX,DWORD PTR DS:[ECX+78]
00B0CF7E    3351 14         XOR EDX,DWORD PTR DS:[ECX+14]
00B0CF81    33D7            XOR EDX,EDI
00B0CF83    2BC2            SUB EAX,EDX
00B0CF85    FFD0            CALL EAX
00B0CF87    EB 25           JMP SHORT 00B0CFAE
00B0CF89    83F9 01         CMP ECX,1
00B0CF8C    75 22           JNZ SHORT 00B0CFB0
00B0CF8E    FF76 04         PUSH DWORD PTR DS:[ESI+4]
00B0CF91    FF76 08         PUSH DWORD PTR DS:[ESI+8]
00B0CF94    6A 00           PUSH 0
00B0CF96    E8 2639FFFF     CALL 00B008C1
00B0CF9B    50              PUSH EAX
00B0CF9C    A1 E018B200     MOV EAX,DWORD PTR DS:[B218E0]
00B0CFA1    8B48 78         MOV ECX,DWORD PTR DS:[EAX+78]
00B0CFA4    3348 5C         XOR ECX,DWORD PTR DS:[EAX+5C]
00B0CFA7    3348 14         XOR ECX,DWORD PTR DS:[EAX+14]
00B0CFAA    2BF9            SUB EDI,ECX
00B0CFAC    FFD7            CALL EDI	;下硬件执行断点
00B0CFAE    8BD8            MOV EBX,EAX
00B0CFB0    5F              POP EDI
00B0CFB1    8BC3            MOV EAX,EBX
00B0CFB3    5E              POP ESI
00B0CFB4    5B              POP EBX
00B0CFB5    C3              RETN

在代码的最后会看到一个CALL EDI的调用,对其下硬件执行断点,然后继续运行,会断在这里。接着F7跟进,就来到OEP了。

00434A94    55              PUSH EBP
00434A95    8BEC            MOV EBP,ESP
00434A97    6A FF           PUSH -1
00434A99    68 08D84300     PUSH 0043D808
00434A9E    68 844C4300     PUSH 00434C84                            ; JMP 到 msvcrt._except_handler3
00434AA3    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]
00434AA9    50              PUSH EAX
00434AAA    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00434AB1    83EC 68         SUB ESP,68
00434AB4    53              PUSH EBX
00434AB5    56              PUSH ESI
00434AB6    57              PUSH EDI
00434AB7    8965 E8         MOV DWORD PTR SS:[EBP-18],ESP
00434ABA    33DB            XOR EBX,EBX
00434ABC    895D FC         MOV DWORD PTR SS:[EBP-4],EBX
00434ABF    6A 02           PUSH 2
00434AC1    FF15 04A84300   CALL DWORD PTR DS:[43A804]               ; msvcrt.__set_app_type
00434AC7    59              POP ECX
00434AC8    830D 508F4400 F>OR DWORD PTR DS:[448F50],FFFFFFFF
00434ACF    830D 548F4400 F>OR DWORD PTR DS:[448F54],FFFFFFFF

接下来用LordPE修正映像大小并脱壳。(不要用OllyDbg脱壳,会卡死)。LordPE脱壳之后,要用ImportREC对导入表进行修复。修复时,注意剪切掉无效的指针。如果ImportREC提示空间不足不能添加节区,可以尝试另外下一个ImportREC试试。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> Armadillo(穿山甲)简单脱壳处理
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: 逆向调试 标签: , ,
  1. 2011年3月28日18:48 | #1

    我只用UPXShell压缩过exe、dll……
    你说为了保护软件不被破解,什么方式最好?

    [回复]

  2. 2011年3月28日21:39 | #2

    顶一个,我就快看不懂了。呵呵

    [回复]

  3. 2011年3月29日12:16 | #3

    @the5fire的技术博客
    呵呵,最近看的一点东西。逆向要先放一放了,要准备写简历了。

    [回复]

  4. 2011年3月29日12:17 | #4

    @C瓜哥
    弄一种强壳吧,或者用虚拟机保护。至于软件的注册算法,首先不可以明文比较,其次,算法要有深度,另外可以插一些花指令之类的东西混淆一下

    [回复]

  5. 笑熬浆糊4
    2013年1月15日01:27 | #5

    看不懂,断点都不会断! [em006]

    [回复]

    代码疯子 回复:

    @笑熬浆糊4, 就是bp命令方式

    [回复]