本类共有 70 篇文章,今日更新 0

nspack3.5主程序脱壳分析(Aspr SKE 2.X)

[ 来源:http://www.91now.com/down/ | 作者: | 时间:2007-5-18 18:30:00 | 浏览: 人次 ]


nspack 3.5 主程序脱壳介绍
xp sp2
flyodbg
Aspr SKE 2.X


零  需要哪里就重新来过重点分析哪里
come on let's go


一  PEiD可以不用, 但LordPE一定要先加载看看
.rsrc段上面有三个区段,没有名字,不过可以猜到是.text、.rdata和.data段,是VC的程序


二  看看能不能在OD下跑起来
OD载入nspack.exe,忽略所有异常,清除所有断点, 打上IsDebuggerPresent插件
F9运行  gogogo~
正常情况下能跑起来,alt+e看看加载的dll,看到有msvcrt.dll,没有发现mfc的dll
所以是普通VC或MFC静态
我猜我猜我猜猜猜


三  到oep看看
重来,OD截入,忽略所有...清除...打上..插件
到GetVersion的末尾retn下断
 
    7C8114AB kernel32.GetVersion      64:A1 18000000   mov eax,dword ptr fs:[18]
    7C8114B1                          8B48 30          mov ecx,dword ptr ds:[eax+30]
    7C8114B4                          8B81 B0000000    mov eax,dword ptr ds:[ecx+B0]
    7C8114BA                          0FB791 AC000000  movzx edx,word ptr ds:[ecx+AC]
    7C8114C1                          83F0 FE          xor eax,FFFFFFFE
    7C8114C4                          C1E0 0E          shl eax,0E
    7C8114C7                          0BC2             or eax,edx
    7C8114C9                          C1E0 08          shl eax,8
    7C8114CC                          0B81 A8000000    or eax,dword ptr ds:[ecx+A8]
    7C8114D2                          C1E0 08          shl eax,8
    7C8114D5                          0B81 A4000000    or eax,dword ptr ds:[ecx+A4]
    7C8114DB                          C3               retn                              //这里下断

F9运行,断下,F8返回,向上看看,看到oep了

    00486C68                          55               push ebp
    00486C69                          8BEC             mov ebp,esp
    00486C6B                          6A FF            push -1
    00486C6D                          68 38FB4A00      push nSpack.004AFB38
    00486C72                          68 50554800      push nSpack.00485550
    00486C77                          64:A1 00000000   mov eax,dword ptr fs:[0]
    00486C7D                          50               push eax
    00486C7E                          64:8925 00000000 mov dword ptr fs:[0],esp
    00486C85                          83EC 58          sub esp,58
    00486C88                          53               push ebx
    00486C89                          56               push esi
    00486C8A                          57               push edi
    00486C8B                          8965 E8          mov dword ptr ss:[ebp-18],esp
    00486C8E                          FF15 6C724A00    call dword ptr ds:[4A726C]                      ; kernel32.GetVersion
    00486C94                          33D2             xor edx,edx                      // GetVersion返回到这里

VC6会GetVersion,VC7会GetVersionExA,可以都在末尾下断,到时候看哪个像oep附近就是了


四  输入表
GetVersion是在[4A726C],那么到那个地方向上看看,向下看看,找输入表的范围
结果
4A7000 到 4A7688
输入表没有加密 :)
有时候aspr SKE 2.X会把输入表加密,把一部分导入函数地址改的乱七八糟,可那些加密的地址是不存在的。
那它怎么用那里的导入函数呢? 其实它把代码中所有对加密导入函数的调用从原先的call [IAT]或jmp [IAT]
改成了call 00EA0000这种样子,从它自己的call 00EA0000进入导入函数,这样那些加密的导入函数就可以随便
写一个不存在的地址了。

如果输入表加密了,你可以这样完整修复:
OD截入,忽略所有...清除...打上..插件
随便对一个导入函数地址下内存写断点,比如这里GetVersion的4A726C
断了若干次后到这里
    00C5764D        8902          mov dword ptr ds:[edx],eax                 ; // eax指向GetVersion的地址,写入ebx = 4A726C
    00C5764F        E9 20010000   jmp 00C57774

    00C57774        8B45 0C       mov eax,dword ptr ss:[ebp+C]
    00C57777        8300 04       add dword ptr ds:[eax],4
    00C5777A        8D85 FAFEFFFF lea eax,dword ptr ss:[ebp-106]
    00C57780        3BF8          cmp edi,eax
    00C57782        74 07         je short 00C5778B
    00C57784        8BC7          mov eax,edi
    00C57786        E8 D9ADFDFF   call 00C32564
    00C5778B        5F            pop edi
    00C5778C        5E          &n

[1] [2] [3] [4] 下一页

广告位