fengziling 发表于 2009-8-16 11:17:04

【原创】NsPack3.7分析和静态脱壳机(附源码)

标 题: 【原创】NsPack3.7分析和静态脱壳机(附源码)
作 者: nissassA
时 间: 2009-07-30,16:57
链 接: http://bbs.pediy.com/showthread.php?t=94673

NsPack3.7分析和静态脱壳机(附源码)

科锐第四阶段壳专题课后作业。感谢钱老师的细心教导。让我从一个仅仅知道C的人能用C/C++做一些开发,并学会了一些逆向知识。

由于本人技术有限,所以分析的不是很详细。还请各位大牛见谅。如有不足的地方,希望各位及时指出。谢谢。

由于是脱壳机有部分是边分析边写,所以代码风格很差。各位尽管拍砖头吧..

壳版本: Nspack3.7.Cracked.exe
工具: IDA, OD

引用:
外壳shell简单分析

外壳第一部分:
1.申请堆空间
2.处理shell第二部分,并拷贝到堆空间
3.执行完shell第二部分后循环处理E8
4.填写IAT
5.恢复内存属性
6.跳转到OEP

外壳第二部分:
解压数据并拷贝到原地址

外壳shell分析:
代码:
.nsp1:0040A219               pushf                   ; (1).nsp1:0040A21A               pusha.nsp1:0040A21B               call    $+5.nsp1:0040A220               pop   ebp.nsp1:0040A221               sub   ebp, 7          ; 获得当前(1)处地址.nsp1:0040A224               lea   ecx, .nsp1:0040A22A               cmp   byte ptr , 1 ; 标记位.nsp1:0040A22D               jz      loc_40A475.nsp1:0040A233               mov   byte ptr , 1 ; 标记位置1.nsp1:0040A236               mov   eax, ebp.nsp1:0040A238               sub   eax, ; 存放当前 OEP RVA.nsp1:0040A23E               mov   , eax ; image base.nsp1:0040A244               add   , eax ; image base + code seg RVA.nsp1:0040A24A               lea   esi, .nsp1:0040A250               add   , eax      ; image base + code seg RVA.nsp1:0040A252               push    ebp             ; 保存ebp(加壳后程序入口点).nsp1:0040A253               push    esi             ; 保存esi(DWORD指针,指向未加壳程序代码段内存偏移).nsp1:0040A254               push    40h             ; 参数(PAGE_EXECUTE_READWRITE 0x40).nsp1:0040A256               push    1000h         ; 参数(MEM_COMMIT 0x1000 ).nsp1:0040A25B               push    1000h         ; 参数(dwSize).nsp1:0040A260               push    0               ; 起始地址,为0则系统自动分配.nsp1:0040A262               call    dword ptr ; CALL kernel32.VirtualAlloc.nsp1:0040A268               test    eax, eax      ; 是否申请成功.nsp1:0040A26A               jz      loc_40A5D9.nsp1:0040A270               mov   , eax ; 保存申请的堆空间首地址.nsp1:0040A276               call    $+5.nsp1:0040A27B               pop   ebx.nsp1:0040A27C               mov   ecx, 367h.nsp1:0040A281               add   ebx, ecx.nsp1:0040A283               push    eax             ; 目的,申请的堆空间.nsp1:0040A284               push    ebx             ; 源数据,shell第二部分代码.nsp1:0040A285               call    __ShellDecode   ; 把shell第二部分代码修正并拷贝到堆空间.nsp1:0040A28A               pop   esi.nsp1:0040A28B               pop   ebp.nsp1:0040A28C               mov   esi,       ; 00401000.nsp1:0040A28E               mov   edi, ebp      ; 加壳后OEP内存偏移.nsp1:0040A290               add   edi, ; 取得偏移 906h.nsp1:0040A296               mov   ebx, edi.nsp1:0040A298               cmp   dword ptr , 0.nsp1:0040A29B               jnz   short loc_40A2A7.nsp1:0040A29D               add   edi, 4.nsp1:0040A2A0               mov   ecx, 0.nsp1:0040A2A5               jmp   short loc_40A2BD.nsp1:0040A2A7 ; ---------------------------------------------------------------------------.nsp1:0040A2A7.nsp1:0040A2A7 loc_40A2A7:                           ; CODE XREF: start+82j.nsp1:0040A2A7               mov   ecx, 1.nsp1:0040A2AC               add   edi, .nsp1:0040A2AE               add   ebx, 4.nsp1:0040A2B1.nsp1:0040A2B1 loc_40A2B1:                           ; CODE XREF: start+CFj.nsp1:0040A2B1               cmp   dword ptr , 0.nsp1:0040A2B4               jz      short loc_40A2EA.nsp1:0040A2B6               add   , edx.nsp1:0040A2B8               mov   esi, .nsp1:0040A2BA               add   edi, .nsp1:0040A2BD.nsp1:0040A2BD loc_40A2BD:                           ; CODE XREF: start+8Cj.nsp1:0040A2BD               push    edi.nsp1:0040A2BE               push    ecx.nsp1:0040A2BF               push    ebx.nsp1:0040A2C0               push    dword ptr ; VirtualFree.nsp1:0040A2C6               push    dword ptr ; kernel32.VirtualAlloc.nsp1:0040A2CC               mov   edx, esi.nsp1:0040A2CE               mov   ecx, edi.nsp1:0040A2D0               mov   eax, ; VirtualAlloc返回的首地址.nsp1:0040A2D6               add   eax, 5AAh.nsp1:0040A2DB               call    eax             ; __Shell_Decode_Data 数据解压并拷贝到原虚拟地址.nsp1:0040A2DD               pop   ebx.nsp1:0040A2DE               pop   ecx.nsp1:0040A2DF               pop   edi.nsp1:0040A2E0               cmp   ecx, 0.nsp1:0040A2E3               jz      short loc_40A2EA.nsp1:0040A2E5               add   ebx, 8.nsp1:0040A2E8               jmp   short loc_40A2B1.nsp1:0040A2EA ; ---------------------------------------------------------------------------.nsp1:0040A2EA.nsp1:0040A2EA loc_40A2EA:                           ; CODE XREF: start+9Bj.nsp1:0040A2EA                                       ; start+CAj.nsp1:0040A2EA               push    8000h.nsp1:0040A2EF               push    0.nsp1:0040A2F1               push    dword ptr .nsp1:0040A2F7               call    dword ptr ; kernel32.VirtualFree.nsp1:0040A2FD               lea   esi, .nsp1:0040A303               mov   ecx, .nsp1:0040A306               lea   edx, .nsp1:0040A309               mov   esi, .nsp1:0040A30B               mov   edi, esi.nsp1:0040A30D               cmp   ecx, 0          ; 循环处理near call(ecx循环次数).nsp1:0040A310               jz      short loc_40A351.nsp1:0040A312.nsp1:0040A312 loc_40A312:                           ; CODE XREF: start+100j.nsp1:0040A312                                       ; start+10Ej.nsp1:0040A312               mov   al,        ; 处理开始.nsp1:0040A314               inc   edi.nsp1:0040A315               sub   al, 0E8h      ; E8是near call的机器码.nsp1:0040A317.nsp1:0040A317 loc_40A317:                           ; CODE XREF: start+136j.nsp1:0040A317               cmp   al, 1.nsp1:0040A319               ja      short loc_40A312 ; 大于1跳过.nsp1:0040A31B               mov   eax, .nsp1:0040A31D               cmp   byte ptr , 0.nsp1:0040A321               jz      short loc_40A337 ; 是near call则跳去处理.nsp1:0040A323               mov   bl, .nsp1:0040A325               cmp   , bl.nsp1:0040A327               jnz   short loc_40A312.nsp1:0040A329               mov   bl, .nsp1:0040A32C               shr   ax, 8.nsp1:0040A330               rol   eax, 10h.nsp1:0040A333               xchg    al, ah.nsp1:0040A335               jmp   short loc_40A341.nsp1:0040A337 ; ---------------------------------------------------------------------------.nsp1:0040A337.nsp1:0040A337 loc_40A337:                           ; CODE XREF: start+108j.nsp1:0040A337               mov   bl, .nsp1:0040A33A               xchg    al, ah.nsp1:0040A33C               rol   eax, 10h.nsp1:0040A33F               xchg    al, ah.nsp1:0040A341.nsp1:0040A341 loc_40A341:                           ; CODE XREF: start+11Cj.nsp1:0040A341               sub   eax, edi.nsp1:0040A343               add   eax, esi.nsp1:0040A345               mov   , eax.nsp1:0040A347               add   edi, 5.nsp1:0040A34A               sub   bl, 0E8h.nsp1:0040A34D               mov   eax, ebx.nsp1:0040A34F               loop    loc_40A317      ; near call处理结束.nsp1:0040A351.nsp1:0040A351 loc_40A351:                           ; CODE XREF: start+F7j.nsp1:0040A351               call    __Fill_IAT_Table ; 填IAT表.nsp1:0040A356               lea   ecx, .nsp1:0040A35C               mov   eax, .nsp1:0040A35F               cmp   eax, 0.nsp1:0040A362               jz      loc_40A3E9.nsp1:0040A368               mov   esi, edx.nsp1:0040A36A               sub   esi, .nsp1:0040A36D               jz      short loc_40A3E9.nsp1:0040A36F               mov   , esi.nsp1:0040A372               lea   esi, .nsp1:0040A378               mov   esi, .nsp1:0040A37A               lea   ebx, .nsp1:0040A37D               mov   eax, .nsp1:0040A37F               cmp   eax, 1.nsp1:0040A382               jz      short loc_40A38E.nsp1:0040A384               mov   edi, edx.nsp1:0040A386               add   edi, .nsp1:0040A389               mov   ecx, .nsp1:0040A38C               jmp   short loc_40A396.nsp1:0040A38E ; ---------------------------------------------------------------------------.nsp1:0040A38E.nsp1:0040A38E loc_40A38E:                           ; CODE XREF: start+169j.nsp1:0040A38E               mov   edi, esi.nsp1:0040A390               add   edi, .nsp1:0040A393               mov   ecx, .nsp1:0040A396.nsp1:0040A396 loc_40A396:                           ; CODE XREF: start+173j.nsp1:0040A396                                       ; start+18Ej.nsp1:0040A396               xor   eax, eax.nsp1:0040A398               mov   al, .nsp1:0040A39A               inc   edi.nsp1:0040A39B               or      eax, eax.nsp1:0040A39D               jz      short loc_40A3BF.nsp1:0040A39F               cmp   al, 0EFh.nsp1:0040A3A1               ja      short loc_40A3A9.nsp1:0040A3A3.nsp1:0040A3A3 loc_40A3A3:                           ; CODE XREF: start+19Dj.nsp1:0040A3A3                                       ; start+1A4j.nsp1:0040A3A3               add   ebx, eax.nsp1:0040A3A5               add   , ecx.nsp1:0040A3A7               jmp   short loc_40A396.nsp1:0040A3A9 ; ---------------------------------------------------------------------------.nsp1:0040A3A9.nsp1:0040A3A9 loc_40A3A9:                           ; CODE XREF: start+188j.nsp1:0040A3A9               and   al, 0Fh.nsp1:0040A3AB               shl   eax, 10h.nsp1:0040A3AE               mov   ax, .nsp1:0040A3B1               add   edi, 2.nsp1:0040A3B4               or      eax, eax.nsp1:0040A3B6               jnz   short loc_40A3A3.nsp1:0040A3B8               mov   eax, .nsp1:0040A3BA               add   edi, 4.nsp1:0040A3BD               jmp   short loc_40A3A3.nsp1:0040A3BF ; ---------------------------------------------------------------------------.nsp1:0040A3BF.nsp1:0040A3BF loc_40A3BF:                           ; CODE XREF: start+184j.nsp1:0040A3BF               xor   ebx, ebx.nsp1:0040A3C1               xchg    edi, esi.nsp1:0040A3C3               mov   eax, .nsp1:0040A3C5               cmp   eax, 0.nsp1:0040A3C8               jz      short loc_40A3E9.nsp1:0040A3CA.nsp1:0040A3CA loc_40A3CA:                           ; CODE XREF: start+1BCj.nsp1:0040A3CA               lodsd.nsp1:0040A3CB               or      eax, eax.nsp1:0040A3CD               jz      short loc_40A3D7.nsp1:0040A3CF               add   ebx, eax.nsp1:0040A3D1               add   , cx.nsp1:0040A3D5               jmp   short loc_40A3CA.nsp1:0040A3D7 ; ---------------------------------------------------------------------------.nsp1:0040A3D7.nsp1:0040A3D7 loc_40A3D7:                           ; CODE XREF: start+1B4j.nsp1:0040A3D7               xor   ebx, ebx.nsp1:0040A3D9               shr   ecx, 10h.nsp1:0040A3DC.nsp1:0040A3DC loc_40A3DC:                           ; CODE XREF: start+1CEj.nsp1:0040A3DC               lodsd.nsp1:0040A3DD               or      eax, eax.nsp1:0040A3DF               jz      short loc_40A3E9.nsp1:0040A3E1               add   ebx, eax.nsp1:0040A3E3               add   , cx.nsp1:0040A3E7               jmp   short loc_40A3DC.nsp1:0040A3E9 ; ---------------------------------------------------------------------------.nsp1:0040A3E9.nsp1:0040A3E9 loc_40A3E9:                           ; CODE XREF: start+149j.nsp1:0040A3E9                                       ; start+154j ....nsp1:0040A3E9               lea   esi, .nsp1:0040A3EF               mov   edx, .nsp1:0040A3F1               lea   esi, .nsp1:0040A3F7               mov   al, .nsp1:0040A3F9               cmp   al, 1.nsp1:0040A3FB               jnz   short loc_40A43C.nsp1:0040A3FD               add   edx, .nsp1:0040A400               push    esi.nsp1:0040A401               push    edx.nsp1:0040A402               push    esi.nsp1:0040A403               push    4.nsp1:0040A405               push    100h.nsp1:0040A40A               push    edx.nsp1:0040A40B               call    dword ptr ;kernel32.VirtualProtect.nsp1:0040A411               pop   edi.nsp1:0040A412               pop   esi.nsp1:0040A413               cmp   eax, 1.nsp1:0040A416               jnz   loc_40A5D9.nsp1:0040A41C               add   esi, 8.nsp1:0040A41F               mov   ecx, 8.nsp1:0040A424               rep movsb.nsp1:0040A426               sub   esi, 0Ch.nsp1:0040A429               sub   edi, 8.nsp1:0040A42C               push    esi.nsp1:0040A42D               push    dword ptr .nsp1:0040A430               push    100h.nsp1:0040A435               push    edi.nsp1:0040A436               call    dword ptr ;kernel32.VirtualProtect.nsp1:0040A43C.nsp1:0040A43C loc_40A43C:                           ; CODE XREF: start+1E2j.nsp1:0040A43C               push    ebp.nsp1:0040A43D               pop   ebx.nsp1:0040A43E               sub   ebx, 21h.nsp1:0040A444               xor   ecx, ecx.nsp1:0040A446               mov   cl, .nsp1:0040A448               cmp   cl, 0         ; 循环还原属性(cl存放循环次数).nsp1:0040A44B               jz      short loc_40A475.nsp1:0040A44D               inc   ebx             ; 原程序 代码块 和 数据块 属性还原.nsp1:0040A44E               lea   esi, .nsp1:0040A454               mov   edx, .nsp1:0040A456.nsp1:0040A456 loc_40A456:                           ; CODE XREF: start+25Aj.nsp1:0040A456               push    esi.nsp1:0040A457               push    ecx.nsp1:0040A458               push    ebx.nsp1:0040A459               push    edx.nsp1:0040A45A               push    esi.nsp1:0040A45B               push    dword ptr .nsp1:0040A45D               push    dword ptr .nsp1:0040A460               mov   eax, .nsp1:0040A463               add   eax, edx.nsp1:0040A465               push    eax.nsp1:0040A466               call    dword ptr ; kernel32.VirtualProtect.nsp1:0040A46C               pop   edx.nsp1:0040A46D               pop   ebx.nsp1:0040A46E               pop   ecx.nsp1:0040A46F               pop   esi.nsp1:0040A470               add   ebx, 0Ch.nsp1:0040A473               loop    loc_40A456.nsp1:0040A475.nsp1:0040A475 loc_40A475:                           ; CODE XREF: start+14j.nsp1:0040A475                                       ; start+232j.nsp1:0040A475               mov   eax, 0.nsp1:0040A47A               cmp   eax, 0.nsp1:0040A47D               jz      short loc_40A489.nsp1:0040A47F               popa.nsp1:0040A480               popf.nsp1:0040A481               mov   eax, 1.nsp1:0040A486               retn    0Ch.nsp1:0040A489 ; ---------------------------------------------------------------------------.nsp1:0040A489.nsp1:0040A489 loc_40A489:                           ; CODE XREF: start+264j.nsp1:0040A489               popa.nsp1:0040A48A               popf.nsp1:0040A48B               jmp   near ptr dword_401000 ; jmp to OEP.nsp1:0040A48B start         endp

game2000 发表于 2009-8-17 02:03:40

楼主是不是发错地方了?
页: [1]
查看完整版本: 【原创】NsPack3.7分析和静态脱壳机(附源码)