首页
社区
课程
招聘
[分享] 手脱加双层壳的病毒(PECompact 2.x壳+未知壳)
发表于: 2011-3-6 08:52 4742

[分享] 手脱加双层壳的病毒(PECompact 2.x壳+未知壳)

2011-3-6 08:52
4742
前言:
    简单介绍下病毒样本“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日开班!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享,调试这方面的知识还是需要经验累积才能派上用场,最近在调试一个小程序弄了半天都没把壳去掉,每次都是用OD带壳跳过验证来执行程序..继续学习...
2011-3-7 14:53
0
游客
登录 | 注册 方可回帖
返回