前言:
简单介绍下病毒样本“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壳
00401000 > B8 C41D4100 MOV EAX,coderui_.00411DC4 ;OD载入后停在这里,[F8]单步向下走。
00401005 50 PUSH EAX
00401006 64:FF35 0000000>PUSH DWORD PTR FS:[0]
0040100D 64:8925 0000000>MOV DWORD PTR FS:[0],ESP ;单步到这里后,看“积存器”窗口中的ESP值,我们利用ESP守恒定律下硬件断点“HR ESP”。
;在命令行中输入“hr 0012FFBC”,回车。然后[F9]运行。
00401014 33C0 XOR EAX,EAX
00401016 8908 MOV DWORD PTR DS:[EAX],ECX
00401018 50 PUSH EAX
00401019 45 INC EBP
0040101A 43 INC EBX
0040101B 6F OUTS DX,DWORD PTR ES:[EDI] ; I/O 命令
0040101C 6D INS DWORD PTR ES:[EDI],DX ; I/O 命令
0040101D 70 61 JO SHORT coderui_.00401080
.
.
.
00411DF3 83C4 04 ADD ESP,4 ;运行后,停在这里(硬件断点)。[F8]单步向下走。
00411DF6 55 PUSH EBP
00411DF7 53 PUSH EBX
00411DF8 51 PUSH ECX
00411DF9 57 PUSH EDI
00411DFA 56 PUSH ESI
00411DFB 52 PUSH EDX
00411DFC 8D98 57120010 LEA EBX,DWORD PTR DS:[EAX+10001257]
.
.
.
00411E5F 894E 14 MOV DWORD PTR DS:[ESI+14],ECX
00411E62 FFD7 CALL EDI ;这里要做解压操作,会执行一段时间。
00411E64 8985 3F130010 MOV DWORD PTR SS:[EBP+1000133F],EAX
00411E6A 8BF0 MOV ESI,EAX
00411E6C 8B4B 14 MOV ECX,DWORD PTR DS:[EBX+14]
00411E6F 5A POP EDX
00411E70 EB 0C JMP SHORT coderui_.00411E7E ;到这里[F8]向下跳。
00411E72 03CA ADD ECX,EDX
.
.
.
00411E7E 8BC6 MOV EAX,ESI ;跳到这里,[F8]单步向下走。
00411E80 5A POP EDX
00411E81 5E POP ESI
00411E82 5F POP EDI
00411E83 59 POP ECX
00411E84 5B POP EBX
00411E85 5D POP EBP
00411E86 FFE0 JMP EAX ;到这里[F8]后会大跳。
00411E88 2C 00 SUB AL,0
00411E8A 41 INC ECX
00411E8B 00AC1E 4100B41E ADD BYTE PTR DS:[ESI+EBX+1EB40041],CH
.
.
.
0041002C 60 DB 60 ; CHAR '`' (大跳后来到这里,这里就是内部的壳入口点了。)
0041002D 8B DB 8B
0041002E D0 DB D0
0041002F 52 DB 52 ; CHAR 'R'
00410030 1B DB 1B
00410031 D8 DB D8
00410032 50 DB 50 ; CHAR 'P'
00410033 50 DB 50 ; CHAR 'P'
00410034 33 DB 33 ; CHAR '3'
总结:
我们到了这里,因为这里是数据段,所以后边的汇编代码无法解析,全部都是乱码。
本来是可以用[CTRL+A]来使OD进行一次代码重新扫描解析的,但由于后边使用了混淆入口点的壳,OD无法识别了。
我们又不可能就这样跟下去,那太不明智了。我是在这里把脱掉外层壳的样本DUMP了出来,然后再用OD重新载入脱掉外层壳后的样本继续脱。
我们DUMP出来的样本程序使用PEID查壳,显示为“Nothing found *”。
——————————————————————————————————————————————————
第二步骤:脱内层的未知混淆入口点壳
0041002C > $ 60 PUSHAD ;OD重新载入后停在这里,现在是明码了。[F8]单步向下走。
0041002D . 8BD0 MOV EDX,EAX
0041002F . 52 PUSH EDX
00410030 . 1BD8 SBB EBX,EAX
00410032 . 50 PUSH EAX
00410033 . 50 PUSH EAX
00410034 . 33D0 XOR EDX,EAX
.
.
.
0041006B . 61 POPAD
0041006C . 60 PUSHAD
0041006D . E8 91FFFFFF CALL coderui.00410003 ;[F7]:单步步入。
00410072 . 8BC3 MOV EAX,EBX
00410074 . 3E:8B00 MOV EAX,DWORD PTR DS:[EAX]
00410077 . 40 INC EAX
.
.
.
00410003 /$ B8 18000000 MOV EAX,18 ;步入到这里,[F8]单步向下走。
00410008 |. 64:8B18 MOV EBX,DWORD PTR FS:[EAX]
0041000B |. 83C3 30 ADD EBX,30
0041000E \. C3 RETN ;返回。
.
.
.
00410072 . 8BC3 MOV EAX,EBX ;返回到这里,[F8]单步向下走。
00410074 . 3E:8B00 MOV EAX,DWORD PTR DS:[EAX]
00410077 . 40 INC EAX
00410078 . E8 92FFFFFF CALL coderui.0041000F
0041007D . 3A65 B1 CMP AH,BYTE PTR SS:[EBP-4F] ;[F7]:单步步入。
00410080 . 1D BEE13DE4 SBB EAX,E43DE1BE
.
.
.
0041000F /$ 40 INC EAX ;步入到这里,[F8]单步向下走
00410010 |. 3E:0FB600 MOVZX EAX,BYTE PTR DS:[EAX]
00410014 |. C1E0 03 SHL EAX,3
00410017 |> 83C0 3B ADD EAX,3B
0041001A |. 36:010424 ADD DWORD PTR SS:[ESP],EAX
0041001E \. C3 RETN ;返回。
.
.
.
004100B8 . 61 POPAD ;返回到这里,[F8]单步向下走。
004100B9 .^ E9 CD8DFFFF JMP coderui.00408E8B ;[F8]跳。
004100BE 00 DB 00
004100BF 00 DB 00
004100C0 . 53 68 65 6C 6>ASCII "ShellExecuteA",0
004100CE 00 DB 00
004100CF 00 DB 00
004100D0 . 44 65 6C 65 7>ASCII "DeleteCriticalSe"
004100E0 . 63 74 69 6F 6>ASCII "ction",0
.
.
.
00408E8B 55 PUSH EBP ;跳到这里,[F8]单步向下走。
00408E8C 8BEC MOV EBP,ESP
00408E8E 83C4 F0 ADD ESP,-10
00408E91 B8 138E4000 MOV EAX,coderui.00408E13
00408E96 E8 A8B0FFFF CALL coderui.00403F43 ;[F7]:单步步入。
00408E9B E8 27FCFFFF CALL coderui.00408AC7
00408EA0 E8 7AA7FFFF CALL coderui.0040361F
.
.
.
00403F43 53 PUSH EBX ;这里就是程序的真正入口点了,我们DUMP出来,修复程序。
00403F44 8BD8 MOV EBX,EAX
00403F46 33C0 XOR EAX,EAX
00403F48 A3 8C904000 MOV DWORD PTR DS:[40908C],EAX
00403F4D 6A 00 PUSH 0
00403F4F E8 2BFFFFFF CALL <JMP.&kernel32.GetModuleHandleA>
00403F54 A3 50A64000 MOV DWORD PTR DS:[40A650],EAX
00403F59 A1 50A64000 MOV EAX,DWORD PTR DS:[40A650]
00403F5E A3 94904000 MOV DWORD PTR DS:[409094],EAX
00403F63 33C0 XOR EAX,EAX
00403F65 A3 98904000 MOV DWORD PTR DS:[409098],EAX
00403F6A 33C0 XOR EAX,EAX
00403F6C A3 9C904000 MOV DWORD PTR DS:[40909C],EAX
总结:
我们DUMP出来的程序使用PEID查壳,显示为“Borland Delphi 6.0 - 7.0”。
这样说明我们把壳脱掉了,由于是病毒不用运行,所以就不修复和优化,OK完毕。
////////////////////////////////////////////////////////////////////////////////////////////
[培训]科锐逆向工程师培训第53期2025年7月8日开班!