首页
社区
课程
招聘
[原创][求助]脱一个壳的问题
发表于: 2012-5-20 21:21 4327

[原创][求助]脱一个壳的问题

2012-5-20 21:21
4327
标 题: 【原创】【求助】脱一个壳的问题
作 者: hostzhen
时 间: 2012-05-21
链 接: http://bbs.pediy.com/showthread.php?t=150959
这是一个病毒文件,但是有加壳,用PEID查看无法知道它的壳种类,但是从节名可以推出有可能是UPX壳!
1.加载该文件到OD调试,使用内存栈点查找OEP的方法,在第一个节设置内存断点,然后跟踪进去之后,程序循环解压内存每个字节数据。
2.接着再跳转到另外一个地址填充IAT。
3.紧接着开始单步执行查找OEP,可是遇到几个跳转地址,dump下来之后,用ImportREC.exe重建导入表,导入函数的获取都没有问题,最后FIX DUMP就都报出同样的错误:
Fixing a dumped file...
17 (decimal:23) module(s)
23F (decimal:575) imported function(s).
Can't load C:\Documents and Settings\Administrator\桌面\OD2.exe

哪位兄弟能够帮忙看看这个文件是如何脱壳的???我用了好多方法都找不出它的OEP

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 149
活跃值: (150)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
刚刚弄了一下,原来是该病毒有采取anti-dump技术,通过绕过Anti-Dump顺利脱壳,现在分享下我脱壳的过程:
首先用PEID查看该EXE,如下图所示,虽然无法查出是具体哪种壳,但是从它的节名可以推出应该是UPX


接着打开OD加载该EXE,开始的时候,使用快捷键ATL+M打开内存窗口,在该EXE的第一个节处按下F2设置内存断点,如下图所示:


按下SHIFT+F9运行,断点停留在地址00A90747处,仔细一查看,这部分主要是循环解压内存的每个字节数据,bl每次存储的就是被解压的数据

00A90743   /76 0B           jbe     short 00A90750
00A90745   |8A1A            mov     bl, byte ptr [edx]
[COLOR="Red"]00A90747   |8818            mov     byte ptr [eax], bl[/COLOR]
00A90749   |40              inc     eax
00A9074A   |42              inc     edx
00A9074B   |49              dec     ecx
00A9074C   |85C9            test    ecx, ecx
00A9074E  ^|77 F5           ja      short 00A90745


完成解压后,继续单步执行,直到返回CALL函数的空间,如下所示,仔细对比前后的代码,可以知道这是循环解压各个节数据
00A904DB    8B45 C0         mov     eax, dword ptr [ebp-40]
00A904DE    8B50 0C         mov     edx, dword ptr [eax+C]
00A904E1    0355 DC         add     edx, dword ptr [ebp-24]
00A904E4    8B48 14         mov     ecx, dword ptr [eax+14]
00A904E7    03CE            add     ecx, esi
00A904E9    894D B4         mov     dword ptr [ebp-4C], ecx
00A904EC    8B40 10         mov     eax, dword ptr [eax+10]
00A904EF    50              push    eax
00A904F0    8B45 B4         mov     eax, dword ptr [ebp-4C]
00A904F3    50              push    eax
00A904F4    52              push    edx
[COLOR="red"]00A904F5    FF53 57         call    dword ptr [ebx+57][/COLOR]
00A904F8    8345 C0 28      add     dword ptr [ebp-40], 28
00A904FC    4F              dec     edi
00A904FD    85FF            test    edi, edi
00A904FF  ^ 77 DA           ja      short 00A904DB


继续单步运行,到了如下代码:两个CALL函数,分别是LoadLibraryA和GetProcAddress,这里主要是完成IAT的填充

0051426D   .  037E 04       add     edi, dword ptr [esi+4]
00514270   ?  83C6 0C       add     esi, 0C
00514273   .  57            push    edi
[COLOR="red"]00514274   ?  FF95 65FAFFFF call    dword ptr [ebp-59B][/COLOR]
0051427A   ?  5F            pop     edi
0051427B   .  5A            pop     edx
0051427C   ?  5B            pop     ebx
0051427D   .  83F8 00       cmp     eax, 0
00514280   ?  74 59         je      short 005142DB
00514282   ?  8985 D1F9FFFF mov     dword ptr [ebp-62F], eax
00514288   ?  033E          add     edi, dword ptr [esi]
0051428A   ?  83C6 04       add     esi, 4
0051428D   .  33C9          xor     ecx, ecx
0051428F   .  8A0E          mov     cl, byte ptr [esi]
00514291   .  83F9 00       cmp     ecx, 0
00514294   ?  75 03         jnz     short 00514299
00514296   ?  46            inc     esi
00514297   .^ EB B3         jmp     short 0051424C
00514299   .  8BC7          mov     eax, edi
0051429B   .  03F9          add     edi, ecx
0051429D   .  52            push    edx
0051429E   ?  53            push    ebx
0051429F   .  50            push    eax
005142A0   ?  8038 FF       cmp     byte ptr [eax], 0FF
005142A3   .  75 08         jnz     short 005142AD
005142A5   .  40            inc     eax
005142A6   ?  8B00          mov     eax, dword ptr [eax]
005142A8   ?  25 FFFFFF7F   and     eax, 7FFFFFFF
005142AD   .  8A0F          mov     cl, byte ptr [edi]
005142AF   .  C607 00       mov     byte ptr [edi], 0
005142B2   ?  51            push    ecx
005142B3   .  50            push    eax
005142B4   ?  FFB5 D1F9FFFF push    dword ptr [ebp-62F]
[COLOR="red"]005142BA   ?  FF95 69FAFFFF call    dword ptr [ebp-597][/COLOR]
005142C0   ?  59            pop     ecx
005142C1   .  5A            pop     edx
005142C2   ?  5B            pop     ebx
005142C3   .  5A            pop     edx
005142C4   ?  83F8 00       cmp     eax, 0
005142C7   .  74 12         je      short 005142DB
005142C9   .  880F          mov     byte ptr [edi], cl
005142CB   .  8946 FC       mov     dword ptr [esi-4], eax
005142CE   ?  FF76 FC       push    dword ptr [esi-4]
005142D1   .  8F03          pop     dword ptr [ebx]
005142D3   .  83C3 04       add     ebx, 4
005142D6   ?  46            inc     esi
005142D7   .^ EB B4         jmp     short 0051428D

 


然后继续单步运行:
遇到一条跳转指令JMP 404B54,跟踪过去后,可以推断出这里就是OEP了

接着用LoadPE在该EXE的进程的右键菜单先点击执行“correct ImageSize"(这里就是为什么之前我脱不了壳的原因,anti-dump),然后在dump full


最后重建输入表,使用ImportREC工具很简单方便,如下图所示,填写正确的OEP,和IAT表的RVA和SIZE后点击“Get Imports”,很幸运,都是正确的函数信息,那么最后直接Fix Dump到刚才DUMP下来的文件


至此,该病毒的脱壳成功!!!

上传的附件:
2012-5-21 23:44
0
雪    币: 141
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢2楼朋友  学习了
2012-5-29 08:04
0
游客
登录 | 注册 方可回帖
返回
//