////////////////////////////////////////////////////////////////////////////////////////////
文件名称:手脱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结束了执行的。
想提高自己的脱壳能力,就需要有特别丰富的经验。要利用“太极”的原理,以“静”制“动”、以“不变”应“万变”、以“无形”破“异形”等思想。当这些你都掌握的很好了,就需要去忘记一切规则和方法。剩下要做的就是“拿到一个壳,不停的向下跟踪,人挡杀人、佛挡杀佛,见什么破什么,最后就见到程序的入口了。”。
----------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!