[原创]NsPack2.x通用脱壳法
Author: peaceclub[at]PEDIY Goldsun[at]SECURITY

脱壳过程描述:
1、OD 加载
2、Ctrl+B 寻找二进制: 61 9d e9
3、修改 619d为ebfe
4、F9
5、暂停程序,Alt+Backspace恢复代码,3次F8,Ctrl+A
6、Dump+Imprec IAT Fix

案例分析:
附件中为一个数据包侦听工具,经过nspack2.6压缩。
下载例子:packinter_nspack.rar

引用:

我们按照上面的脱壳过程一步步做.
1、OD 加载
   

引用:

0040B4A8 > 9C               PUSHFD  '停在这里
0040B4A9   60               PUSHAD
0040B4AA   E8 00000000      CALL PackInte.0040B4AF
0040B4AF   5D               POP EBP
0040B4B0   B8 07000000      MOV EAX,7
0040B4B5   2BE8             SUB EBP,EAX
0040B4B7   8DB5 E8FDFFFF    LEA ESI,DWORD PTR SS:[EBP-218]
0040B4BD   8A06             MOV AL,BYTE PTR DS:[ESI]


2、Ctrl+B 寻找二进制: 61 9d e9
   

引用:

0040B72F   61               POPAD  '找到了这里
0040B730   9D               POPFD
0040B731  -E9 A978FFFF      JMP PackInte.00402FDF
0040B736   8BB5 9CFDFFFF    MOV ESI,DWORD PTR SS:[EBP-264]
0040B73C   0BF6             OR ESI,ESI


3、修改 619d为ebfe

引用:

0040B72F  -EB FE            JMP SHORT PackInte.0040B72F
0040B731  -E9 A978FFFF      JMP PackInte.00402FDF


有的朋友有可能问为什么,Nspack新版本本身对硬软断点有检测,所以断不住。采用此方法直接改代码,让程序自己断 :)
4、F9
  程序进入死循环
5、暂停程序,Alt+Backspace恢复代码,3次F8,Ctrl+A
  

引用:

00402FDF  /. 55             PUSH EBP    '道路的开始 OEP
00402FE0  |. 8BEC           MOV EBP,ESP
00402FE2  |. 6A FF          PUSH -1
00402FE4  |. 68 784A4000    PUSH PackInte.00404A78
00402FE9  |. 68 66314000    PUSH PackInte.00403166                   ;  JMP to msvcrt._except_handler3; SE handler installation
00402FEE  |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00402FF4  |. 50             PUSH EAX
00402FF5  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
00402FFC  |. 83EC 68        SUB ESP,68
00402FFF  |. 53             PUSH EBX
00403000  |. 56             PUSH ESI
00403001  |. 57             PUSH EDI




  
6、Dump+Imprec IAT Fix
   这个就不说了。

关于nsPack2.6主程序脱壳
  nspack2.6新版本主程序加了两个异常seh(内存访问异常和除零异常),脱法也很容易:
   OD中仅保留Kernel32内存访问异常忽略,od加载后,直接F9,一次Shift+F9,Ctrl+A,在从上面脱壳过程描述第二步开始即可。

任务提高:
   附件中原未压缩文件大小为: 36864 字节,请尝试把您脱壳的文件整理缩小,看是否能自己实现完美脱壳,并把过程简易描述到此帖。