黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 软件破解 >> 正文
·完美空间提供500M免费AS04-10·企业安全之YY内网准入以04-09
·企业安全之意识与策略04-09·剑走偏锋:IIS漏洞利用04-09
·我来免费网提供100M免费04-09·1122mb.com提供20G超大免04-08
·映像劫持与反劫持技术04-07·让所有"暴力删除工具"无04-07
·入侵88red系统的详细过程04-07·Sql Injection脚本注入终04-07
·vbs+delphi 反弹后门生成04-07·飞讯网提供100MB免费PHP04-07
·突破SQL注入攻击时输入框04-04·结合内核和病毒技术的最04-04
·Real Player rmoc3260.d04-04·亿万网络今月最后为您提04-04
·php+mysql 5 sql inject04-03·Real Player rmoc3260.d04-03
·oblog文件下载漏洞04-03·免费啦提供1G-2G免费全能04-03
·完全解析网页后门和挂马04-02·一句话开3389(只测试过04-02
·萧萧免费空间网提供100M04-02·谷道免费空间网提供1G免04-01
·从本地入手解决双线路由03-31·sablog 1.6 多个跨站漏洞03-31
·富文本编辑器的跨站脚本03-31·Cookie注入是怎样产生的03-31
[推荐]Softwrap脱壳总结
      ★★★★★

Softwrap脱壳总结

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-11-15 10:22:23

作 者: wangshq397
时 间: 2006-11-14,20:47
本文中的程序:http://www.fractalpc.com/resources/SetupFractalPC30.exe

取得完整的输入表:
断点:GetModuleHandleA,普通断点要下在函数末尾,否则会被检测到,当堆栈出现如下内容时,返回:
0012FF98   00459CF5  返回到 FractalP.00459CF5
0012FF9C   00000000
0012FFA0   00B20000
0012FFA4   0012FFE0  指向下一个 SEH 记录的指针
壳会检测单步执行,如果能避开检测的话,会来到这里:
0045B7F6    F6C3 02         test    bl, 2
0045B7F9    74 21           je      short 0045B81C        这里决定是否把函数代码抽走,改成jmp
0045B7FB    FFB5 DF1C0000   push    dword ptr [ebp+1CDF]
0045B801    6A 10           push    10
0045B803    50              push    eax
0045B804    FFB5 DF1C0000   push    dword ptr [ebp+1CDF]
下面是循环的底部:
0045B827    C1E2 02         shl     edx, 2
0045B82A    83C6 04         add     esi, 4
0045B82D    57              push    edi
0045B82E    51              push    ecx
0045B82F    6A 03           push    3                        push 3,所以每个函数会储存3次
0045B831    59              pop     ecx
0045B832    8D7E F4         lea     edi, dword ptr [esi-C]
0045B835    F3:AB           rep     stos dword ptr es:[edi]   这里储存需要用到的函数,数据窗口定位在edi上
0045B837    59              pop     ecx
0045B838    5F              pop     edi
0045B839    35 BB82506D     xor     eax, 6D5082BB
0045B83E    890413          mov     dword ptr [ebx+edx], eax
0045B841  ^ E9 58FFFFFF     jmp     0045B79E
0045B846    41              inc     ecx
0045B847  ^ E9 94FEFFFF     jmp     0045B6E0
0045B84C    FFB5 E31C0000   push    dword ptr [ebp+1CE3]     在这里下断,运行,数据窗口会看见函数列表,复制出来.

然后,找到oep,在oep处中断,把复制出来的输入函数列表挪到原来的输入表的位置,记住每个函数只复制一次就行了,不同的dll中间需要用一行00000000隔开,以利于区分.

壳没有抽取代码,其主要表现形式有三种:
第一种:
CALL [004XXXXX] 变成 CALL [00XXXXXX] 的形式,当然这个形式里面的 00XXXXXX 表现为不同的地址,这里的00XXXXXX是壳里的地址,由于我们跳开了抽取函数代码,所以最后会返回到函数的地址,修复的方法是找到所有这样的地址,然后跟踪一下
进入一个这样的call:
首先传递一些参数:
0045C013    6A 00           push    0
0045C015    9C              pushfd
0045C016    50              push    eax
0045C017    53              push    ebx
0045C018    8B5C24 10       mov     ebx, dword ptr [esp+10]
0045C01C    53              push    ebx
0045C01D    83EB 06         sub     ebx, 6
0045C020    68 E9260000     push    26E9
0045C025    68 0000B300     push    0B30000       变形call
0045C02A    C3              retn
来到00B30000,这里通过堆栈,利用产生的另外几个区段的数据计算出函数地址:
00B30000    55              push    ebp
00B30001    56              push    esi
00B30002    57              push    edi
00B30003    51              push    ecx
00B30004    52              push    edx
00B30005    50              push    eax
00B30006    BD 1A994500     mov     ebp, 45991A
00B3000B    016C24 18       add     dword ptr [esp+18], ebp
00B3000F    2B9D 962A0000   sub     ebx, dword ptr [ebp+2A96]
00B30015    8BBD DE2A0000   mov     edi, dword ptr [ebp+2ADE]
00B3001B    8B8D DA2A0000   mov     ecx, dword ptr [ebp+2ADA]
00B30021    8BC3            mov     eax, ebx
00B30023    2B85 D22A0000   sub     eax, dword ptr [ebp+2AD2]
00B30029    D3E8            shr     eax, cl
00B3002B    8B0487          mov     eax, dword ptr [edi+eax*4]
00B3002E    8BF0            mov     esi, eax
00B30030    81E6 FFFF0000   and     esi, 0FFFF
00B30036    C1E8 10         shr     eax, 10
00B30039    8BF8            mov     edi, eax
00B3003B    8D043E          lea     eax, dword ptr [esi+edi]
00B3003E    BA 06639227     mov     edx, 27926306
00B30043    D1E8            shr     eax, 1
00B30045    8BC8            mov     ecx, eax
00B30047    69C9 8466DA44   imul    ecx, ecx, 44DA6684
00B3004D    2BD1            sub     edx, ecx
00B3004F    8B8D FA2A0000   mov     ecx, dword ptr [ebp+2AFA]
00B30055    51              push    ecx
00B30056    8B0CC1          mov     ecx, dword ptr [ecx+eax*8]
00B30059    33CA            xor     ecx, edx
00B3005B    3BCB            cmp     ecx, ebx
00B3005D    59              pop     ecx
00B3005E    74 0C           je      short 00B3006C
00B30060    77 05           ja      short 00B30067
00B30062    8D78 01         lea     edi, dword ptr [eax+1]
00B30065  ^ EB D4           jmp     short 00B3003B
00B30067    8D70 FF         lea     esi, dword ptr [eax-1]
00B3006A  ^ EB CF           jmp     short 00B3003B
00B3006C    8B5C24 1C       mov     ebx, dword ptr [esp+1C]
00B30070    3354C1 04       xor     edx, dword ptr [ecx+eax*8+4]
00B30074    0FB61B          movzx   ebx, byte ptr [ebx]
00B30077    2BD3            sub     edx, ebx
00B30079    8BB5 EA2A0000   mov     esi, dword ptr [ebp+2AEA]
00B3007F    8B0496          mov     eax, dword ptr [esi+edx*4]
00B30082    35 67B6BDD0     xor     eax, D0BDB667
00B30087    50              push    eax
00B30088    8A00            mov     al, byte ptr [eax]
00B3008A    04 0F           add     al, 0F
00B3008C    74 11           je      short 00B3009F
00B3008E    F6D8            neg     al
00B30090    2C 23           sub     al, 23
00B30092    74 0B           je      short 00B3009F
00B30094    FEC8            dec     al
00B30096    74 07           je      short 00B3009F
00B30098    FEC8            dec     al
00B3009A    74 03           je      short 00B3009F
00B3009C    F8              clc
00B3009D    EB 1E           jmp     short 00B300BD
00B3009F    8B0424          mov     eax, dword ptr [esp]
00B300A2    8B00            mov     eax, dword ptr [eax]
00B300A4    330424          xor     eax, dword ptr [esp]
00B300A7    C1E8 18         shr     eax, 18
00B300AA    84C0            test    al, al
00B300AC  ^ 74 EE           je      short 00B3009C
00B300AE    8B0424          mov     eax, dword ptr [esp]
00B300B1    8A40 01         mov     al, byte ptr [eax+1]
00B300B4    34 C3           xor     al, 0C3
00B300B6  ^ 74 E4           je      short 00B3009C
00B300B8    83C4 04         add     esp, 4
00B300BB    50              push    eax
00B300BC    F9              stc
00B300BD    58              pop     eax
00B300BE    73 02           jnb     short 00B300C2
00B300C0    33C0            xor     eax, eax
00B300C2    50              push    eax
00B300C3    5B              pop     ebx
00B300C4    58              pop     eax
00B300C5    5A              pop     edx
00B300C6    59              pop     ecx
00B300C7    5F              pop     edi
00B300C8    5E              pop     esi
00B300C9    5D              pop     ebp
00B300CA    830424 08       add     dword ptr [esp], 8
00B300CE    C2 0400         retn    4
返回到这里:
0045C00F    5B              pop     ebx
0045C010    58              pop     eax
0045C011    9D              popfd
0045C012    C3              retn

这只是其中一种00XXXXXX地址 的 CALL [00XXXXXX] 的返回地址,如果里面的00XXXXXX 不同的话返回地址是不同的,跟一下就知道了,由于已经制造好了一个输入表,因此可以在这里比较输入表和这里的esp的值即产生的函数地址,相同的话,就把这句代码修复好.
比如:401000 call [00XXXXXX] 得到 esp 值是 74142545 而输入表 中 402000的地址也是 74142545 ,那就改成:401000 call [402000],具体操作可以通过path一段代码来自动完成.

[1] [2] 下一页

文章录入:cainiaowang    责任编辑:cainiaowang 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886