找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 584|回复: 0

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

[复制链接]

45

主题

583

回帖

845

牛毛

一级牛人

黑狼基地。。。我们大家的家

积分
845
QQ
发表于 2008-10-13 14:17:52 | 显示全部楼层 |阅读模式 来自 吉林省松原市
目标程序:病毒样本“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完毕。
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-16 03:01 , Processed in 0.124420 second(s), 23 queries , Yac On.

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表