首先得搞清楚一点, 游戏的CDK是怎么保存的, 保存在哪? 不难发现网上都有"CS1.6_CDK.reg", 想必都是注册表了. 进去里面看看能发现是在这个路径:"HKEY_CURRENT_USERSoftwareValveHalf-LifeSettings", 好思路有了:
在注册表操作的API"RegOpenKeyExA"上下断, 然后找到关键跳或关键CALL.
老规矩, 破解先查一下壳(其实我知道这么做是多余的, 因为游戏注重的是运行效率, 因此游戏如果加了加密壳之类的, 游戏根本没法玩), 查壳结果当然是无壳的C++程序啦!
拖入OD, F9好几十步后发现读取了这个关键的位置("HKEY_CURRENT_USERSoftwareValveHalf-LifeSettings"):
在堆栈中逐个查找返回到的CALL附近是否有关键跳或关键CALL, 跟了一会儿果然找到很显眼的地方:
下面的 je 是判断注册表路径是否存在的, 存在就继续往下, 往下就是关键跳了:
jnz就是判断CDK是否正确的, 这里直接爆破就成功一半了, 什么? 才一半? 不急, 继续往下看可以看到:
我猜想这应该是CDK分成两部分保存了, 然后验证也是分成两部分验证, 和上面的一样, 它下面的第一个"跳转"是判断注册表路径是否存在的, 它下面的第二个"跳转"就是判断是否为正确CDK的:
而且第二个"跳转"下面有一句"CD KEY INVALID", 也就是"CDK无效"的意思, 思路一下明了了, 至此, 改这个四个个关键跳转就能实现免CDK进入游戏了.
[原]06612AD2 /74 4C je short GameUI.06612B20
[改]06612AD2 /74 00 je short GameUI.06612AD4
[原]06612AE8 /75 36 jnz short GameUI.06612B20
[改]06612AE8 /75 00 jnz short GameUI.06612AEA
[原]06612B07 /74 17 je short GameUI.06612B20
[改]06612B07 /74 00 je short GameUI.06612B09
[原]06612B1A /0F84 9B000000 je GameUI.06612BBB
[改]06612B1A /E9 9C000000 jmp GameUI.06612BBB
重点来了, 仔细看这个区块是属于"GameUI"的, 也就是cs1.6目录下的DLL, 这个DLL带有"动态重定位"(DLL有静态重定位和动态重定位, 详情可以百度一下), 修改后的代码是无法写出到文件里面的, 因为这是虚拟地址, 不是DLL的真实地址, 此时唯一的办法就是, 计算出偏移, 然后用c32asm进行爆破修改, 但是需要修改的地方有四个, 需要进行浓缩一下, 重新找爆破点, 往上翻, 能找到一句可以完美利用的跳转:
这个跳转就是直接跳过验证的, 但必须条件成立, 也就是前面的"test eax,eax"的结果不为0, 意思就是两数做"与(&)"运算, eax一般就是call的返回值了, 一眼望去, 肯定是上面那个call的, 但是先不管那个call, 将这个"test eax,eax"改成"test esp, esp"条件就成立了, 新手朋友们肯定一脸懵逼了, 为什么改esp就可以了? 原理是什么. 其实就是那esp的特性, esp是不可能为0的, 除非程序执行了清0操作"xor esp, esp", 那么它不为0, 执行"test esp, esp"操作后肯定不为0啦, 两个不为0的数做"与(&)"运算, 结果是不为0的.
说了这个多, 爆破点就定在地址"0x0AAA2A51"了, 问题来了. 刚才说的"动态重定位"呢? 该是时候了, 这时将滚动条拉到这个区块的顶部:
记下地址, 地址是"0x0AA81000", 用"0x0AAA2A51"减去"0x0AA81000"就得到了这个爆破点的偏移"0x21A51", 至此可以关闭OD打开c32asm了, 打开后找到入口地址(通常往下拉, 经过一段空白就到了):
在这个地址头部右键 -> 对应汇编模式编辑:
可以看到汇编模式编辑下的地址是0x10001000:
用这个"0x10001000"加上刚才计算出来的偏移"0x21A51"结果是"0x10022A51", Ctrl + G跳到这个地址, 发现这个就是爆破点的跳转语句了, 不过这个不是要修改的, 要修改的是上一句:
将这个"test eax,eax"改成"test esp, esp"然后保存就爆破了. 怎么样是不是很简单?
总结:
这一期的帖子主要讲解了:
1. 程序的多个爆破思路
2. DLL重定位无法写出问题
3. 傻瓜式的爆破点定位方法
小伙伴们是不是又 GET 到新技能了呢? 赶紧收藏一下或做一下笔记吧!
其实还有一个就是CS1.6安装完成, 注册了CDK后, 电脑重装, CS1.6的CDK又得注册一次. 经过破解后直接免CDK, 还是比较方便的. CS1.6, 都是8090后的回忆呀.
这个免CDK教程算是十分简单的, 只要OD载入后直接搜索"yek2"这个字符串就能定位到关键跳转语句附近了, 并不需要在注册表的API下断这么麻烦, 但是这个只是破解的一个思路. 我还是希望新手朋友们能从中学到好东西. 感谢所有阅贴的朋友! 破解的道路依旧遥远, 就让我们的经验和时间来证明这一切!
|