首页
社区
课程
招聘
[旧帖] [原创]铁甲脱壳 0.00雪花
发表于: 2010-10-23 12:43 1622

[旧帖] [原创]铁甲脱壳 0.00雪花

2010-10-23 12:43
1622
铁甲2.01与JDpack1.01脱壳简述

    铁甲和JDpack是由中国人姜东开发的加壳软件。随着版本的升级程序的易用
性得到了用户的信赖,尽管加壳技术并不成熟。比方说他自身的加密,铁甲2.01
软件,只要把系统时间调到2001年7月1日以前,就能正常使用。

    通过对由他们加壳的程序的跟踪发现,在铁甲和JDpack加壳的程序上存在着
对调试工具的防范措施,但是使用的技术很简单。两个软件原理基本相同,但是
代码和方法可能有所不同,下面以铁甲2.01来说一下。
=========================================================
    使用铁甲加壳windows自带的notepad.exe,然后调试分析:
    启动trw2000,然后载入notepad.exe,程序被拦截到TRW2000领域,开始使用
F8键继续跟踪,一直跟踪到如下代码:
0167:0040D04B 32C3             XOR      AL,BL
0167:0040D04D 8806             MOV      [ESI],AL
0167:0040D04F 889D00244000     MOV      [EBP+00402400],BL
0167:0040D055 46               INC      ESI   //--下命令G 40D058
0167:0040D056 E2EB             LOOP     0040D043  //---循环
0167:0040D058 9C               PUSHF    //---光标跳到这里,代码发生变化
0167:0040D059 46               INC      ESI
0167:0040D05A B074             MOV      AL,74
0167:0040D05C 7501             JNZ      0040D05F
0167:0040D05E 07               POP      ES
0167:0040D05F F8               CLC     
0167:0040D060 5D               POP      EBP
0167:0040D061 684A0A0A81       PUSH     DWORD 810A0A4A
0167:0040D066 347D             XOR      AL,7D

======================变化后的代码
0167:0040D04B 32C3             XOR      AL,BL
0167:0040D04D 8806             MOV      [ESI],AL
0167:0040D04F 889D00244000     MOV      [EBP+00402400],BL
0167:0040D055 46               INC      ESI
0167:0040D056 E2EB             LOOP     0040D043
0167:0040D058 9C               PUSHF    //---光标在这里
0167:0040D059 58               POP      EAX
0167:0040D05A F6C401           TEST     AH,01
0167:0040D05D 7406             JZ       0040D065  //--R FL Z跳过,否则
0167:0040D05F FFA535224000     JMP      NEAR [EBP+00402235] //执行这个非法
0167:0040D065 8BB549224000     MOV      ESI,[EBP+00402249] //跳到这里

=========================================================

F10开始继续跟踪,应该经过如下代码段3次,不要理会,当过了 CALL  0040D3F4
3次后,要小心了,因为程序的反跟踪代码就在这里开始第一次检查:

0167:0040D0A9 F3A4             REP MOVSB
0167:0040D0AB 8BB529224000     MOV      ESI,[EBP+00402229]
0167:0040D0B1 8BB84D224000     MOV      EDI,[EAX+0040224D]
0167:0040D0B7 03FA             ADD      EDI,EDX
0167:0040D0B9 57               PUSH     EDI
0167:0040D0BA 56               PUSH     ESI
0167:0040D0BB E834030000       CALL     0040D3F4  //循环3次后,F10仔细跟踪
0167:0040D0C0 5E               POP      ESI
0167:0040D0C1 5F               POP      EDI
0167:0040D0C2 58               POP      EAX
0167:0040D0C3 5E               POP      ESI
==========================================================
过来以后,发现一段代码:
0167:0040D1B6 EB00             JMP      SHORT 0040D1B8
0167:0040D1B8 83C602           ADD      ESI,BYTE +02
0167:0040D1BB E2B8             LOOP     0040D175
0167:0040D1BD EB9E             JMP      SHORT 0040D15D
0167:0040D1BF E8FE010000       CALL     0040D3C2 //--ANTI-Debug ,F8跟进去
0167:0040D1C4 8B9505244000     MOV      EDX,[EBP+00402405]
0167:0040D1CA 8BB539224000     MOV      ESI,[EBP+00402239]
0167:0040D1D0 03F2             ADD      ESI,EDX
==========================
F8跟进去到了这里,典型的ANTI-Debug的基本模式:
0167:0040D3BF C20400           RET      04
0167:0040D3C2 8CC8             MOV      EAX,CS
0167:0040D3C4 50               PUSH     EAX
0167:0040D3C5 0F014C24FE       SIDT     [ESP-02] //----利用IDT来检测,F8继续
0167:0040D3CA 5E               POP      ESI
0167:0040D3CB 83C618           ADD      ESI,BYTE +18
0167:0040D3CE 8B4E04           MOV      ECX,[ESI+04]
0167:0040D3D1 668B0E           MOV      CX,[ESI]
0167:0040D3D4 8B560C           MOV      EDX,[ESI+0C]
0167:0040D3D7 668B5608         MOV      DX,[ESI+08]
0167:0040D3DB 8B4614           MOV      EAX,[ESI+14]
0167:0040D3DE 668B4610         MOV      AX,[ESI+10]
0167:0040D3E2 2BC2             SUB      EAX,EDX
0167:0040D3E4 2BD1             SUB      EDX,ECX //--注意这里EAX=10
0167:0040D3E6 2BC2             SUB      EAX,EDX //--为使结果为0,可以使用命令R修改EDX=10
0167:0040D3E8 7409             JZ       0040D3F3 //结果为0就跳走,不为0就蓝屏
                                // 如果不修改EDX,可以在这里R FL Z,让程序
                                // 躲避过第一次检测
0167:0040D3EA 8B44241C         MOV      EAX,[ESP+1C]
0167:0040D3EE 03C2             ADD      EAX,EDX
0167:0040D3F0 FFD0             CALL     EAX
0167:0040D3F2 C3               RET     
0167:0040D3F3 C3               RET     
0167:0040D3F4 60               PUSHA   
=========================================================
   好了躲过了第一次检测,程序还有第二次检测,同样是调用CALL     0040D3C2,所以F8继续
到以下代码:
0167:0040D240 53               PUSH     EBX
0167:0040D241 FFB541224000     PUSH     DWORD [EBP+00402241]
0167:0040D247 FF9580234000     CALL     NEAR [EBP+00402380]
0167:0040D24D 8907             MOV      [EDI],EAX
0167:0040D24F 83854522400004   ADD      DWORD [EBP+00402245],BYTE +04 //从这里G 0040D266
0167:0040D256 EBAB             JMP      SHORT 0040D203
0167:0040D258 83C614           ADD      ESI,BYTE +14
0167:0040D25B 8B9505244000     MOV      EDX,[EBP+00402405]
0167:0040D261 E96CFFFFFF       JMP      0040D1D2
0167:0040D266 E857010000       CALL     0040D3C2  //跳到检测口,F8跟进去,如同上一个检测处理
0167:0040D26B 83BD7D22400001   CMP      DWORD [EBP+0040227D],BYTE +01
0167:0040D272 7505             JNZ      0040D279
0167:0040D274 E9F9000000       JMP      0040D372
0167:0040D279 8DB5A5224000     LEA      ESI,[EBP+004022A5]
======================
处理好第二个以后,程序出口到了代码:
0167:0040D266 E857010000       CALL     0040D3C2 //检测成功,程序执行下一行
0167:0040D26B 83BD7D22400001   CMP      DWORD [EBP+0040227D],BYTE +01 // 与01比较,
0167:0040D272 7505             JNZ      0040D279 // 程序不能跳,跳了就非法
0167:0040D274 E9F9000000       JMP      0040D372 //----跳到程序的OEP入口---->>>>>
0167:0040D279 8DB5A5224000     LEA      ESI,[EBP+004022A5]
0167:0040D27F 56               PUSH     ESI
0167:0040D280 FF9588234000     CALL     NEAR [EBP+00402388]
0167:0040D286 83F800           CMP      EAX,BYTE +00
0167:0040D289 7408             JZ       0040D293
0167:0040D28B 8985A1224000     MOV      [EBP+004022A1],EAX
0167:0040D291 EB07             JMP      SHORT 0040D29A
=======================
   成功的到达程序OEP入口处: 典型的 JMP EAX

0167:0040D370 EB00             JMP      SHORT 0040D372
0167:0040D372 8B9505244000     MOV      EDX,[EBP+00402405] //---跳到这里
0167:0040D378 8B8535224000     MOV      EAX,[EBP+00402235]
0167:0040D37E 03C2             ADD      EAX,EDX
0167:0040D380 5D               POP      EBP
0167:0040D381 FFE0             JMP      EAX  //----程序的正确入口! 这里pedump出解压的文件
0167:0040D383 55               PUSH     EBP
0167:0040D384 8BEC             MOV      EBP,ESP
0167:0040D386 50               PUSH     EAX
==========================================================
完成脱壳了。在JMP EXA上F10一次,程序直接从NOTEPAD.hmjd跳到NOTEPAD.text,代码如下:
0167:004010C0 25322E3264       AND      EAX,64322E32
0167:004010C5 0000             ADD      [EAX],AL
0167:004010C7 000D0A000055     ADD      [5500000A],CL
0167:004010CD 8BEC             MOV      EBP,ESP
0167:004010CF 83EC44           SUB      ESP,BYTE +44
0167:004010D2 56               PUSH     ESI
0167:004010D3 FF15E4634000     CALL     `KERNEL32!GetCommandLineA`
0167:004010D9 8BF0             MOV      ESI,EAX
0167:004010DB 8A00             MOV      AL,[EAX]
0167:004010DD 3C22             CMP      AL,22
0167:004010DF 751B             JNZ      004010FC
0167:004010E1 56               PUSH     ESI
0167:004010E2 FF15F4644000     CALL     `USER32!CharNextA`

   呵呵,验证无误,OK,该休息了..
=========================================================
    在本机器上Jdpe 2.01的入口是10CC,用TRW2000脱出后,就可以修复ITA,完成脱壳和修
复工作。
   接着看了看JDpack的壳, 大致情形一样,但是我没有跟到他的ANTI-Debug,在这里要说的
是跟踪的时候注意几个循环和跳转的处理,比较累了,得休息了,明天继续研究写个jdpack的
                                                                              
==========================================================
                               JDPack 1.01脱壳

    由于没有跟踪到JDPack的Anti-Debug代码,加上迷惑处很多,所以就直接使用trw2000来

动态脱壳。

    首先使用冲击波检测到程序入口为40DC50,所以在TRW2000中下断点BPX 40DC50,然后运

行被加壳的程序,成功拦截以后,PEDUMP出解压文件。

    然后,启动加壳后的程序,然后启动ImportREC,从程序进程中选择被加壳的程序,然后

手动输入入口点DC50,自动搜索ITA表内容,然后获取输入表,发现所有的函数都有效,直接

修复脱壳出来的程序,运行,完全正常。

    这里要提一点:如果在中断后,使用suspend命令挂起TRW2000,然后使用Procdump来脱

出文件,则文件可以直接运行,但是,无法反编译后看到字串。如果尝试使用ImportREC来

修复ITA,程序就会非法,还得去分析非法原因,所以不如直接使用TRW2000脱壳出来修复来

的快和好。而且脱出来的程序也就大了4K左右。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
铁甲脱壳  相关附件 软件   

急求“雪碧” ......
上传的附件:
2010-10-23 12:52
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
3
http://www.pediy.com/bbshtml/BBS5/pediy50281.htm
2010-10-28 18:07
0
游客
登录 | 注册 方可回帖
返回
//