首页
社区
课程
招聘
[原创] 手脱未知壳
发表于: 2010-1-17 02:13 5622

[原创] 手脱未知壳

2010-1-17 02:13
5622
【文章标题】: 手脱未知壳
【文章作者】: lovebird/爱鸟
【作者邮箱】: lovebird_ustc#126.com
【作者QQ号】: 1282260064
【软件名称】: 记事本
【软件大小】: 脱壳前39.6KB 脱壳后120KB
【下载地址】: 附件中
【加壳方式】: 未知壳
【保护方式】: 未知壳加壳
【编写语言】: VC++
【使用工具】: OD dump插件 LORDPE Irec
【操作平台】: XPsp3+VM6.0
【软件介绍】: 未知壳加壳的XP记事本
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  还是上次淘来的那堆记事本。Peid一扫,Nothing found *,换成Hardcore,还是一样,不管了。
  OD不躲不藏,忽略一切异常,尤其注意忽略int 3异常。
  0101339E >  55              PUSH EBP
  0101339F    89E5            MOV EBP,ESP
  010133A1    6A FF           PUSH -1
  010133A3    53              PUSH EBX
  010133A4    56              PUSH ESI
  010133A5    57              PUSH EDI
  010133A6    58              POP EAX
  010133A7    58              POP EAX
  010133A8    5B              POP EBX
  010133A9    58              POP EAX
  010133AA    5D              POP EBP
  010133AB    60              PUSHAD
  010133AC    E8 1DFEFFFF     CALL 19.010131CE                         ; 第一次F8跑飞 遂F7跟入
  010133B1    C3              RETN
  
  注意010133AC的那个call,貌似esp定律不能用,因为跟进去后,使用int 3断点进入的OEP。这个call第一次
  跟的时候F8,程序跑飞。前面的那堆花指令直接无视,这个壳花指令主要是靠pushpop对。直接F7进去。
  010131CE    55              PUSH EBP                                 ; F7过来 停在这儿
  010131CF    8BEC            MOV EBP,ESP
  010131D1    83C4 D4         ADD ESP,-2C
  010131D4    53              PUSH EBX
  010131D5    56              PUSH ESI
  010131D6    57              PUSH EDI
  010131D7    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
  010131DA    83C0 0C         ADD EAX,0C
  010131DD    8B00            MOV EAX,DWORD PTR DS:[EAX]
  010131DF    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
  010131E2    837D E4 00      CMP DWORD PTR SS:[EBP-1C],0
  010131E6    75 08           JNZ SHORT 19.010131F0
  010131E8    E8 ADFFFFFF     CALL 19.0101319A
  010131ED    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
  010131F0    E8 C1FEFFFF     CALL 19.010130B6
  010131F5    8B10            MOV EDX,DWORD PTR DS:[EAX]
  010131F7    0355 E4         ADD EDX,DWORD PTR SS:[EBP-1C]
  010131FA    8955 DC         MOV DWORD PTR SS:[EBP-24],EDX
  没什么问题,直接F8跟下去。注意下面两个循环,F4的位置给出来了:
  0101326A    4E              DEC ESI
  0101326B  ^ 75 DD           JNZ SHORT 19.0101324A
  0101326D    6A 04           PUSH 4                                   ; F4
  0101326F    68 00100000     PUSH 1000
  01013274    8B45 DC         MOV EAX,DWORD PTR SS:[EBP-24]
  01013277    8B40 0C         MOV EAX,DWORD PTR DS:[EAX+C]
  =============================================================================
  0101330D  ^\75 C4           JNZ SHORT 19.010132D3
  0101330F    8BF3            MOV ESI,EBX
  01013311    833E 00         CMP DWORD PTR DS:[ESI],0
  01013314  ^ 75 88           JNZ SHORT 19.0101329E
  01013316    8B45 DC         MOV EAX,DWORD PTR SS:[EBP-24]            ; 此处F4 稍稍延迟
  01013319    8B40 10         MOV EAX,DWORD PTR DS:[EAX+10]            ; 将OEP传入
  0101331C    0345 E4         ADD EAX,DWORD PTR SS:[EBP-1C]
  0101331F    8B55 14         MOV EDX,DWORD PTR SS:[EBP+14]
  01013322    83C2 20         ADD EDX,20                               ; 注意EAX乃是OEP
  01013325    8902            MOV DWORD PTR DS:[EDX],EAX               ; 存入[edx]
  在0101331C时候,看一眼寄存器表:
  EAX 0000739D   //此乃OEP的偏移
  ECX 7C937719 ntdll.7C937719
  EDX 7C99E178 ntdll.7C99E178
  EBX 002F0B71
  ESP 0006FF64
  EBP 0006FF9C
  ESI 002F0B71
  EDI 010012B0 19.010012B0
  EIP 0101331C 19.0101331C
  继续F8一下,此时的寄存器表:
  EAX 0100739D 19.0100739D        //这个就是OEP 记下来
  ECX 7C937719 ntdll.7C937719
  EDX 7C99E178 ntdll.7C99E178
  EBX 002F0B71
  ESP 0006FF64
  EBP 0006FF9C
  ESI 002F0B71
  EDI 010012B0 19.010012B0
  EIP 0101331F 19.0101331F
  现在已经找到OEP了,下一步就是找适当的dump时机:
  继续F8:
  01013327    68 00800000     PUSH 8000
  0101332C    6A 00           PUSH 0
  0101332E    8B45 D4         MOV EAX,DWORD PTR SS:[EBP-2C]
  01013331    50              PUSH EAX
  01013332    FF55 EC         CALL DWORD PTR SS:[EBP-14]               ; kernel32.VirtualFree
  01013335    8B55 E4         MOV EDX,DWORD PTR SS:[EBP-1C]
  01013338    8B42 3C         MOV EAX,DWORD PTR DS:[EDX+3C]
  0101333B    0345 E4         ADD EAX,DWORD PTR SS:[EBP-1C]
  0101333E    83C0 04         ADD EAX,4
  01013341    8BD8            MOV EBX,EAX
  01013343    83C3 14         ADD EBX,14
  01013346    8D45 E0         LEA EAX,DWORD PTR SS:[EBP-20]
  01013349    50              PUSH EAX
  0101334A    6A 40           PUSH 40
  0101334C    68 00100000     PUSH 1000
  01013351    52              PUSH EDX
  其实看到那个push 8000 估计是VirtualFree,继续走下去,到了这儿:
  0101338E    8950 04         MOV DWORD PTR DS:[EAX+4],EDX
  01013391    CC              INT3                                     ; 此处有int3 不必再跟进去
  01013392    5F              POP EDI
  01013393    5E              POP ESI
  01013394    5B              POP EBX
  01013395    8BE5            MOV ESP,EBP
  01013397    5D              POP EBP
  01013398    C2 2000         RETN 20
  在01013391那个int 3,目的是陷入系统内核,然后运行程序,不需要再跟了。
  现在我们下断点he 010739D
  Shift+F9运行:
  来到这儿:
  0100739D      6A            DB 6A                                    ;  CHAR 'j'
  0100739E      70            DB 70                                    ;  CHAR 'p'
  0100739F      68            DB 68                                    ;  CHAR 'h'
  010073A0      98            DB 98
  010073A1      18            DB 18
  010073A2      00            DB 00
  010073A3      01            DB 01
  010073A4      E8            DB E8
  010073A5      BF            DB BF
  010073A6      01            DB 01
  010073A7      00            DB 00
  010073A8      00            DB 00
  010073A9      33            DB 33                                    ;  CHAR '3'
  010073AA      DB            DB DB
  010073AB      53            DB 53                                    ;  CHAR 'S'
  010073AC      8B            DB 8B
  010073AD      3D            DB 3D                                    ;  CHAR '='
  
  Ctrl+A:
  0100739D   .  6A 70         PUSH 70
  0100739F   .  68 98180001   PUSH 19.01001898
  010073A4   .  E8 BF010000   CALL 19.01007568
  010073A9   .  33DB          XOR EBX,EBX
  010073AB   .  53            PUSH EBX                                 ; /pModule => NULL
  010073AC   .  8B3D CC100001 MOV EDI,DWORD PTR DS:[10010CC]           ; |kernel32.GetModuleHandleA
  010073B2   .  FFD7          CALL EDI                                 ; \GetModuleHandleA
  010073B4   .  66:8138 4D5A  CMP WORD PTR DS:[EAX],5A4D
  010073B9   .  75 1F         JNZ SHORT 19.010073DA
  010073BB   .  8B48 3C       MOV ECX,DWORD PTR DS:[EAX+3C]
  010073BE   .  03C8          ADD ECX,EAX
  010073C0   .  8139 50450000 CMP DWORD PTR DS:[ECX],4550
  010073C6   .  75 12         JNZ SHORT 19.010073DA
  010073C8   .  0FB741 18     MOVZX EAX,WORD PTR DS:[ECX+18]
  010073CC   .  3D 0B010000   CMP EAX,10B
  010073D1   .  74 1F         JE SHORT 19.010073F2
  010073D3   .  3D 0B020000   CMP EAX,20B
  
  此时dump可以两种方法
  ①运用OD的dump插件,选择方式一,直接dump就能运行
  ②LordPE,但是注意设置“从文件获得PE文件头”勾除,然后dump,不能运行。Irec修复,则可以运行。
  小软件推荐第一种,大软件推荐第二种。
  
--------------------------------------------------------------------------------
【经验总结】
  秒脱方法:
    bp VirtualFree 然后Shift+F9 断下后F2取消断点
    he [edx] ,shift+F9 到达OEp 照本文方法dump即可
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年01月17日 2:14:47

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
拜读了。。。
2010-1-17 16:18
0
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可否解释一下“OD不躲不藏,忽略一切异常,尤其注意int 3异常”这句话?
2010-1-17 16:20
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
不需要去除OD的调试器标识和其他隐藏手段,异常选项卡勾选“忽略一切异常”
2010-1-17 16:59
0
游客
登录 | 注册 方可回帖
返回
//