查看: 3923|回复: 1

[分享] 完美破解CS1.6单机版(免CDK) & 带重定位爆破

[复制链接]
发表于 2016-6-2 07:39 | 显示全部楼层 |阅读模式
官方团队 2016-6-2 07:39 3923 1 显示全部楼层
首先得搞清楚一点, 游戏的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下断这么麻烦, 但是这个只是破解的一个思路. 我还是希望新手朋友们能从中学到好东西. 感谢所有阅贴的朋友! 破解的道路依旧遥远, 就让我们的经验和时间来证明这一切!
gongyuchang 该用户已被删除
发表于 2017-1-16 11:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表