///////////////////////////////////////////////////////////////////////////////////////////////
文件名称:手脱加三层壳(未知壳+UPX壳+未知壳)的病毒样本程序
目标程序:病毒样本
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
编写作者:Coderui
编写时间:2008年05月22日
联系方式:coderui@163.com
作者博客:http://hi.baidu.com/coderui
///////////////////////////////////////////////////////////////////////////////////////////////
------------------------------------------------------------------------------------
第一层壳是很容易一眼就可以看出来关键跳转的,第二层壳是使用ESP守恒定义就可以轻松解决的,但第三层壳初步拿来时是不太好分析的。因为第三层壳中有复杂的嵌套循环跳转,并且在动态跟踪分析时代码严重受到花指令的干扰和影响,不小心动一动的话,代码结构就都变了。使用过下内存执行断点的方法,效果不是很理想。我最开始全部都是利用单步跟踪,然后根据规律和结构去一点点的向循环的外部跳转的。最后发现该壳结束时需要用到的那个跨段大跳的指令没有被花指令干扰到,所以还是很容易就把壳全部脱掉了。看来多分析、多看、多观察、多想、多思考对脱壳来说还是非常重要的,呵呵。
------------------------------------------------------------------------------------
OD设置:(OD设置为不忽略任何异常。[F2]:下软断点、[F4]:执行到当前代码处、[F7]:单步步入、[F8]单步步过、[F9]运行。)
脱第一层壳:(未知壳)
0040C000 > 60 PUSHAD ; 第一层壳入口。
0040C001 61 POPAD
0040C002 9C PUSHFD
0040C003 9D POPFD
0040C004 50 PUSH EAX
0040C005 53 PUSH EBX
0040C006 51 PUSH ECX
0040C007 59 POP ECX
0040C008 5B POP EBX
0040C009 58 POP EAX
0040C00A 74 02 JE SHORT 0.0040C00E
0040C00C 75 00 JNZ SHORT 0.0040C00E
0040C00E E9 00000000 JMP 0.0040C013
0040C013 68 00974000 PUSH 0.00409700
0040C018 C3 RETN ; 这行代码是第一层壳结束的地方,是一个跨段大跳。
脱第二层壳:(UPX壳)
00409700 60 PUSHAD ; 第二层壳入口,[F8]向下走一步。
00409701 BE 00704000 MOV ESI,0.00407000 ; 使用命令[HR ESP]下硬件断点,[F9]运行。
00409706 8DBE 00A0FFFF LEA EDI,DWORD PTR DS:[ESI+FFFFA000]
0040970C 57 PUSH EDI
0040970D 89E5 MOV EBP,ESP
0040970F 8D9C24 80C1FFFF LEA EBX,DWORD PTR SS:[ESP-3E80]
00409716 31C0 XOR EAX,EAX
00409718 50 PUSH EAX
00409719 39DC CMP ESP,EBX
0040971B ^ 75 FB JNZ SHORT 0.00409718
0040971D 46 INC ESI
0040971E 46 INC ESI
0040971F 53 PUSH EBX
00409720 68 43770000 PUSH 7743
00409725 57 PUSH EDI
00409726 83C3 04 ADD EBX,4
00409729 53 PUSH EBX
0040972A 68 FE260000 PUSH 26FE
0040972F 56 PUSH ESI
00409730 83C3 04 ADD EBX,4
00409733 53 PUSH EBX
00409734 50 PUSH EAX
00409735 C703 03000200 MOV DWORD PTR DS:[EBX],20003
.
.
.
0040A28E 8D4424 80 LEA EAX,DWORD PTR SS:[ESP-80] ; 运行后停在这里,使用命令[HD]去掉硬件断点。
0040A292 6A 00 PUSH 0
0040A294 39C4 CMP ESP,EAX
0040A296 ^ 75 FA JNZ SHORT 0.0040A292
0040A298 83EC 80 SUB ESP,-80
0040A29B ^ E9 8CCDFFFF JMP 0.0040702C ; 这行代码是第二层壳结束的地方,是一个跨段大跳。
0040A2A0 0000 ADD BYTE PTR DS:[EAX],AL
0040A2A2 0000 ADD BYTE PTR DS:[EAX],AL
0040A2A4 0000 ADD BYTE PTR DS:[EAX],AL
0040A2A6 0000 ADD BYTE PTR DS:[EAX],AL
0040A2A8 0000 ADD BYTE PTR DS:[EAX],AL
0040A2AA 0000 ADD BYTE PTR DS:[EAX],AL
脱第三层壳:(未知壳)
0040702C F9 STC ; 第三层壳入口。
0040702D /72 05 JB SHORT 0.00407034
0040702F |3C 91 CMP AL,91
00407031 |1105 02607208 ADC DWORD PTR DS:[8726002],EAX
00407037 48 DEC EAX
00407038 95 XCHG EAX,EBP
00407039 0E PUSH CS
0040703A 71 0F JNO SHORT 0.0040704B
0040703C 53 PUSH EBX
0040703D E0 17 LOOPDNE SHORT 0.00407056
0040703F E8 08000000 CALL 0.0040704C
00407044 D7 XLAT BYTE PTR DS:[EBX+AL]
00407045 27 DAA
00407046 0FFDB6 B1413D5E PADDW MM6,QWORD PTR DS:[ESI+5E3D41B1]
0040704D EB 04 JMP SHORT 0.00407053
0040704F 1A96 3BAC81C6 SBB DL,BYTE PTR DS:[ESI+C681AC3B]
00407055 BC FFFFFFEB MOV ESP,EBFFFFFF
0040705A 0957 36 OR DWORD PTR DS:[EDI+36],EDX
0040705D 40 INC EAX
0040705E 23A7 FE03CB19 AND ESP,DWORD PTR DS:[EDI+19CB03FE]
00407064 833E 00 CMP DWORD PTR DS:[ESI],0
00407067 EB 02 JMP SHORT 0.0040706B
00407069 91 XCHG EAX,ECX
0040706A 810F 84840000 OR DWORD PTR DS:[EDI],8484
00407070 00F9 ADD CL,BH
00407072 EB 05 JMP SHORT 0.00407079
00407074 0067 1C ADD BYTE PTR DS:[EDI+1C],AH
00407077 77 67 JA SHORT 0.004070E0
00407079 8BCE MOV ECX,ESI
0040707B EB 03 JMP SHORT 0.00407080
0040707D E2 6B LOOPD SHORT 0.004070EA
0040707F A9 83C604EB TEST EAX,EB04C683
00407084 0262 86 ADD AH,BYTE PTR DS:[EDX-7A]
00407087 8B06 MOV EAX,DWORD PTR DS:[ESI]
00407089 EB 09 JMP SHORT 0.00407094
0040708B 16 PUSH SS
0040708C 39C7 CMP EDI,EAX
0040708E - E9 1120D3C8 JMP C91390A4
00407093 AE SCAS BYTE PTR ES:[EDI]
00407094 03C6 ADD EAX,ESI
00407096 F8 CLC
00407097 73 04 JNB SHORT 0.0040709D
00407099 10AB C2B88B56 ADC BYTE PTR DS:[EBX+568BB8C2],CH
0040709F 04 EB ADD AL,0EB
004070A1 035B 55 ADD EBX,DWORD PTR DS:[EBX+55]
004070A4 5B POP EBX
004070A5 8128 38E2B924 SUB DWORD PTR DS:[EAX],24B9E238
004070AB EB 02 JMP SHORT 0.004070AF
004070AD 6235 83C004EB BOUND ESI,QWORD PTR DS:[EB04C083]
004070B3 098B 5633CCA0 OR DWORD PTR DS:[EBX+A0CC3356],ECX
004070B9 BC 51C40A83 MOV ESP,830AC451
004070BE EA 01F97205 756>JMP FAR 6675:0572F901
004070C5 48 DEC EAX
004070C6 B5 A1 MOV CH,0A1
004070C8 ^ 0F85 D2FFFFFF JNZ 0.004070A0
004070CE EB 02 JMP SHORT 0.004070D2
004070D0 65:BA 83C608EB MOV EDX,EB08C683
004070D6 0230 ADD DH,BYTE PTR DS:[EAX]
004070D8 6D INS DWORD PTR ES:[EDI],DX
004070D9 8329 01 SUB DWORD PTR DS:[ECX],1
004070DC EB 02 JMP SHORT 0.004070E0
004070DE AE SCAS BYTE PTR ES:[EDI]
004070DF 76 0F JBE SHORT 0.004070F0
004070E1 859D FFFFFFF9 TEST DWORD PTR SS:[EBP+F9FFFFFF],EBX
004070E7 EB 01 JMP SHORT 0.004070EA
004070E9 55 PUSH EBP
004070EA 8BDE MOV EBX,ESI
004070EC EB 02 JMP SHORT 0.004070F0
004070EE F1 INT1
004070EF CE INTO
004070F0 E8 0E000000 CALL 0.00407103
004070F5 EB 02 JMP SHORT 0.004070F9
004070F7 2C ED SUB AL,0ED
004070F9 61 POPAD ; 明显的出栈特征。
004070FA F8 CLC
004070FB EB 01 JMP SHORT 0.004070FE
004070FD 54 PUSH ESP
004070FE - E9 CBCCFFFF JMP 0.00403DCE ; 这行代码是第三层壳结束的地方,是一个跨段大跳。
00407103 C3 RETN
脱壳完毕:(Microsoft Visual C++ 6.0 [Overlay])
00403DCE 55 PUSH EBP ; 这里就是程序真实的入口地址(OEP),DUMP并修复输入表就OK了。
00403DCF 8BEC MOV EBP,ESP
00403DD1 6A FF PUSH -1
00403DD3 68 80514000 PUSH 0.00405180
00403DD8 68 543F4000 PUSH 0.00403F54 ; JMP 到 msvcrt._except_handler3
00403DDD 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00403DE3 50 PUSH EAX
00403DE4 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00403DEB 83EC 68 SUB ESP,68
00403DEE 53 PUSH EBX
00403DEF 56 PUSH ESI
00403DF0 57 PUSH EDI
00403DF1 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
00403DF4 33DB XOR EBX,EBX
00403DF6 895D FC MOV DWORD PTR SS:[EBP-4],EBX
00403DF9 6A 02 PUSH 2
00403DFB FF15 FC404000 CALL DWORD PTR DS:[4040FC] ; msvcrt.__set_app_type
00403E01 59 POP ECX
00403E02 830D C8664000 F>OR DWORD PTR DS:[4066C8],FFFFFFFF
00403E09 830D CC664000 F>OR DWORD PTR DS:[4066CC],FFFFFFFF
00403E10 FF15 F8404000 CALL DWORD PTR DS:[4040F8] ; msvcrt.__p__fmode
00403E16 8B0D C0664000 MOV ECX,DWORD PTR DS:[4066C0]
00403E1C 8908 MOV DWORD PTR DS:[EAX],ECX
00403E1E FF15 F4404000 CALL DWORD PTR DS:[4040F4] ; msvcrt.__p__commode
00403E24 8B0D BC664000 MOV ECX,DWORD PTR DS:[4066BC]
00403E2A 8908 MOV DWORD PTR DS:[EAX],ECX
00403E2C A1 F0404000 MOV EAX,DWORD PTR DS:[4040F0]
00403E31 8B00 MOV EAX,DWORD PTR DS:[EAX]
00403E33 A3 C4664000 MOV DWORD PTR DS:[4066C4],EAX
00403E38 E8 16010000 CALL 0.00403F53
00403E3D 391D 00654000 CMP DWORD PTR DS:[406500],EBX
00403E43 75 0C JNZ SHORT 0.00403E51
00403E45 68 503F4000 PUSH 0.00403F50
00403E4A FF15 10414000 CALL DWORD PTR DS:[404110] ; msvcrt.__setusermatherr
00403E50 59 POP ECX
00403E51 E8 E8000000 CALL 0.00403F3E
00403E56 68 14604000 PUSH 0.00406014
00403E5B 68 10604000 PUSH 0.00406010
00403E60 E8 D3000000 CALL 0.00403F38 ; JMP 到 msvcrt._initterm
00403E65 A1 B8664000 MOV EAX,DWORD PTR DS:[4066B8]
00403E6A 8945 94 MOV DWORD PTR SS:[EBP-6C],EAX
00403E6D 8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
00403E70 50 PUSH EAX
00403E71 FF35 B4664000 PUSH DWORD PTR DS:[4066B4]
00403E77 8D45 9C LEA EAX,DWORD PTR SS:[EBP-64]
00403E7A 50 PUSH EAX
00403E7B 8D45 90 LEA EAX,DWORD PTR SS:[EBP-70]
00403E7E 50 PUSH EAX
00403E7F 8D45 A0 LEA EAX,DWORD PTR SS:[EBP-60]
00403E82 50 PUSH EAX
00403E83 FF15 38414000 CALL DWORD PTR DS:[404138] ; msvcrt.__getmainargs
00403E89 68 0C604000 PUSH 0.0040600C
00403E8E 68 00604000 PUSH 0.00406000
00403E93 E8 A0000000 CALL 0.00403F38 ; JMP 到 msvcrt._initterm
00403E98 83C4 24 ADD ESP,24
00403E9B A1 0C414000 MOV EAX,DWORD PTR DS:[40410C]
00403EA0 8B30 MOV ESI,DWORD PTR DS:[EAX]
00403EA2 8975 8C MOV DWORD PTR SS:[EBP-74],ESI
00403EA5 803E 22 CMP BYTE PTR DS:[ESI],22
00403EA8 75 3A JNZ SHORT 0.00403EE4
00403EAA 46 INC ESI
00403EAB 8975 8C MOV DWORD PTR SS:[EBP-74],ESI
00403EAE 8A06 MOV AL,BYTE PTR DS:[ESI]
00403EB0 3AC3 CMP AL,BL
00403EB2 74 04 JE SHORT 0.00403EB8
00403EB4 3C 22 CMP AL,22
00403EB6 ^ 75 F2 JNZ SHORT 0.00403EAA
00403EB8 803E 22 CMP BYTE PTR DS:[ESI],22
00403EBB 75 04 JNZ SHORT 0.00403EC1
00403EBD 46 INC ESI
00403EBE 8975 8C MOV DWORD PTR SS:[EBP-74],ESI
00403EC1 8A06 MOV AL,BYTE PTR DS:[ESI]
00403EC3 3AC3 CMP AL,BL
00403EC5 74 04 JE SHORT 0.00403ECB
00403EC7 3C 20 CMP AL,20
00403EC9 ^ 76 F2 JBE SHORT 0.00403EBD
00403ECB 895D D0 MOV DWORD PTR SS:[EBP-30],EBX
00403ECE 8D45 A4 LEA EAX,DWORD PTR SS:[EBP-5C]
00403ED1 50 PUSH EAX
00403ED2 FF15 40404000 CALL DWORD PTR DS:[404040] ; kernel32.GetStartupInfoA
00403ED8 F645 D0 01 TEST BYTE PTR SS:[EBP-30],1
00403EDC 74 11 JE SHORT 0.00403EEF
00403EDE 0FB745 D4 MOVZX EAX,WORD PTR SS:[EBP-2C]
00403EE2 EB 0E JMP SHORT 0.00403EF2
00403EE4 803E 20 CMP BYTE PTR DS:[ESI],20
00403EE7 ^ 76 D8 JBE SHORT 0.00403EC1
00403EE9 46 INC ESI
00403EEA 8975 8C MOV DWORD PTR SS:[EBP-74],ESI
00403EED ^ EB F5 JMP SHORT 0.00403EE4
00403EEF 6A 0A PUSH 0A
00403EF1 58 POP EAX
00403EF2 50 PUSH EAX
00403EF3 56 PUSH ESI
00403EF4 53 PUSH EBX
00403EF5 53 PUSH EBX
00403EF6 FF15 34404000 CALL DWORD PTR DS:[404034] ; kernel32.GetModuleHandleA
00403EFC 50 PUSH EAX
00403EFD E8 1ED7FFFF CALL 0.00401620
00403F02 8945 98 MOV DWORD PTR SS:[EBP-68],EAX
00403F05 50 PUSH EAX
00403F06 FF15 08414000 CALL DWORD PTR DS:[404108] ; msvcrt.exit
00403F0C 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00403F0F 8B08 MOV ECX,DWORD PTR DS:[EAX]
00403F11 8B09 MOV ECX,DWORD PTR DS:[ECX]
00403F13 894D 88 MOV DWORD PTR SS:[EBP-78],ECX
00403F16 50 PUSH EAX
00403F17 51 PUSH ECX
00403F18 E8 15000000 CALL 0.00403F32 ; JMP 到 msvcrt._XcptFilter
00403F1D 59 POP ECX
00403F1E 59 POP ECX
00403F1F C3 RETN
------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)