首页
社区
课程
招聘
[旧帖] [原创]手脱加三层壳(未知壳+UPX壳+未知壳)的病毒样本程序 0.00雪花
2008-5-22 10:46 11830

[旧帖] [原创]手脱加三层壳(未知壳+UPX壳+未知壳)的病毒样本程序 0.00雪花

2008-5-22 10:46
11830
///////////////////////////////////////////////////////////////////////////////////////////////
文件名称:手脱加三层壳(未知壳+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
------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (14)
雪    币: 317
活跃值: (93)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
范范love 3 2008-5-22 11:41
2
0
程序丢出来练下手啊!!!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sizhaoming 2008-5-22 12:41
3
0
小弟请问楼主:

1、如何获得“三层壳”的认识呀?
2、具是采用“脱一层修补,再脱再修补”还是“一鼓作气剥到底”的方法呢??

万分感谢!~~
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qy黄文超 2008-5-22 12:54
4
0
加精算了吧~~!
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
coderui 2 2008-5-22 14:29
5
0
呵呵,分享是没问题的。
只是如果“看雪论坛”允许上传病毒的话。呵呵
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
coderui 2 2008-5-22 14:30
6
0
呵呵。谢谢支持。我也喜欢“精华”。
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
coderui 2 2008-5-22 14:38
7
0
问题:1、如何获得“三层壳”的认识呀?
回答:貌似没有识别这个的软件,呵呵。只可以去根据经验自己去判断。因为一般壳都有明显的分界线,如果你见过的壳足够多的话,当你脱去一层壳时,自己是知道的。然后记住自己一共脱了几层壳,就知道目标程序一个加了几层壳的。

问题:2、具是采用“脱一层修补,再脱再修补”还是“一鼓作气剥到底”的方法呢??
回答:最好的方法当然是全部脱完在修复,呵呵。如果没脱完你修复的并不一定是程序内部的输入表的。你可以脱一层记一点笔记,方便再次脱时提高效率。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sizhaoming 2008-5-22 16:47
8
0
感谢高人耐心解答~~看来我辈新人还是需要狠狠的积累经验先……
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
coderui 2 2008-5-22 17:15
9
0
呵呵,客气。我也很一般的。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fszwx 2008-5-22 17:36
10
0
有谁会脱Winlicense加壳软件呢
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wenxiang 2008-5-22 19:22
11
0
工程师就是强
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 7 2008-5-23 01:45
12
0
“最外一层”纯粹就是花指令啊……
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
coderui 2 2008-5-23 12:20
13
0
恩,前边这个壳和UPX壳是分开的。
应该是有个专门的“简单加壳”软件加上去的。所以也算是一层壳的。呵呵
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
windtrace 2008-5-23 17:30
14
0
学习了,谢谢楼主分享
雪    币: 395
活跃值: (530)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lwykj 2008-5-23 17:43
15
0
学习ing ! 多谢分享
游客
登录 | 注册 方可回帖
返回