首页
社区
课程
招聘
[旧帖] [原创]手脱DLL组件加“PESpin 0.3x - 1.xx -> cyberbob”壳的方法 0.00雪花
发表于: 2008-5-19 13:59 12324

[旧帖] [原创]手脱DLL组件加“PESpin 0.3x - 1.xx -> cyberbob”壳的方法 0.00雪花

2008-5-19 13:59
12324

////////////////////////////////////////////////////////////////////////////////////////////
文件名称:手脱DLL组件加“PESpin 0.3x - 1.xx -> cyberbob”壳的方法
目标程序:某个DLL组件程序文件
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
编写作者:Coderui
编写时间:2008年05月19日
联系方式:coderui@163.com
作者博客:http://hi.baidu.com/coderui
////////////////////////////////////////////////////////////////////////////////////////////
----------------------------------------------------------------------------------------
简单介绍:
  壳的入口会被循环执行两次,在第一次里会出现N多种类的异常,而在第二次里则是一个异常都没有。设置OD为忽略所有异常,[F9]运行一次后,该DLL会自动把第一次的全部异常执行完,然后再次自动停在第二次需要运行的入口处。剩下的部分自己手动单步去跟就行了,没任何复杂的干扰。全部使用[F7]向下步入跟踪一大段距离后,会发现有个跨段大跳(JMP),这个就是关键跳,是指向程序真正OEP的地址。
----------------------------------------------------------------------------------------
设置OD为忽略所有异常。

100450D4 > /EB 01           JMP SHORT KOEITIME.100450D7              ; 载入后停在这里,[F9]运行一次。
100450D6   |68 60E80000     PUSH 0E860
100450DB    0000            ADD BYTE PTR DS:[EAX],AL
100450DD    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
100450E0    83C3 12         ADD EBX,12
100450E3    812B E8B10600   SUB DWORD PTR DS:[EBX],6B1E8
100450E9    FE4B FD         DEC BYTE PTR DS:[EBX-3]
100450EC    822C24 17       SUB BYTE PTR SS:[ESP],17
100450F0    E6 46           OUT 46,AL                                ; I/O 命令
100450F2    000B            ADD BYTE PTR DS:[EBX],CL
100450F4    E4 74           IN AL,74                                 ; I/O 命令
100450F6    9E              SAHF
100450F7    75 01           JNZ SHORT KOEITIME.100450FA
100450F9    C781 7304D77A F>MOV DWORD PTR DS:[ECX+7AD70473],73812FF7
10045103    1977 00         SBB DWORD PTR DS:[EDI],ESI
10045106    43              INC EBX
10045107    B7 F6           MOV BH,0F6
10045109    C3              RETN
            .
            .
            .
100450D4 > /EB 01           JMP SHORT KOEITIME.100450D7              ; [F9]运行后,还是停在这里。我们向下全部使用[F7]步入跟踪执行。
100450D6   |68 60E80000     PUSH 0E860
100450DB    0000            ADD BYTE PTR DS:[EAX],AL
100450DD    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
100450E0    83C3 12         ADD EBX,12
100450E3    812B E8B10600   SUB DWORD PTR DS:[EBX],6B1E8
100450E9    FE4B FD         DEC BYTE PTR DS:[EBX-3]
100450EC    822C24 17       SUB BYTE PTR SS:[ESP],17
100450F0    E6 46           OUT 46,AL                                ; I/O 命令
100450F2    000B            ADD BYTE PTR DS:[EBX],CL
100450F4    E4 74           IN AL,74                                 ; I/O 命令
100450F6    9E              SAHF
100450F7    75 01           JNZ SHORT KOEITIME.100450FA
100450F9    C781 7304D77A F>MOV DWORD PTR DS:[ECX+7AD70473],73812FF7
10045103    1977 00         SBB DWORD PTR DS:[EDI],ESI
10045106    43              INC EBX
10045107    B7 F6           MOV BH,0F6
10045109    C3              RETN
            .
            .
            .
10046D18   /EB 01           JMP SHORT KOEITIME.10046D1B              ; 大概跟踪执行一大段距离后,来到这里。
10046D1A   |C1C7 C1         ROL EDI,0C1                              ; 移位常量超出 1..31 的范围
10046D1D    A4              MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
10046D1E    AE              SCAS BYTE PTR ES:[EDI]
10046D1F    0A88 F20FACC2   OR CL,BYTE PTR DS:[EAX+C2AC0FF2]
10046D25    AB              STOS DWORD PTR ES:[EDI]
10046D26    0FBAE9 AB       BTS ECX,0AB
10046D2A    EB 01           JMP SHORT KOEITIME.10046D2D
10046D2C    1D 87D2D1F1     SBB EAX,F1D1D287
10046D31    19C2            SBB EDX,EAX
10046D33    0FBDD0          BSR EDX,EAX
10046D36 - E9 4200FCFF     JMP KOEITIME.10006D7D                    ; 这里是一个跨段大跳,所指向的地址就是该DLL组件的真正入口点了。[F8]跳。
            .
            .
            .
10006D7D /. 55            PUSH EBP                                 ; 该DLL组件的入口点(OEP),在这里DUMP出来就OK了。
10006D7E |. 8BEC          MOV EBP,ESP
10006D80 |. 53            PUSH EBX
10006D81 |. 8B5D 08       MOV EBX,DWORD PTR SS:[EBP+8]
10006D84 |. 56            PUSH ESI
10006D85 |. 8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]
10006D88 |. 57            PUSH EDI
10006D89 |. 8B7D 10       MOV EDI,DWORD PTR SS:[EBP+10]
10006D8C |. 85F6          TEST ESI,ESI
10006D8E |. 75 09         JNZ SHORT KOEITIME.10006D99
10006D90 |. 833D 84A70110>CMP DWORD PTR DS:[1001A784],0
10006D97 |. EB 26         JMP SHORT KOEITIME.10006DBF
10006D99 |> 83FE 01       CMP ESI,1
10006D9C |. 74 05         JE SHORT KOEITIME.10006DA3
10006D9E |. 83FE 02       CMP ESI,2
10006DA1 |. 75 22         JNZ SHORT KOEITIME.10006DC5
10006DA3 |> A1 E8BE0110   MOV EAX,DWORD PTR DS:[1001BEE8]
10006DA8 |. 85C0          TEST EAX,EAX
10006DAA |. 74 09         JE SHORT KOEITIME.10006DB5
10006DAC |. 57            PUSH EDI
10006DAD |. 56            PUSH ESI
10006DAE |. 53            PUSH EBX
10006DAF |. FFD0          CALL EAX
10006DB1 |. 85C0          TEST EAX,EAX
10006DB3 |. 74 0C         JE SHORT KOEITIME.10006DC1
10006DB5 |> 57            PUSH EDI
10006DB6 |. 56            PUSH ESI
10006DB7 |. 53            PUSH EBX
10006DB8 |. E8 E7FEFFFF   CALL KOEITIME.10006CA4
10006DBD |. 85C0          TEST EAX,EAX
10006DBF |> 75 04         JNZ SHORT KOEITIME.10006DC5
10006DC1 |> 33C0          XOR EAX,EAX
10006DC3 |. EB 4E         JMP SHORT KOEITIME.10006E13
10006DC5 |> 57            PUSH EDI                                 ; /Arg3
10006DC6 |. 56            PUSH ESI                                 ; |Arg2
10006DC7 |. 53            PUSH EBX                                 ; |Arg1
10006DC8 |. E8 43E0FFFF   CALL KOEITIME.10004E10                   ; \KOEITIME.10004E10(主main函数)
10006DCD |. 83FE 01       CMP ESI,1
10006DD0 |. 8945 0C       MOV DWORD PTR SS:[EBP+C],EAX
10006DD3 |. 75 0C         JNZ SHORT KOEITIME.10006DE1
10006DD5 |. 85C0          TEST EAX,EAX
10006DD7 |. 75 37         JNZ SHORT KOEITIME.10006E10
10006DD9 |. 57            PUSH EDI
10006DDA |. 50            PUSH EAX
10006DDB |. 53            PUSH EBX
10006DDC |. E8 C3FEFFFF   CALL KOEITIME.10006CA4
10006DE1 |> 85F6          TEST ESI,ESI
10006DE3 |. 74 05         JE SHORT KOEITIME.10006DEA
10006DE5 |. 83FE 03       CMP ESI,3
10006DE8 |. 75 26         JNZ SHORT KOEITIME.10006E10
10006DEA |> 57            PUSH EDI
10006DEB |. 56            PUSH ESI
10006DEC |. 53            PUSH EBX
10006DED |. E8 B2FEFFFF   CALL KOEITIME.10006CA4
10006DF2 |. 85C0          TEST EAX,EAX
10006DF4 |. 75 03         JNZ SHORT KOEITIME.10006DF9
10006DF6 |. 2145 0C       AND DWORD PTR SS:[EBP+C],EAX
10006DF9 |> 837D 0C 00    CMP DWORD PTR SS:[EBP+C],0
10006DFD |. 74 11         JE SHORT KOEITIME.10006E10
10006DFF |. A1 E8BE0110   MOV EAX,DWORD PTR DS:[1001BEE8]
10006E04 |. 85C0          TEST EAX,EAX
10006E06 |. 74 08         JE SHORT KOEITIME.10006E10
10006E08 |. 57            PUSH EDI
10006E09 |. 56            PUSH ESI
10006E0A |. 53            PUSH EBX
10006E0B |. FFD0          CALL EAX
10006E0D |. 8945 0C       MOV DWORD PTR SS:[EBP+C],EAX
10006E10 |> 8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]
10006E13 |> 5F            POP EDI
10006E14 |. 5E            POP ESI
10006E15 |. 5B            POP EBX
10006E16 |. 5D            POP EBP
10006E17 \. C2 0C00       RETN 0C
----------------------------------------------------------------------------------------
总结:
  DLL组件脱壳后,发现该DLL组件采用“Microsoft Visual C++ 6.0 DLL”编写,脱壳后的程序真正入口点为:00006D7D。
  这个DLL组件在我机器上脱后可以正常运行,不过在其它系统就不知道了。因为DLL里的东西涉及到重定向,呵呵。
  有很多朋友说这个壳脱起来很难。其实,只要你把这个壳的结构分析清楚,看他都做了什么反跟踪、都做了什么处理,然后你按照一定的规则方法去向下跟就OK了。这个壳前边无非就是使用了N多的花指令、N多种类的异常等。到了壳的最后还是就用了一个JMP结束了执行的。
  想提高自己的脱壳能力,就需要有特别丰富的经验。要利用“太极”的原理,以“静”制“动”、以“不变”应“万变”、以“无形”破“异形”等思想。当这些你都掌握的很好了,就需要去忘记一切规则和方法。剩下要做的就是“拿到一个壳,不停的向下跟踪,人挡杀人、佛挡杀佛,见什么破什么,最后就见到程序的入口了。”。
----------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////


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

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我的这个按照你的方法不好用呢?
http://www.live-share.com/files/333013/123.rar.html
2008-7-2 15:54
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
壳有问题,把程序加坏了,不能正常执行。
2008-7-5 21:57
0
游客
登录 | 注册 方可回帖
返回
//