【文章标题】: Okoker Delete 1.0 SMC 爆破
【文章作者】: 壹群老虎
【软件名称】: Okoker Delete 1.0
【软件大小】: 1,620,584 字节
【下载地址】: 自己搜索下载
【加壳方式】: ASPack 2.12 -> Alexey Solodovnikov
【保护方式】: NAG+时间限制+NAG
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD+topo
【操作平台】: Operating System: Windows /98/ME/NT/2000/XP/2003 Server/Vista
【软件介绍】: Okoker Delete 安全删除工具
【作者声明】: 本ID得到壹只老虎的授权^_^
--------------------------------------------------------------------------------
【详细过程】
第一步,试用程序,了解限制方便爆破。通常你可以通过试用程序或参考帮助和注册须知了解程序的限制。
发现限制,启动/退出有nag,有时间限制
第二步,爆破开始。
Peid——>ASPack 2.12 -> Alexey Solodovnikov
直接用脱壳插件脱之
Peid——>Borland Delphi 6.0 - 7.0
用OD载入脱壳后的程序。
通过字符串,可以找到关键位置:
Ultra String Reference, 条目 1106
Address=00506347
Disassembly=mov edx, 00506558
Text String=check registe information begin
很吸引人啊,双击当前行进入代码窗口。
00506340 E8 FBE8EFFF call 00404C40
00506345 8B06 mov eax, dword ptr [esi]
00506347 BA 58655000 mov edx, 00506558 ; check registe information begin
0050634C E8 5F73FFFF call 004FD6B0
00506351 8B15 18315100 mov edx, dword ptr [513118]
00506357 A1 00315100 mov eax, dword ptr [513100] ; 检查注册信息
0050635C E8 73DEFFFF call 005041D4 ; 通常说的关键Call
00506361 84C0 test al, al ; 很典型的比较,通常检查成功al应为1 可以按照未注册为0逆推
00506363 74 39 je short 0050639E
00506365 C605 F0305100 0>mov byte ptr [5130F0], 1 ; 赋值,注册成功是一般赋值1,反之为0或不赋值
0050636C A1 94155100 mov eax, dword ptr [511594]
00506371 FF30 push dword ptr [eax]
00506373 68 30655000 push 00506530
00506378 A1 D4125100 mov eax, dword ptr [5112D4]
0050637D FF30 push dword ptr [eax]
0050637F B8 F4305100 mov eax, 005130F4
00506384 BA 03000000 mov edx, 3
00506389 E8 DEEBEFFF call 00404F6C
0050638E 8B15 F4305100 mov edx, dword ptr [5130F4]
00506394 A1 EC305100 mov eax, dword ptr [5130EC]
00506399 E8 1651F7FF call 0047B4B4
0050639E 8B06 mov eax, dword ptr [esi]
005063A0 BA 80655000 mov edx, 00506580 ; check registe information successful
005063A5 E8 0673FFFF call 004FD6B0
005063AA A1 AC145100 mov eax, dword ptr [5114AC] ; 检查注册信息成功
005063AF 8B00 mov eax, dword ptr [eax]
005063B1 8B15 F4305100 mov edx, dword ptr [5130F4]
0050635C E8 73DEFFFF call 005041D4 ; 通常说的关键Call
此行点击会回车进入子程序
005041D4 55 push ebp
005041D5 8BEC mov ebp, esp
005041D7 83C4 E8 add esp, -18
005041DA 53 push ebx
005041DB 33C9 xor ecx, ecx
005041DD 894D F4 mov dword ptr [ebp-C], ecx
005041E0 894D F0 mov dword ptr [ebp-10], ecx
005041E3 8955 F8 mov dword ptr [ebp-8], edx
005041E6 8945 FC mov dword ptr [ebp-4], eax
005041E9 8B45 FC mov eax, dword ptr [ebp-4]
005041EC E8 AB0EF0FF call 0040509C
005041F1 8B45 F8 mov eax, dword ptr [ebp-8]
005041F4 E8 A30EF0FF call 0040509C
005041F9 33C0 xor eax, eax
005041FB 55 push ebp
005041FC 68 76425000 push 00504276
00504201 64:FF30 push dword ptr fs:[eax]
00504204 64:8920 mov dword ptr fs:[eax], esp
00504207 33DB xor ebx, ebx
00504209 837D FC 00 cmp dword ptr [ebp-4], 0
0050420D 74 4C je short 0050425B
0050420F 837D F8 00 cmp dword ptr [ebp-8], 0
00504213 74 46 je short 0050425B
00504215 8D55 EC lea edx, dword ptr [ebp-14]
00504218 B8 8C425000 mov eax, 0050428C ; 395765748698769623417999
0050421D E8 D2BCF9FF call 0049FEF4
00504222 8D55 E8 lea edx, dword ptr [ebp-18]
00504225 B8 B0425000 mov eax, 005042B0 ; 488695864831392881429209
0050422A E8 C5BCF9FF call 0049FEF4
0050422F 8D55 F4 lea edx, dword ptr [ebp-C]
00504232 8B45 F8 mov eax, dword ptr [ebp-8]
00504235 E8 AAFEFFFF call 005040E4
0050423A 8D45 F0 lea eax, dword ptr [ebp-10]
0050423D 50 push eax
0050423E 8B4D E8 mov ecx, dword ptr [ebp-18]
00504241 8B55 EC mov edx, dword ptr [ebp-14]
00504244 8B45 F4 mov eax, dword ptr [ebp-C]
00504247 E8 E8D5F9FF call 004A1834
0050424C 8B45 F0 mov eax, dword ptr [ebp-10]
0050424F 8B55 FC mov edx, dword ptr [ebp-4]
00504252 E8 A10DF0FF call 00404FF8
00504257 75 02 jnz short 0050425B
00504259 B3 01 mov bl, 1
0050425B 33C0 xor eax, eax
0050425D 5A pop edx
0050425E 59 pop ecx
0050425F 59 pop ecx
00504260 64:8910 mov dword ptr fs:[eax], edx
00504263 68 7D425000 push 0050427D
00504268 8D45 F0 lea eax, dword ptr [ebp-10]
0050426B BA 04000000 mov edx, 4
00504270 E8 9B09F0FF call 00404C10
00504275 C3 retn
以上代码是检查注册码的,今天是SMC爆破,不管他。
我们需要al为1,所以修改代码
005041D4 B0 01 mov al, 1 ; 赋值
005041D6 C3 retn ; 返回
将修改保存到程序,然后运行,发现启动仍有nag,但时间限制和退出时的nag没有了,基本成功,去掉启动nag即可。
Delphi 的程序用De-SCode搞定【名词解释De-SCode的意思是针对Delphi的特别代码序列*(俺自己起的)*】
De-SCode For NAG (98%有效)
mov eax,dword ptr ss:[ebp-8]
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
nag出现后,Ctrl搜索上述代码序列,在每个上都按F2下断点。
切换到目标程序,中途断下的全部取消断点。
点击退出NAG的按钮,按后OD断下。
0049A2A3 8B45 F8 mov eax, dword ptr [ebp-8]
0049A2A6 5E pop esi
0049A2A7 5B pop ebx
0049A2A8 8BE5 mov esp, ebp
0049A2AA 5D pop ebp
0049A2AB C3 retn
F8 6下,直到ret返回。
00506757 8078 40 00 cmp byte ptr [eax+40], 0
0050675B ^ 75 E8 jnz short 00506745
0050675D 803D F0305100 0>cmp byte ptr [5130F0], 0
00506764 75 16 jnz short 0050677C ; 跳过nag,修改这里为JMP
00506766 A1 60105100 mov eax, dword ptr [511060]
0050676B 8B00 mov eax, dword ptr [eax]
0050676D 8B10 mov edx, dword ptr [eax]
0050676F FF92 EC000000 call dword ptr [edx+EC] ; nag
00506775 E8 DA520000 call 0050BA54 ; 返回到这里
0050677A EB 2C jmp short 005067A8
修改
00506764 /EB 16 jmp short 0050677C ; 跳过nag,修改这里为JMP
至此爆破完成
第三步,SMC
原程序加壳,脱壳后制作文件补丁会很大,所以最好使用SMC,ASPACK的SMC很简单。
整理修改点。
1
005041D4 B0 01 mov al, 1 ; 赋值
005041D6 C3 retn
修改点005041D4 :B0 01 C3
2
00506764 /EB 16 jmp short 0050677C
修改点00506764 :EB
增加空白空间供写入SMC代码。推荐使用topo ,简单实用的小工具。版本:cao_cong 汉化免杀1.2 版【免杀不代表topo是恶意程序】
复制一份目标程序Delete.exe(原始文件)为 Cr_Delete.exe
打开topo,点击【打开】——确定——然后定位到目标软件的安装目录选择Cr_Delete.exe。
——使用一个已有节——确定【我们需要的空间很小,所以选择这个。 加壳的文件也有空隙的】
要添加的字节数: 填 120,不要问为什么(最少需要字节数<120字节<最大可添加字节数),点击【执行】。
结果窗口显示的就是我们需要的数据了。
____________________________
120字节添加于:
-内存地址: 00620E16h
-文件偏移: 000BBE16h
____________________________
-内存地址: 00620E16h 末尾的h是16进制标记,地址就是00620E16。
Od载入添加字节后的Cr_Delete.exe,F8,命令 Hr ESP【Fly大侠的ESP定律】,F9,停在
0060F3B0 /75 08 jnz short 0060F3BA
0060F3B2 |B8 01000000 mov eax, 1
0060F3B7 |C2 0C00 retn 0C
0060F3BA \68 6CCF5000 push 0050CF6C
0060F3BF C3 retn
再F83次,就是OEP了,但我们不需要到那里。
0060F3BA 68 6CCF5000 push 0050CF6C
这里是动态解密的,所以不能修改这里。【如何解密的,前辈有文章存世】
0060F3B0 /75 08 jnz short 0060F3BA
这里,我所见到的都是跳,修改为
0060F3AF 61 popad
0060F3B0 E9 611A0100 jmp 00620E16
0060F3B5 90 nop
0060F3B6 90 nop
0060F3B7 C2 0C00 retn 0C
前往地址00620E16
开始我们的代码
topo 已经为我们填好NOP了,怎么改是我们的事情了。
恢复原来的代码,万一他跳了呢:-) 应该没有这个万一,但我们要养成好习惯
00620E16 /75 06 jnz short 00620E1E ; 不等跳到前往OEP的代码,我们改为跳到SMC的代码
00620E18 |B8 01000000 mov eax, 1 ; 原始代码
00620E1D |C3 retn ; 原始的返回指令
要理解原始代码的含义,虽然看上去不一样,但效果是一样的。
00620E1E C705 D4415000 B>mov dword ptr [5041D4], 0C301B0 ; 修改 修改点1
00620E28 C605 64675000 E>mov byte ptr [506764], 0EB ; 修改 修改点2
00620E2F ^ E9 86E5FEFF jmp 0060F3BA ; 返回原始代码,也可直接跳到OEP
dword:4字节
byte:1字节
数据如果是字母(只能是a,b,c,d,e,f之一)开头,前面要加0,否则OD会无法识别的。
0C301B0 是修改点一的数据,长度3,所以用dword ptr [5041D4],顺序的变化我就不解释啦
0EB 是修改点二的数据,长度1,所以用byte ptr [506764]
如果要修改的长度大于四,可以多次使用,或使用批量复制模式。
注意一点,需要smc的位置如果不可写,脱离OD 会出错的(解决:用loadpe类的工具为对应区段增加 可写属性即可),如果在OD中需要smc的位置如果有int断点,OD中执行也会出错的。
保存修改到文件,完毕!
--------------------------------------------------------------------------------
2007年07月30日 1:42:08
[课程]FART 脱壳王!加量不加价!FART作者讲授!