|
目标程序:病毒样本“Trojan/Small.dol”程序
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
---------------------------------------------------------------------------------------------
前言:
简单介绍下病毒样本“Trojan/Small.dol”程序所加的壳吧,样本外层加了一个“PECompact 2.x”壳,内层加了一个混淆入口点的壳,但不知道是什么名字,不过这个壳貌似很常见。今天拿这个壳做例子希望对初级接触脱壳的朋友有帮助,也希望你们会喜欢。
分析:
脱壳前,使用PEID V0.93查壳,显示壳名为:“PECompact 2.x -> Jeremy Collake”。看了下这个程序有2个节段。EP区段名分别为:“.CODE/.rsrc”,显示连接程序版本为:2.0 。
注意:
如果大家分析的是应用软件加的壳,跑飞几次没什么关系。但如果分析的是病毒,那么就要千万小心了,因为有些未知病毒可能破坏力非常大的(比如PE感染型病毒)。不过最好还是养成仔细分析、细心调试的好习惯比较好(我喜欢真实环境,不太喜欢虚拟机,因为感觉不方便)。今天同样很幸运,依然只跟了一次,壳直接就脱掉了,哈哈!(^_^).
---------------------------------------------------------------------------------------------
手脱记录:
(OD设置为“忽略非法访问内存异常”。[F2]:下软断点、[F4]:执行到当前代码处、[F7]:单步步入、[F8]单步步过、[F9]运行。)
---------------------------------------------------------------------------------------------
第一步骤:脱最外层的PECompact 2.x壳
004****1000 >B8 C41D4100 MOV EAX,coderui_.00***11DC4;OD载入后停在这里,[F8]单步向下走。
004****0550PUSH EAX
004****0664:FF35 00***00>PUSH DWORD PTR FS:[0]
00***00D64:8925 00***00>MOV DWORD PTR FS:[0],ESP ;单步到这里后,看“积存器”窗口中的ESP值,我们利用ESP守恒定律下硬件断点“HR ESP”。
;在命令行中输入“hr 0012FFBC”,回车。然后[F9]运行。
004****1433C0XOR EAX,EAX
004****8908MOV DWORD PTR DS:[EAX],ECX
004****1850PUSH EAX
004****1945INC EBP
00***01A43INC EBX
00***01B6FOUTS DX,DWORD PTR ES:[EDI] ; I/O 命令
00***01C6DINS DWORD PTR ES:[EDI],DX; I/O 命令
00***01D70 61 JO SHORT coderui_.004****1080
.
.
.
00***11DF383C4 04 ADD ESP,4;运行后,停在这里(硬件断点)。[F8]单步向下走。
00***11DF655PUSH EBP
00***11DF753PUSH EBX
00***11DF851PUSH ECX
00***11DF957PUSH EDI
00***11DFA56PUSH ESI
00***11DFB52PUSH EDX
00***11DFC8D98 571****0010 LEA EBX,DWORD PTR DS:[EAX+100****1257]
.
.
.
00***11E5F894E 14 MOV DWORD PTR DS:[ESI+14],ECX
00***11E62FFD7CALL EDI ;这里要做解压操作,会执行一段时间。
00***11E64***85 3F13***10 MOV DWORD PTR SS:[EBP+10***33F],EAX
00***11E6A8BF0MOV ESI,EAX
00***11E6C8B4B 14 MOV ECX,DWORD PTR DS:[EBX+14]
00***11E6F5APOP EDX
00***11E70EB 0C JMP SHORT coderui_.00***11E7E;到这里[F8]向下跳。
00***11E7203CAADD ECX,EDX
.
.
.
00***11E7E8BC6MOV EAX,ESI;跳到这里,[F8]单步向下走。
00***11E805APOP EDX
00***11E815EPOP ESI
00***11E825FPOP EDI
00***11E8359POP ECX
00***11E845BPOP EBX
00***11E855DPOP EBP
00***11E86FFE0JMP EAX;到这里[F8]后会大跳。
00***11E882C 00 SUB AL,0
00***11E8A41INC ECX
00***11E8B00AC1E 4100B41E ADD BYTE PTR DS:[ESI+EBX+1EB40***41],CH
.
.
.
00***02C60DB 60;CHAR '`' (大跳后来到这里,这里就是内部的壳入口点了。)
00***02D8BDB 8B
00***02ED0DB D0
00***02F52DB 52;CHAR 'R'
004****0301BDB 1B
004****0031D8DB D8
004****3250DB 50;CHAR 'P'
004****3350DB 50;CHAR 'P'
004****3433DB 33;CHAR '3'
总结:
我们到了这里,因为这里是数据段,所以后边的汇编代码无法解析,全部都是乱码。
本来是可以用[CTRL+A]来使OD进行一次代码重新扫描解析的,但由于后边使用了混淆入口点的壳,OD无法识别了。
我们又不可能就这样跟下去,那太不明智了。我是在这里把脱掉外层壳的样本DUMP了出来,然后再用OD重新载入脱掉外层壳后的样本继续脱。
我们DUMP出来的样本程序使用PEID查壳,显示为“Nothing found *”。
—————————————————————————————————————————————
第二步骤:脱内层的未知混淆入口点壳
00***02C > $Content$nbsp; 60PUSHAD ;OD重新载入后停在这里,现在是明码了。[F8]单步向下走。
00***02D .8BD0MOV EDX,EAX
00***02F .52PUSH EDX
004****0030 .1BD8SBB EBX,EAX
004****0032 .50PUSH EAX
004****0033 .50PUSH EAX
004****0034 .33D0XOR EDX,EAX
.
.
.
00***06B .61POPAD
00***06C .60PUSHAD
00***06D .E8 91FFFFFF CALL coderui.004****0003;[F7]:单步步入。
004****0072 .8BC3MOV EAX,EBX
004****0074 .3E:8B00 MOV EAX,DWORD PTR DS:[EAX]
004****0077 .40INC EAX
.
.
.
004****0003/$Content$nbsp; B8 180****0000 MOV EAX,18 ;步入到这里,[F8]单步向下走。
004****0008|.64:8B18 MOV EBX,DWORD PTR FS:[EAX]
00***00B|.83C3 30 ADD EBX,30
00***00E\\.C3RETN ;返回。
.
.
.
004****0072 .8BC3MOV EAX,EBX;返回到这里,[F8]单步向下走。
004****0074 .3E:8B00 MOV EAX,DWORD PTR DS:[EAX]
004****0077 .40INC EAX
004****0078 .E8 92FFFFFF CALL coderui.00***00F
00***07D .3A65 B1 CMP AH,BYTE PTR SS:[EBP-4F];[F7]:单步步入。
004****0080 .1D BEE13DE4 SBB EAX,E43DE1BE
.
.
.
00***00F/$Content$nbsp; 40INC EAX;步入到这里,[F8]单步向下走
004****0010|.3E:0FB600 MOVZX EAX,BYTE PTR DS:[EAX]
004****0014|.C1E0 03 SHL EAX,3
004****0017|>83C0 3B ADD EAX,3B
00***01A|.36:01***24 ADD DWORD PTR SS:[ESP],EAX
00***01E\\.C3RETN ;返回。
.
.
.
00***00B8 .61POPAD;返回到这里,[F8]单步向下走。
00***00B9 .^ E9 CD8DFFFF JMP coderui.00***08E8B ;[F8]跳。
00***00BE00DB 00
00***00BF00DB 00
00***00C0 .53 68 65 6C 6>ASCII \"ShellExecuteA\",0
00***00CE00DB 00
00***00CF00DB 00
00***00D0 .44 65 6C 65 7>ASCII \"DeleteCriticalSe\"
00***00E0 .63 74 69 6F 6>ASCII \"ction\",0
.
.
.
00***08E8B55PUSH EBP ;跳到这里,[F8]单步向下走。
00***08E8C8BECMOV EBP,ESP
00***08E8E83C4 F0 ADD ESP,-10
00***08E91B8 138E4000 MOV EAX,coderui.00***08E13
00***08E96E8 A8B0FFFF CALL coderui.00***03F43;[F7]:单步步入。
00***08E9BE8 27FCFFFF CALL coderui.00***08AC7
00***08EA0E8 7AA7FFFF CALL coderui.00***61F
.
.
.
00***03F4353PUSH EBX ;这里就是程序的真正入口点了,我们DUMP出来,修复程序。
00***03F448BD8MOV EBX,EAX
00***03F4633C0XOR EAX,EAX
00***03F48A3 8C90***00 MOV DWORD PTR DS:[40***08C],EAX
00***03F4D6A 00 PUSH 0
00***03F4FE8 2BFFFFFF CALL <JMP.&kernel32.GetModuleHandleA>
00***03F54A3 50A64***00 MOV DWORD PTR DS:[40A650],EAX
00***03F59A1 50A64***00 MOV EAX,DWORD PTR DS:[40A650]
00***03F5EA3 949****4000 MOV DWORD PTR DS:[40***94],EAX
00***03F6333C0XOR EAX,EAX
00***03F65A3 989****4000 MOV DWORD PTR DS:[40***98],EAX
00***03F6A33C0XOR EAX,EAX
00***03F6CA3 9C90***00 MOV DWORD PTR DS:[40***09C],EAX
总结:
我们DUMP出来的程序使用PEID查壳,显示为“Borland Delphi 6.0 - 7.0”。
这样说明我们把壳脱掉了,由于是病毒不用运行,所以就不修复和优化,OK完毕。 |
|