(申请邀请码)

使用工具:
WIN98的记事本      (测试程序)
北斗4.1破解版的壳  (加壳保护)
OD                 (脱壳)
LordPE             (查看区段)
ImportREC V1.7F     (修复IAT)
PEID v0.95          (查壳)
WinHex



备份一份加壳前文件加壳后文件脱壳后文件这是每次操作必做的

首先我门先给WIN98的记事本加壳,“加上北斗4.1破解版”

使用PEID查看下壳
nSpack V2.x -> LiuXingPing *   
EP区段:.nsp1
入口点:0000CE93

PEID查壳 并不是说每个壳都能查出来,有些伪装了,你只有看他的EP区段来识别

打开OD 载入加壳后的WIN98记事本

我门使用F8单步走 走到call 0040CE9A 看右边的数据窗口,ESP突显红色,“我门使用ESP定律脱这个壳吧”


0040CE93 >  9C              pushfd                 (入口点, 看见这两个大家会想到push入栈,下面当然有个POP出栈)
0040CE94    60              pushad   
0040CE95    E8 00000000     call 加了壳.0040CE9A      “看右边的数据窗口,ESP突显红色”
0040CE9A    5D              pop ebp
0040CE9B    B8 07000000     mov eax,7
0040CEA0    2BE8            sub ebp,eax
0040CEA2    8DB5 C5FDFFFF   lea esi,dword ptr ss:[ebp-23B]
0040CEA8    8A06            mov al,byte ptr ds:[esi]
0040CEAA    3C 00           cmp al,0
0040CEAC    74 12           je short 加了壳.0040CEC0
0040CEAE    8BF5            mov esi,ebp
0040CEB0    8DB5 EDFDFFFF   lea esi,dword ptr ss:[ebp-213]
0040CEB6    8A06            mov al,byte ptr ds:[esi]
0040CEB8    3C 01           cmp al,1
0040CEBA    0F84 42020000   je 加了壳.0040D102
0040CEC0    C606 01         mov byte ptr ds:[esi],1
0040CEC3    8BD5            mov edx,ebp
0040CEC5    2B95 81FDFFFF   sub edx,dword ptr ss:[ebp-27F]
0040CECB    8995 81FDFFFF   mov dword ptr ss:[ebp-27F],edx
0040CED1    0195 B1FDFFFF   add dword ptr ss:[ebp-24F],edx

点击寄存器窗口ESP 0012FFA0 右键,跟随到数据窗口
看左下角数据窗口
数据窗口:
0012FFA0  7C930228  ntdll.7C930228 (右键,断点,硬件访问,word.)

OK下好硬件断点后

F9运行,

0040D116    61              popad
0040D117    9D              popfd             (F9运行后来到此处)
0040D118  - E9 AF3FFFFF     jmp 加了壳.004010CC   (单步F8下来 JMP直接跳转到OEP)

删除硬件断点,(调试,硬件断点,删除1.点确定) 这个硬件断点删除比较麻烦"呵呵"

0040D118  - E9 AF3FFFFF     jmp 加了壳.004010CC   (单步F8下来 JMP直接跳转到OEP)

到达OEP

004010CC    55              push ebp               (0040D118跳转后到达此处OEP)
004010CD    8BEC            mov ebp,esp
004010CF    83EC 44         sub esp,44
004010D2    56              push esi
004010D3    FF15 E4634000   call dword ptr ds:[4063E4]               ; kernel32.GetCommandLineA
004010D9    8BF0            mov esi,eax
004010DB    8A00            mov al,byte ptr ds:[eax]
004010DD    3C 22           cmp al,22
004010DF    75 1B           jnz short 加了壳.004010FC
004010E1    56              push esi
004010E2    FF15 F4644000   call dword ptr ds:[4064F4]               ; USER32.CharNextA
004010E8    8BF0            mov esi,eax
004010EA    8A00            mov al,byte ptr ds:[eax]
004010EC    84C0            test al,al
004010EE    74 04           je short 加了壳.004010F4
004010F0    3C 22           cmp al,22
004010F2  ^ 75 ED           jnz short 加了壳.004010E1
004010F4    803E 22         cmp byte ptr ds:[esi],22
004010F7    75 15           jnz short 加了壳.0040110E
004010F9    46              inc esi


这时我门使用OD插件脱壳,
点击:004010CC    55              push ebp  (右键,用OllyDump脱壳调试进程)



右键,用OllyDump脱壳调试进程 弹出个对话框, 框框下面有两种方法脱壳,我门使用方法1
点击脱壳.生成脱壳文件.

使用PEID查看下脱壳后的文件
Microsoft Visual C++ 6.0 SPx Method 1      EP区段:.nsp0        入口点:000010CC


运行下脱壳程序可以运行,那我门需要修复IAT吗?“我也不晓得脱壳后程序能正常打开还需要修复IAT不,忘高手留言指导下”

我门还是修复下IAT吧, 打开ImportREC V1.7F

选取活动进程, “OD栽入的那个进程”

需要的IAT信息
OEP填写 000010CC
RVA     000062E0        (它自动会填写的只要你填写好OEP地址)
大小    00000248        (它自动会填写的只要你填写好OEP地址)

点击自动查找IAT,会提示发现一些信息
获取输入表, 左边的找到的输入表函数,会显示出输入表信息
我门点击,显示无效的函数, “这个壳并没有无效的函数”

好拉,我门点修复转存文件 弹出框框 我门选择脱壳后的文件.

抓取后文件夹会生成多一个 脱壳后_.exe 这个就是我门修复后的程序

在来使PEID查看下修复后的程序,
Microsoft Visual C++ 6.0 SPx Method 1      EP区段:.nsp0        入口点:000010CC
没有变化

运行修复后的程序 仍然可以运行.

接下来我门给输入表减肥,也就是加壳时添加进去的程序,脱壳了当然成了垃圾了,我门来做做清理工

未加壳程序区段:
 名称       V0ffset       VSize     R0ffset    Rsize      标记
.text      00001000     00003FD4   00001000   00004000   60000020
.data      00005000     0000084C   00005000   00001000   C0000040
.idata     00006000     00000E02   00006000   00001000   40000040
.rsrc      00007000     00004FB8   00007000   00005000   40000040
.reloc     0000C000     00000AC6   0000C000   00001000   42000040

加北斗4.1后区段:
 名称       V0ffset       VSize     R0ffset    Rsize      标记
.nsp0      00001000     0000B000   00002000   00000000   E0000060
.nsp1      0000C000     00005000   00000200   00004B56   E0000060
.nsp2      00011000     00001282   00000200   00000000   E0000060

脱壳修复后区段:
 名称       V0ffset       VSize     R0ffset    Rsize      标记
.nsp0      00001000     0000B000   00001000   0000B000   E0000060
.nsp1      0000C000     00005000   0000C000   00005000   E0000060
.nsp2      00011000     00001282   00011000   00001282   E0000060
.idata2    00001300     00001000   00012400   00000C00   C0000040
.小生      00014000     00001000   00013000   00001000   E0000060


很显然脱壳后的程序多出两个区段, 而加壳后的程序改变了原来的区段名称"为什么?望大牛指点"

载入OD,Alt+m 进入内存模块“应该是这个名字吧?”

Memory map, 项目 21
 地址=00400000
 大小=00001000 (4096.)
 属主=脱壳后_  00400000 (自身)
 区段=
 包含=PE 文件头
 类型=映像 01001002
 访问=R
 初始访问=RWE

Memory map, 项目 22
 地址=00401000
 大小=0000B000 (45056.)
 属主=脱壳后_  00400000
 区段=.nsp0
 包含=代码
 类型=映像 01001002
 访问=R
 初始访问=RWE

Memory map, 项目 23
 地址=0040C000
 大小=00005000 (20480.)
 属主=脱壳后_  00400000
 区段=.nsp1
 包含=资源
 类型=映像 01001002
 访问=R
 初始访问=RWE

Memory map, 项目 24
 地址=00411000
 大小=00002000 (8192.)
 属主=脱壳后_  00400000
 区段=.nsp2
 类型=映像 01001002
 访问=R
 初始访问=RWE

Memory map, 项目 25
 地址=00413000
 大小=00001000 (4096.)
 属主=脱壳后_  00400000
 区段=.idata2
 包含=数据
 类型=映像 01001002
 访问=R
 初始访问=RWE

Memory map, 项目 26
 地址=00414000
 大小=00001000 (4096.)
 属主=脱壳后_  00400000
 区段=.小生
 包含=导入
 类型=映像 01001002
 访问=R
 初始访问=RWE

按照我的学习方法 我门先测试 在包含那一行没有名称的下个断点 F2。然后按F9 看程序能不能正常运行,如可以正常运行
代表这个区段是没有用的,
我门先试试没有名字的.nsp2 区段,下F2断点。F9运行 记事本正常,这样表示我门可以删除这个断点.


脱壳后文件删除区段:
 名称       V0ffset       VSize     R0ffset    Rsize      标记
.nsp0      00001000     0000B000   00001000   0000B000   E0000060
.nsp1      0000C000     00005000   0000C000   00005000   E0000060
.idata2    00001300     00001000   00012400   00000C00   C0000040
.小生      00014000     00001000   00013000   00001000   E0000060

接下来我门修改下区段的文件偏移(也就是R0ffset和Rsize的数字)我英文也不是很懂大部分都是拿翻译机
比方说第一个区段.nsp0 的R0ffset+Rsize(也就是00001000+0000B000)拿出计算机 16进制计算
.nsp0   00001000+0000B000=0000C000 (大家在看下我门计算出来的值,和.NSP2的R0ffset数字)
.nsp1   0000C000+00005000=00011000 (大家在看下我门计算出来的值,和没有删除区段的.NSP3的R0ffset数字)
计算方法大概是这样 R0ffset+Rsize的数值=下一个区段的数值

而节区大小(V0ffset)和虚拟偏移(VSize)的计算和Raw尺寸(R0ffset)Raw偏移(Rsize)的计算是相同的
但是V0ffset和VSize的计算有空数的地方.
比方说
V0ffset地址是00001000
VSize地址是  00005400
那么下一个区段的V0ffset地址就是00007000

废话不多说,我门继续操作,
使用LordPE打开删除.nsp2区段后的程序,如上面 脱壳后文件删除区段

我门修改区段: “拿出计算器”按我上面的方法。

脱壳后文件修改好的区段:
 名称       V0ffset       VSize     R0ffset    Rsize      标记
.nsp0      00001000     0000B000   00001000   0000B000   E0000060
.nsp1      0000C000     00005000   0000C000   00005000   E0000060
.idata2    00011000     00003000   00011000   00000C00   C0000040
.小生      00014000     00001000   00011C00   00001000   E0000060


修改成我上面的数值:“我那个小生的区段估计是使用小生自己修改的工具而来的”

接下来我门开始删除区段内容,把记事本载入WinHex

回想下我门删除的区段:
.nsp2      00011000     00001282   00011000   00001282   E0000060

在winhex里按ALT+G查找00011000然后右键选块开始1
在查找00001282然后右键选快开始2
然后右键删除
在点保存
 OK我门查看下保存后的WIN98记事本,看下能不能打开,OK打开了不会提示错误了

在回想下我门减肥前的程序大小是80KB 减肥后的大小是75KB 减少了5KB 可能我的方法并没有完全的减肥成功,往大牛指点迷津

未加壳的WIN98记事本文件大小是52KB.

加上北斗4.1的WIN98记事本文件大小是4.1后大小是19.3KB

脱北斗4.1文件后大小76.0KB

脱壳后修复的程序大小80.0KB(估计是修复的时候多出来的程序吧,大概意思我也是理解,新手~)

减肥后的程序大小是75KB

以上纯属个人思想,也是看教程,看书后积累的经验,如果有写错的地方,请大家多多见量忘斑竹给个邀请马,



在虚拟机里操作的 所以没有截图,抱歉了各位