首页
社区
课程
招聘
[原创]手脱加花未知壳
发表于: 2010-1-15 04:06 5189

[原创]手脱加花未知壳

2010-1-15 04:06
5189
【文章标题】: 手脱加花未知壳
【文章作者】: lovebird/爱鸟
【作者邮箱】: lovebird_ustc#126.com
【作者QQ号】: 1282260064
【软件名称】: 加花壳后的记事本
【软件大小】: 脱前62.5KB 脱后84KB
【下载地址】: 附件中
【加壳方式】: 未知壳
【保护方式】: 修改壳加壳
【编写语言】: VC++
【使用工具】: PEtools OD  IREC
【操作平台】: XPsp3+vw6
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  还是上次从BST淘的那堆加壳笔记本 这次貌似情况麻烦点。
  Peid一扫,Nothing found *,换成Hardcore,是C.I Crypt V0.1 -> FearlesS。
  不管它,直接进去,OD不躲不藏,忽略一切异常。
  1.跟踪到了OEP
  004015DF >  85FF            TEST EDI,EDI                             ; 停在这儿 一堆花指令
  004015E1    56              PUSH ESI
  004015E2    81C3 00000000   ADD EBX,0
  004015E8    5E              POP ESI
  004015E9    2C 00           SUB AL,0
  004015EB    C0C3 40         ROL BL,40                                ; 移位常量超出 1..31 的范围
  004015EE    C0CA 38         ROR DL,38                                ; 移位常量超出 1..31 的范围
  004015F1    35 00000000     XOR EAX,0
  004015F6    F9              STC
  004015F7    F8              CLC
  004015F8    FC              CLD
  004015F9    90              NOP
  004015FA    68 20010000     PUSH 120
  004015FF    5D              POP EBP
  00401600    0BDB            OR EBX,EBX
  00401602    68 3BFAFFFF     PUSH -5C5
  00401607    5B              POP EBX
  00401608    90              NOP
  00401609    56              PUSH ESI
  0040160A    79 04           JNS SHORT 16.00401610
  0040160C    66:83EF 00      SUB DI,0
  00401610    5E              POP ESI
  00401611    C1F8 E0         SAR EAX,0E0                              ; 移位常量超出 1..31 的范围
  搂一眼代码,瞎了我的狗眼,一堆花指令。然后就是准备开始漫长的F8....
  不久,我们来到这儿:
  00401622    81FD 3BC9A79B   CMP EBP,9BA7C93B
  00401628    F9              STC
  00401629    EB 05           JMP SHORT 16.00401630
  0040162B    E9 27000000     JMP 16.00401657                          ; 来回跳的花指令
  00401630    E8 F6FFFFFF     CALL 16.0040162B                         ; 此call必须F7 否则.......程序飞掉
  00401635    55              PUSH EBP
  00401636    E8 1A000000     CALL 16.00401655
  0040163B    B7 05           MOV BH,5
  0040163D    DC5D 63         FCOMP QWORD PTR SS:[EBP+63]
  00401640    2D CAB62F2C     SUB EAX,2C2FB6CA
  00401645    1B87 FBD36220   SBB EAX,DWORD PTR DS:[EDI+2062D3FB]
  0040164B    EA 1F4F82E6 D23>JMP FAR 36D2:E6824F1F                    ; 远跳转
  第一次F8到00401630,结果出现:
  ---------------------------
  错误
  ---------------------------
  32 位可执行文件 'C:\Documents and Settings\MyVNN\桌面\tanghulu\Files\Files\16.EXE' 的格式错误或格式未知
  ---------------------------
  确定   
  ---------------------------
  点了确定之后,程序跑飞。
  只好Ctrl+F2重新来过。
  一路上不敢用F8,用了就死....一路F7到了这里:
  73FBE1F3    8BEC            MOV EBP,ESP
  73FBE1F5    81EC 98000000   SUB ESP,98
  73FBE1FB    A1 ECF1FE73     MOV EAX,DWORD PTR DS:[73FEF1EC]
  73FBE200    53              PUSH EBX
  73FBE201    68 4018FA73     PUSH 73FA1840                            ; ASCII "gdi32.dll"
  73FBE206    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX             ; 就是下面的call出现了“格式错误或格式未知”
  73FBE209    FF15 4811FA73   CALL DWORD PTR DS:[73FA1148]             ; kernel32.LoadLibraryA
  73FBE20F    33DB            XOR EBX,EBX
  73FBE211    3BC3            CMP EAX,EBX
  73FBE213    A3 2002FF73     MOV DWORD PTR DS:[73FF0220],EAX
  73FBE218    75 07           JNZ SHORT 73FBE221
  既然是LoadLibraryA导致的问题,我们再次Ctrl+F2(这需要运气和勇气......)
  重新来过后,下断点bp LoadLibraryA
  然后Shift+F9四次,弹出那个"格式错误或格式未知"的窗口。点“确定”,继续Shift+F9两次(我们一共进行了6次)
  搂一眼堆栈:
  0012FF9C   01013208  /CALL 到 LoadLibraryA 来自 16_1.01013206
  0012FFA0   01007B3A  \FileName = "WINSPOOL.DRV"
  0012FFA4   7C930228  ntdll.7C930228
  0012FFA8   0012FFD4
  0012FFAC   00000000
  0012FFB0   0012FFC4
  0012FFB4   004014F0
  0012FFB8   00000000
  0012FFBC   01000000  16_1.01000000
  0012FFC0   010130FF  16_1.010130FF
  0012FFC4   7C817077  返回到 kernel32.7C817077
  0012FFC8   01000000  16_1.01000000
  0012FFCC   FFFFFFFF
  0012FFD0   7FFDE000
  0012FFD4   80545BFD
  0012FFD8   0012FFC8
  0012FFDC   81A1EDA8
  0012FFE0   FFFFFFFF  SEH 链尾部
  0012FFE4   7C839AD8  SE处理程序
  0012FFE8   7C817080  kernel32.7C817080
  看样子 是要跳回去了。但是同时我发现一个大问题:此时居然代码跳到01007B3A的空间,而不是我们刚刚加载时候的
  0040XXXX空间,这种情况,有可能是重新创建进程(可参考我的Minke壳手脱),有可能是代码重定位(我是菜鸟,欢迎
  牛人们补充)。不管它。F2消去断点,Alt+F9返回
  01013208    8905 CE300101   MOV DWORD PTR DS:[10130CE],EAX           ; 返回到了这儿
  0101320E    C705 D2300101 0>MOV DWORD PTR DS:[10130D2],0
  01013218    BA 00000001     MOV EDX,16_1.01000000
  0101321D    8B06            MOV EAX,DWORD PTR DS:[ESI]
  0101321F    85C0            TEST EAX,EAX
  01013221    75 03           JNZ SHORT 16_1.01013226
  01013223    8B46 10         MOV EAX,DWORD PTR DS:[ESI+10]
  01013226    01D0            ADD EAX,EDX
  01013228    0305 D2300101   ADD EAX,DWORD PTR DS:[10130D2]
  0101322E    8B18            MOV EBX,DWORD PTR DS:[EAX]
  01013230    8B7E 10         MOV EDI,DWORD PTR DS:[ESI+10]
  01013233    01D7            ADD EDI,EDX
  01013235    033D D2300101   ADD EDI,DWORD PTR DS:[10130D2]
  0101323B    85DB            TEST EBX,EBX
  0101323D    74 2B           JE SHORT 16_1.0101326A
  0101323F    F7C3 00000080   TEST EBX,80000000
  01013245    75 04           JNZ SHORT 16_1.0101324B
  01013247    01D3            ADD EBX,EDX
  01013249    43              INC EBX
  0101324A    43              INC EBX
  0101324B    81E3 FFFFFF0F   AND EBX,0FFFFFFF
  
  目之所及 仍然是铺天盖地的花指令,但是现在我们已经不怕"格式错误或格式未知"窗口了,于是F8继续跟:
  有两个大循环 均已经指出F4的位置
  01013261    8305 D2300101 0>ADD DWORD PTR DS:[10130D2],4
  01013268  ^ EB AE           JMP SHORT 16_1.01013218
  0101326A    83C6 14         ADD ESI,14                               ; F4
  0101326D    BA 00000001     MOV EDX,16_1.01000000
  01013272  ^ E9 6EFFFFFF     JMP 16_1.010131E5
  01013277    68 54300101     PUSH 16_1.01013054                       ; F4
  0101327C    B8 48300101     MOV EAX,16_1.01013048
  01013281    FF10            CALL DWORD PTR DS:[EAX]
  01013283    68 BF300101     PUSH 16_1.010130BF                       ; ASCII "GlobalFree"
  接着F8:
  01013290    8B15 CA300101   MOV EDX,DWORD PTR DS:[10130CA]
  01013296    52              PUSH EDX
  01013297    FFD0            CALL EAX
  01013299    61              POPAD
  0101329A    BA 9D730001     MOV EDX,16_1.0100739D
  0101329F    FFE2            JMP EDX
  此处就能跳到OEP了,fly的话叫“飞向光明之巅 ”“胜利女神”。
  2.dump的操作
    注意不能用LordPE来Dump ,只能用PEtools。
  3.修复
    ImportREC V1.7F中点“选项” 找到“运行中程序信息”,把“使用来自磁盘的pe头”勾除。OEP处填上739D,然后
  你会的。
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  秒脱方法是:
     载入程序bp LoadLibraryA Shift+F9 4次 点掉那个"格式错误或格式未知"窗口,
    再Shift+F9 2次,取消一切断点。Alt+F9返回,Ctrl+F搜索JMP EDX,下断再Shift+F9运行就能到OEP
    dump和修复注意见脱文
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年01月15日 4:05:59

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习学习,请问脱壳后资源怎么修复?
2010-1-15 12:40
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
这个资源没问题吧 不过加壳过后图标都变形了.......
2010-1-15 13:20
0
游客
登录 | 注册 方可回帖
返回