(申请邀请码)
使用工具:
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
以上纯属个人思想,也是看教程,看书后积累的经验,如果有写错的地方,请大家多多见量忘斑竹给个邀请马,
在虚拟机里操作的 所以没有截图,抱歉了各位
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)