首页
社区
课程
招聘
[原创]堀北压缩 0.28 beta脱壳
2007-5-6 20:20 16056

[原创]堀北压缩 0.28 beta脱壳

2007-5-6 20:20
16056
【  标题  】 堀北压缩 0.28 beta脱壳
【  作者  】 linxer
【  Q  Q  】 3568599
【破解平台】 盗版xp sp2
【脱壳工具】 OllyICE + OllyDump插件
【待脱软件】 mouserate.exe 见附件(用堀北压缩 0.28 beta加壳)
【  声明  】 初学脱壳,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

这款壳,脱法很简单,不过,在网上搜了下,貌似还没人写这个脱文,这里就粗略写一篇出来吧

OD加载程序,程序停留在入口

00401000 >/$  68 37A34000   push    0040A337
00401005  |.  E8 01000000   call    0040100B                                ;调用一个空函数
0040100A  \.  C3            retn                                        ;F7后 到0x0040A337处执行
0040100B   $  C3            retn

0040A337    B8 49A30000     mov     eax, 0A349                                ;随着指令的执行,等下这个指令的立即数会改变,目前不管,F7
0040A33C    BA 00004000     mov     edx, 00400000
0040A341    03C2            add     eax, edx
0040A343    FFE0            jmp     eax                                        ;跳到0x0040A349执行
0040A345    B1 15           mov     cl, 15                                ;它和下一条指令,其实是代码中夹杂的一个4字节数据
0040A347    0000            add     byte ptr [eax], al
0040A349    60              pushad
0040A34A    E8 00000000     call    0040A34F                                ;这个地方应该在重定位程序上有用吧
0040A34F    5E              pop     esi                                      ; mouserat.0040A34F
0040A350    83EE 0A         sub     esi, 0A
0040A353    8B06            mov     eax, dword ptr [esi]
0040A355    03C2            add     eax, edx
0040A357    8B08            mov     ecx, dword ptr [eax]
0040A359    894E F3         mov     dword ptr [esi-D], ecx
0040A35C    83EE 0F         sub     esi, 0F
0040A35F    56              push    esi
0040A360    52              push    edx
0040A361    8BF0            mov     esi, eax
0040A363    AD              lods    dword ptr [esi]
0040A364    AD              lods    dword ptr [esi]
0040A365    03C2            add     eax, edx
0040A367    8BD8            mov     ebx, eax
0040A369    6A 04           push    4
0040A36B    BF 00100000     mov     edi, 1000
0040A370    57              push    edi
0040A371    57              push    edi
0040A372    6A 00           push    0
0040A374    FF53 08         call    dword ptr [ebx+8]                        ;VirtualAlloc调用
0040A377    5A              pop     edx
0040A378    59              pop     ecx
0040A379    BD 00800000     mov     ebp, 8000
0040A37E    55              push    ebp
0040A37F    6A 00           push    0
0040A381    50              push    eax
0040A382    51              push    ecx
0040A383    52              push    edx
0040A384    50              push    eax
0040A385    8906            mov     dword ptr [esi], eax
0040A387    AD              lods    dword ptr [esi]
0040A388    AD              lods    dword ptr [esi]
0040A389    03C2            add     eax, edx
0040A38B    50              push    eax
0040A38C    AD              lods    dword ptr [esi]
0040A38D    03C2            add     eax, edx
0040A38F    FFD0            call    eax                                        ;F8步过(这里解密出来一部分代码到刚分配内存中)
0040A391    6A 04           push    4
0040A393    57              push    edi
0040A394    AD              lods    dword ptr [esi]
0040A395    50              push    eax
0040A396    6A 00           push    0
0040A398    FF53 08         call    dword ptr [ebx+8]                        ;VirtualAlloc调用
0040A39B    5A              pop     edx
0040A39C    55              push    ebp
0040A39D    6A 00           push    0
0040A39F    50              push    eax                                        ;压入VirtualFree的参数
0040A3A0    FF73 0C         push    dword ptr [ebx+C]                        ;压入VirtualFree地址,在处理完导入表后,用ret指令触发这个函数释放内存
0040A3A3    52              push    edx
0040A3A4    6A 04           push    4
0040A3A6    57              push    edi
0040A3A7    8BF8            mov     edi, eax
0040A3A9    55              push    ebp
0040A3AA    6A 00           push    0
0040A3AC    FF53 08         call    dword ptr [ebx+8]                        ;VirtualAlloc调用
0040A3AF    5A              pop     edx
0040A3B0    55              push    ebp
0040A3B1    6A 00           push    0
0040A3B3    50              push    eax                                        ;压入VirtualFree的参数
0040A3B4    FF73 0C         push    dword ptr [ebx+C]                        ;压入VirtualFree地址,在处理完导入表后,用ret指令触发这个函数释放内存
0040A3B7    FF3424          push    dword ptr [esp]                        ;再次压入VirtualFree地址
0040A3BA    8BC8            mov     ecx, eax
0040A3BC    50              push    eax
0040A3BD    54              push    esp
0040A3BE    FF76 FC         push    dword ptr [esi-4]
0040A3C1    57              push    edi
0040A3C2    AD              lods    dword ptr [esi]
0040A3C3    50              push    eax
0040A3C4    AD              lods    dword ptr [esi]
0040A3C5    03C2            add     eax, edx
0040A3C7    50              push    eax
0040A3C8    55              push    ebp
0040A3C9    51              push    ecx
0040A3CA    8BEA            mov     ebp, edx
0040A3CC    FF56 E8         call    dword ptr [esi-18]                        ;F8步过(这里跳到第一次分的内存中执行,里面貌似在解压代码到第二次分配内存)
0040A3CF    58              pop     eax
0040A3D0    012E            add     dword ptr [esi], ebp
0040A3D2    8B3E            mov     edi, dword ptr [esi]
0040A3D4    AD              lods    dword ptr [esi]
0040A3D5    50              push    eax
0040A3D6    AD              lods    dword ptr [esi]
0040A3D7    50              push    eax
0040A3D8    AD              lods    dword ptr [esi]
0040A3D9    50              push    eax
0040A3DA    AD              lods    dword ptr [esi]
0040A3DB    50              push    eax
0040A3DC    33C0            xor     eax, eax
0040A3DE    B9 80010000     mov     ecx, 180
0040A3E3    F3:AB           rep     stos dword ptr es:[edi]
0040A3E5    8B7424 28       mov     esi, dword ptr [esp+28]
0040A3E9    AC              lods    byte ptr [esi]
0040A3EA    8BD0            mov     edx, eax
0040A3EC    AD              lods    dword ptr [esi]
0040A3ED    8BF8            mov     edi, eax
0040A3EF    03FD            add     edi, ebp
0040A3F1    AD              lods    dword ptr [esi]
0040A3F2    8BC8            mov     ecx, eax
0040A3F4    F3:A4           rep     movs byte ptr es:[edi], byte ptr [esi]        ;拷解压代码到程序中
0040A3F6    4A              dec     edx
0040A3F7  ^ 75 F3           jnz     short 0040A3EC                                ;这里一个小循环,在它下一指令F4
0040A3F9    59              pop     ecx                                                ;F4
0040A3FA    5A              pop     edx
0040A3FB    58              pop     eax
0040A3FC    5F              pop     edi
0040A3FD    85C0            test    eax, eax                                        ;又要出现循环了,到0x0040A41D处F4
0040A3FF    74 1C           je      short 0040A41D
0040A401    57              push    edi
0040A402    8A07            mov     al, byte ptr [edi]
0040A404    47              inc     edi
0040A405    2C E8           sub     al, 0E8
0040A407    3C 01           cmp     al, 1
0040A409  ^ 77 F7           ja      short 0040A402
0040A40B    8B07            mov     eax, dword ptr [edi]
0040A40D    3AC2            cmp     al, dl
0040A40F  ^ 75 F1           jnz     short 0040A402
0040A411    32C0            xor     al, al
0040A413    0FC8            bswap   eax
0040A415    030424          add     eax, dword ptr [esp]
0040A418    2BC7            sub     eax, edi
0040A41A    AB              stos    dword ptr es:[edi]
0040A41B  ^ E2 E5           loopd   short 0040A402                                ;循环里的代码在搞啥东东,俺不知道
0040A41D    55              push    ebp                                                ;F4
0040A41E    AD              lods    dword ptr [esi]
0040A41F    85C0            test    eax, eax

        //下面代码处理导入表,dll名称,函数序号,函数名称在esi指定的地方,每个dll信息导入信息排列如下:
        1.最开始是dll名称,然后紧接是其导出的函数序号/函数名,最后是一个长整型的0
0040A421    74 37           je      short 0040A45A                                ;这个循环里,出口是0x0040A45A,可以到这个地方F4
0040A423    8BF8            mov     edi, eax
0040A425    033C24          add     edi, dword ptr [esp]
0040A428    56              push    esi
0040A429    FF13            call    dword ptr [ebx]                                ;LoadLibraryA调用
0040A42B    8BE8            mov     ebp, eax
0040A42D    AC              lods    byte ptr [esi]
0040A42E    84C0            test    al, al
0040A430  ^ 75 FB           jnz     short 0040A42D                                ;这个小循环在寻找dll名称结束地址
0040A432    AD              lods    dword ptr [esi]
0040A433    85C0            test    eax, eax                                        ;看是否处理完这个dll
0040A435  ^ 74 E7           je      short 0040A41E                                ;处理完则跳,处理下一个dll
0040A437    83EE 04         sub     esi, 4
0040A43A    AD              lods    dword ptr [esi]                                ;装函数序号或函数名前4字节到eax
0040A43B    A9 00000080     test    eax, 80000000                                ;判定是否序号导出,如是函数名也能正常工作,因为ascii最高位为0
0040A440    75 0B           jnz     short 0040A44D
0040A442    83EE 04         sub     esi, 4                                        ;函数名导出情况
0040A445    56              push    esi
0040A446    55              push    ebp
0040A447    FF53 04         call    dword ptr [ebx+4]                                ;GetProcAddress调用
0040A44A    AB              stos    dword ptr es:[edi]
0040A44B  ^ EB E0           jmp     short 0040A42D
0040A44D    25 FFFFFF7F     and     eax, 7FFFFFFF                                ;序号导出情况
0040A452    50              push    eax
0040A453    55              push    ebp
0040A454    FF53 04         call    dword ptr [ebx+4]                                ;GetProcAddress调用
0040A457    AB              stos    dword ptr es:[edi]
0040A458  ^ EB D8           jmp     short 0040A432
0040A45A    5D              pop     ebp                                                ;在这个地方F4,可以不详细跟导入表处理
0040A45B    5F              pop     edi
0040A45C    C3              retn                                                ;运行到这个地方,看下堆栈吧

堆栈如下:
0012FF70   7C809AE4  kernel32.VirtualFree        ;retn指令触发这个VirtualFree调用,这个调用的返回地址还是VirtualFree,参数是
0012FF74   7C809AE4  kernel32.VirtualFree        ;第一次VirtualFree调用时返回地址
0012FF78   00390000                                ;第一次VirtualFree调用参数
0012FF7C   00000000                                ;第一次VirtualFree调用参数
0012FF80   00008000                                ;第一次VirtualFree调用参数
0012FF84   7C809AE4  kernel32.VirtualFree
0012FF88   00380000
0012FF8C   00000000
0012FF90   00008000
0012FF94   0040A336  返回到 mouserat.0040A336
0012FF98   00370000
0012FF9C   00000000
0012FFA0   00008000

将上面堆栈产生效果分解下:

第一个VirtualFree调用完后,马上会执行第二个VirtualFree,这个时候的堆栈为:
0012FF84   7C809AE4  kernel32.VirtualFree      ;第二次VirtualFree调用时返回地址,可见又是一个VirtualFree
0012FF88   00380000                            ;第二次VirtualFree调用参数      
0012FF8C   00000000                            ;第二次VirtualFree调用参数      
0012FF90   00008000                            ;第二次VirtualFree调用参数      
0012FF94   0040A336  返回到 mouserat.0040A336
0012FF98   00370000
0012FF9C   00000000
0012FFA0   00008000

第二个VirtualFree调用完后,马上会执行第三个VirtualFree,这个时候的堆栈为:
0012FF94   0040A336  返回到 mouserat.0040A336        ;这个是返回地址,终于要返回我们想要的地方了
0012FF98   00370000                                ;VirtualFree的三个参数
0012FF9C   00000000
0012FFA0   00008000

从上面分析知,程序在完成三个VirtualFree调用后,将返回0040A336这个地方执行,在这个地方下断点,bp 0x0040a336,然后F9,到如下地方:

0040A336    61              popad
0040A337    B8 F01B0000     mov     eax, 1BF0
0040A33C    BA 00004000     mov     edx, 00400000
0040A341    03C2            add     eax, edx
0040A343    FFE0            jmp     eax                        ;终于要到OEP了,F7进入到下面代码

00401BF0   .  55            push    ebp                        ;在这个地方用ollydump插件dump吧
00401BF1   .  8BEC          mov     ebp, esp
00401BF3   .  6A FF         push    -1
00401BF5   .  68 90254000   push    00402590
00401BFA   .  68 001E4000   push    00401E00                                 ;  jmp 到 msvcrt._except_handler3; SE 处理程序安装
00401BFF   .  64:A1 0000000>mov     eax, dword ptr fs:[0]

dump出来程序可以运行,优化就不做了,因为我不太会,还有待学习呢

这里总结下这个壳的脱法:
        1.bp VirtualFree,在第三次执行这个函数时,在返回地址在下断点,运行到这个断点处
        2.在单步执行5条指令到OEP
       
当然这个壳也可以用ESP定律秒杀

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 7
打赏
分享
最新回复 (23)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjhfast 2007-5-6 22:37
2
0
压缩壳脱壳都不难,难得楼主的帖子分析的很详细。学习了。
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
KuNgBiM 66 2007-5-6 22:45
3
0
直接用Quick Unpack或de!Packer 脱
雪    币: 35386
活跃值: (19270)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2007-5-6 22:56
4
0
建议linxer将堀北压缩逆一下 ;)
雪    币: 1746
活跃值: (292)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
linxer 11 2007-5-7 01:45
5
0
俺目前好像还没有这个实力,努力中......
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2007-5-7 19:28
6
0
很厉害啊啊啊
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2007-5-7 23:10
7
0
有这个实力的时候就没有必要逆了
雪    币: 239
活跃值: (473)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
hmimys 2 2007-5-8 08:20
8
0
shoooo的东东变态的很,思路不是一般人能理解的!
雪    币: 29
活跃值: (1844)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
dryzh 2007-5-8 10:32
9
0
这壳我好像见过fly大虾还是谁写过脚本了
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
binbinbin 28 2007-5-8 12:42
10
0
看上面的后几行字就可以做脱壳脚本了,应该是这样
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2007-5-8 13:36
11
0
压缩壳的OEP脚本通常不难写
KByS V0.28 OEP Find Script
http://www.unpack.cn/viewthread.php?tid=4642
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
skylly 4 2007-5-8 14:32
12
0
这是我以前写的脱kbys的插件代码

//关键脱壳函数--API
extern "C" void WINAPI StartUnpack(PROCESS_INFORMATION pi, DWORD dwBaseAddress, DWORD dwEntryPoint)
{       
        DWORD dwPid = pi.dwProcessId;
        DWORD dwTid = pi.dwThreadId;
        HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
        HANDLE hThread = ::OpenThread(THREAD_ALL_ACCESS, FALSE, dwTid);
        ASSERT(hProcess);
        ASSERT(hThread);

        //发消息表示开始脱壳
        DWORD dwOep = 0;
        DWORD dwRead = 0;
        CONTEXT context;

        UCHAR szFirst[] = {0xE8, 0x01, 0x00, 0x00, 0x00, 0xC3, 0xC3};
        DWORD dwMagic = FindMemory(hProcess, dwEntryPoint, szFirst, sizeof(szFirst), 0x100);
        if (dwMagic != dwEntryPoint + 5)
        {//shoooo超级伪装壳
                TellUnpacker(g_szError);
                return  Terminate(hProcess, hThread);
        }       
       
beginning:
        DWORD dwNewPP = 0;
        ReadMemory(hProcess, dwEntryPoint + 1, &dwNewPP, 4, &dwRead);
        GO(hProcess, hThread, dwNewPP, context);

        UCHAR szNewJmp[] = {0xFF, 0xE0};
        dwMagic = FindMemory(hProcess, dwNewPP, szNewJmp, sizeof(szNewJmp), 0x100);
        if (dwMagic != (dwNewPP + 0xC))
        {
                DWORD dwLoadLib = GetAddress("kernel32.dll", "LoadLibraryA");

                GO(hProcess, hThread, dwLoadLib, context);

                RTU(hProcess, hThread, context);
                DWORD dwIAT = context.Edi;

                UCHAR szMagic[] = {0xFF, 0x63, 0x0C};
                dwMagic = FindMemory(hProcess, context.Eip,  szMagic, sizeof(szMagic), 0x100);
                if (0 == dwMagic)
                {       
                        //出错
                        TellUnpacker(g_szError);
                        return  Terminate(hProcess, hThread);
                }
                //0.22
                TellUnpacker("kbys 0.22");
                GO(hProcess, hThread, dwMagic, context);
                ReadMemory(hProcess, context.Ebx + 0xC, &dwOep, 4, &dwRead);
                GO(hProcess, hThread, dwOep, context);
                RTU(hProcess, hThread, context);
                dwOep = context.Eip;
                DumeNow(dwOep, dwIAT);
                return  Terminate(hProcess, hThread);
        }
        TellUnpacker("kbys 0.28");
        DWORD dwLoadLib = GetAddress("kernel32.dll", "LoadLibraryA");

        GO(hProcess, hThread, dwLoadLib, context);

        RTU(hProcess, hThread, context);
        DWORD dwIAT = context.Edi;

        GO(hProcess, hThread, dwMagic, context);
        dwOep = context.Eax;
       
        dwEntryPoint = dwOep;

        dwMagic = FindMemory(hProcess, dwEntryPoint, szFirst, sizeof(szFirst), 0x100);
        if (dwMagic == dwEntryPoint + 5)
        {
                if (::MessageBox(g_hWndList, "似乎还有一层,是否继续脱?", "INFO", MB_YESNO) == IDYES)
                        goto beginning;
        }

        DumeNow(dwOep, dwIAT);
        return  Terminate(hProcess, hThread);

}
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nyaodemm 2007-5-28 18:09
13
0
什么时候能出正式版本啊?
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peeler 2007-5-29 16:09
14
0
支持学习~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
蠕虫 2007-6-8 20:27
15
0
楼主有自动脱壳机吗 ?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hozhison 2007-6-9 23:52
16
0
我也去试试~!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yuxuanblue 2007-6-10 00:19
17
0
注册日期: Jul 2005
帖子: 33
精华: 7
声望: 12

不错,文章我也看了。
楼主一共发了33篇文章,其中有7篇都是精华。
可想楼主的能力了。
雪    币: 1746
活跃值: (292)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
linxer 11 2007-6-10 02:27
18
0
这个壳目前好象有挺多万能脱壳机都能脱的,我没有脱壳机,

不过,过段时间,我会放出我写的,完全基于虚拟机的通用脱壳机出来,支持脱这个壳
雪    币: 234
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
cchpro 2007-7-14 16:16
19
0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00401BF0   .  55            push    ebp      ;在这个地方用ollydump插件dump吧
00401BF1   .  8BEC          mov     ebp, esp
00401BF3   .  6A FF         push    -1
00401BF5   .  68 90254000   push    00402590
00401BFA   .  68 001E4000   push    00401E00                                 ;  jmp 到 msvcrt._except_handler3; SE 处理程序安装
00401BFF   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请问用LordPE DUMP 不行嘛
然后再用ImpREC 修复

我试过
ImpREC 居然始终无法OEP定位
呵呵
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lifeting 2007-12-10 09:53
20
0
堀北压缩 0.28 脱壳记录

0100739D   .  6A 70         PUSH 70

偶脱的这个壳的OEP是这里....跟楼主不一样...但这个我搞了一会...如果是初学者可能还不会这个壳.....我也是费了一点劲...本来想放弃.后来试了两把.终于搞定了这个壳..我们的壳的入口是一样.但我跟楼主的方法不一样...呵...反正最后还是脱掉了.用IRP修复.两个指针不行.剪掉了.再重建PE.搞定了...

我喜欢手脱...除非是些特别的壳和难度较高的壳我才用专脱工具...

简单说些我的思路吧

01019F89  ^\EB E0           JMP SHORT 堀北压缩.01019F6B              |在这里不跟往上回走,也不能在这行下面下断.往上走回去了.下走程序运行了.我试过几次.|

OD打开后直接单步走...不用回头.

01019F8B    25 FFFFFF7F     AND EAX,7FFFFFFF
01019F90    50              PUSH EAX
01019F91    55              PUSH EBP
01019F92    FF53 04         CALL DWORD PTR DS:[EBX+4]
01019F95    AB              STOS DWORD PTR ES:[EDI]
01019F96  ^ EB D8           JMP SHORT 堀北压缩.01019F70
01019F98    5D              POP EBP                             |在这里下断.上面的不用管它|
01019F99    5F              POP EDI
01019F9A    C3              RETN                                   |这里返回|

7C809AE4 >  8BFF            MOV EDI,EDI               | 接着上面的.返回到这里,再接着单步走|
7C809AE6    55              PUSH EBP
7C809AE7    8BEC            MOV EBP,ESP
7C809AE9    FF75 10         PUSH DWORD PTR SS:[EBP+10]
7C809AEC    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
7C809AEF    FF75 08         PUSH DWORD PTR SS:[EBP+8]
7C809AF2    6A FF           PUSH -1
7C809AF4    E8 09000000     CALL kernel32.VirtualFreeEx
7C809AF9    5D              POP EBP
7C809AFA    C2 0C00         RETN 0C            |走到这里他又返回了.不过是返回到|7C809AE4 >  8BFF 这里了..晕..就像一个回圈一样..不过他一直这样.跟本往下走不了|
7C809AFD    90              NOP
7C809AFE    90              NOP
7C809AFF    90              NOP
7C809B00    90              NOP
7C809B01    90              NOP
7C809B02 >  8BFF            MOV EDI,EDI          |偶在这里F4下断,接着单步|
7C809B04    55              PUSH EBP
7C809B05    8BEC            MOV EBP,ESP
7C809B07    F645 15 80      TEST BYTE PTR SS:[EBP+15],80
7C809B0B    74 0A           JE SHORT kernel32.7C809B17
7C809B0D    837D 10 00      CMP DWORD PTR SS:[EBP+10],0
7C809B11    0F85 BE690300   JNZ kernel32.7C8404D5
7C809B17    56              PUSH ESI
7C809B18    8B35 A811807C   MOV ESI,DWORD PTR DS:[<&ntdll.NtFreeVirt>; ntdll.ZwFreeVirtualMemory
7C809B1E    57              PUSH EDI
7C809B1F    FF75 14         PUSH DWORD PTR SS:[EBP+14]
7C809B22    8D45 10         LEA EAX,DWORD PTR SS:[EBP+10]
7C809B25    50              PUSH EAX
7C809B26    8D45 0C         LEA EAX,DWORD PTR SS:[EBP+C]
7C809B29    50              PUSH EAX
7C809B2A    FF75 08         PUSH DWORD PTR SS:[EBP+8]
7C809B2D    FFD6            CALL ESI
7C809B2F    8BF8            MOV EDI,EAX
7C809B31    85FF            TEST EDI,EDI
7C809B33    0F8C 68C60200   JL kernel32.7C8361A1
7C809B39    33C0            XOR EAX,EAX
7C809B3B    40              INC EAX
7C809B3C    5F              POP EDI
7C809B3D    5E              POP ESI
7C809B3E    5D              POP EBP
7C809B3F    C2 1000         RETN 10                 |走到这里后他又开始返回了|

7C809AF9    5D              POP EBP                     |返回到这里了.又要返回.日|      
7C809AFA    C2 0C00         RETN 0C                 |返回到这里了.跟着走吧|   

01019E74    61              POPAD                        |这里开始出来了.跟着走吧.慢慢来.|
01019E75    B8 9D730000     MOV EAX,739D
01019E7A    BA 00000001     MOV EDX,堀北压缩.01000000
01019E7F    03C2            ADD EAX,EDX
01019E81    FFE0            JMP EAX                    |嘿嘿.不用偶说吧.这里大伙应该很熟了.|

0100739D   .  6A 70         PUSH 70                    |这是哪大伙都知道了吧.不过说一下.来到这里时要CTRL+A分析一下.再脱吧.方法是这样.搞定了.|
0100739F   .  68 98180001   PUSH 堀北压缩.01001898
010073A4   .  E8 BF010000   CALL 堀北压缩.01007568
010073A9   .  33DB          XOR EBX,EBX
010073AB   .  53            PUSH EBX                                 ; /pModule => NULL

最后用IRP修复.两个指针不行.剪掉了.再重建PE.......
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
abxcc 2007-12-10 11:09
21
0
学习下  以后肯定用的着
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zyljvx 2007-12-12 14:43
22
0
厉害!!!!!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zyljvx 2007-12-12 14:51
23
0
佩服!!!!!1
雪    币: 273
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yhxing 2017-9-25 09:11
24
0
怎么同样的,手动过就跑飞呢。
游客
登录 | 注册 方可回帖
返回