- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
先贴程序启动验证的关键位置:
- 013095A1 |> \83BB 40CB0100 00 CMP DWORD PTR DS:[EBX+1CB40], 0
- 013095A8 |. 74 2B JE SHORT DFX.013095D5 ; 不能跳
- 013095AA |. 83BB 20CB0100 0A CMP DWORD PTR DS:[EBX+1CB20], 0A
- 013095B1 |. 75 22 JNZ SHORT DFX.013095D5 ; 不能跳
- 013095B3 |. C783 E4CA0100 02000000 MOV DWORD PTR DS:[EBX+1CAE4], 2 ; 全局变量 等于2代表注册
- 013095BD |> 33C0 XOR EAX, EAX ; kernel32.BaseThreadInitThunk
- 013095BF |. 5B POP EBX ; kernel32.76F7338A
- 013095C0 |. 8B8C24 10100000 MOV ECX, DWORD PTR SS:[ESP+1010]
- 013095C7 |. 33CC XOR ECX, ESP
- 013095C9 |. E8 A2210500 CALL DFX.0135B770
- 013095CE |. 81C4 14100000 ADD ESP, 1014
- 013095D4 |. C3 RETN
- 013095D5 8B93 F8FA0200 MOV EDX, DWORD PTR DS:[EBX+2FAF8]
- 013095DB |. 8D4C24 0C LEA ECX, DWORD PTR SS:[ESP+C]
复制代码
这里很容易提出一个特征码来
程序码:83 BB 40 CB 01 00 00 74 2B 83 BB 20 CB 01 00 0A 75 22 C7 83 E4 CA 01 00 02 00 00 00
但由于特征码中有对象成员的偏移值,下一版中可能会发生变化,所以我们这里用 ?? 来替代:
特征码: 83 BB ?? ?? ?? ?? 00 74 2B 83 BB ?? ?? ?? ?? 0A 75 22 C7 83 ?? ?? ?? ?? 02 00 00 00
我们的补丁方法就是:
013095A8 74 2B ==> 74 00
013095B1 75 22 ==> 75 00
所以我们的修改数据为:
补丁码:83 BB ?? ?? ?? ?? 00 74 00 83 BB ?? ?? ?? ?? 0A 75 00 C7 83 ?? ?? ?? ?? 02 00 00 00
第一种破解方案:修改代码(偏移补丁)
第二种破解方案:修改寄存器(异常中断补丁)
我们还用特征码来定位,
013095A1 |> \83BB 40CB0100 00 CMP DWORD PTR DS:[EBX+1CB40], 0
013095A8 |. 74 2B JE SHORT DFX.013095D5 ; 该指令相对于特征码的偏移为 7
013095AA |. 83BB 20CB0100 0A CMP DWORD PTR DS:[EBX+1CB20], 0A
013095B1 |. 75 22 JNZ SHORT DFX.013095D5 ; 该指令相对于特征码的偏移为 16
设置第一项: 偏移= 7,ZF = 0
伪码为:ZF:0,1,0:0
设置第二项: 偏移= 16,ZF = 1
伪码为:ZF:0,1,0:1
第三种破解方案:修改内存数据(异常中断补丁)
我们把内存 DWORD PTR DS:[EBX+1CB40] 修改为 1,使其不跳。
// 补丁地址相对于特征码偏移=0
伪码为:EBX,1CB40:0,1,0:I,D,1
我们把内存 DWORD PTR DS:[EBX+1CB20] 修改为 A
// 补丁地址相对于特征码偏移=9
伪码为:EBX,1CB20:0,1,0:I,D,A
第四种方法:NOP掉该指令(异常中断补丁)
第一组伪码为:EIP:0,1,0:NOP
注:这里的NOP不是修改代码,而是将EIP进行加分,跳过该行代码并执行下一行。
第二组伪码为:EIP:0,1,0:NOP
第五种方法:直接修改EIP(异常中断补丁)
我们知道若两个关键调整若失败后会调整到地址 013095D5,该地址相对于特征码偏移为 013095D5 - 013095A1 = 0x34,即十进制的52
我们希望的是进程可以执行到地址 013095B3,去完成赋值, 013095D5 - 013095B3 = 0x22,即十进制的34
由于是往上调,地址变小,所以我们应该填负的34。即十六进制 -22 (界面所有看填写数据的地方非特殊说明均为十六进制),这里和CPU寻址不同,CPU会从该行代码的下一行开始算偏移。
这次我们试一下 INT3 的断点类型
伪码为:EIP:0,1,1:FFFFFFDE
我们制作调试吧补丁,打开DebugView来看一下信息:
OK,条条大道通罗马,Baymax tools 又为大家扩展了一些修改思路及方法,只要想得到,就可以做的到。
Baymax Patch Tools v1.6 Beta 下载
https://www.chinapyg.com/thread-83083-1-1.html |
评分
-
查看全部评分
|