本帖最后由 最后的戴托纳 于 2021-1-1 23:59 编辑
关于这个游戏其实说来话长了
早在十年前 这个游戏曾红极一时 生化模式迅速占领了国内FPS游戏市场 甚至成为了一代人的回忆
可如今这个游戏却是遍地充满了氪金 各种星际仙侠魔法装备 甚至外挂横飞到连一整局游戏都没办法正常进行
我回到这个游戏的原因还要从缔造者游戏模式说起缔造者的玩家们可灵活运用游戏内提供的各式缔造者方块进行搭建、改造、设置剧情等操作,不仅可以单人搭建地图,也支持多人联机共同创作。将被动接受游戏地图、玩法转变为主动创造相关元素,成为游戏的主人不再是梦想
简单来说 在这个游戏模式中 玩家不需要氪金 装备有所限制 因为有了缔造者大逃杀模式 我才重新玩起这个游戏在这个系列游戏中 因游戏引擎的特殊设定或者说是BUG 玩家在跳跃过程中进行左右移动可以加速 这也就产生了之后的KZ玩法
再简单点 意思就是你可以跑的比别人快 这就有了我的第一个跳跳虎开源项目
https://github.com/DragonQuestHero/CSKZ-AutoBhopJump(跳跳虎1)
当时我写这个项目的时候 还未深入研究这个游戏的反外挂功能 这个以后会重新提到
游戏本身屏蔽了一些按键模拟,我也懒得去研究究竟是怎么做到的 直接上驱动
当键盘上一个按键被按下时,产生了一个Make code,引发一个键盘中断,当一个按键被松开时产生一个Break Code,引发键盘中断。键盘中断导致键盘中断服务例程被执行,最终导致i8042prt的I8042KeyBoardInterruptService被执行,此函数从端口读出按键的扫描码,放在一个KEYBOARD_INPUT_DATA中,将这个KEYBOARD_INPUT_DATA放在i8042prt的输入数据队列中,一个中断放入一个数据,DataIn后移动一格,InputCount加1,最后会调用内核API函数KeInsertQueueDpc,进行更多处理的延迟过程调用
关于内核中KeyboardClassServiceCallback回调的更多详情可以移步这里
博客地址(作者并不是我):https://wonderkun.cc/2019/04/02/Hook%20KeyboardClassServiceCallback%20%E5%AE%9E%E7%8E%B0%E5%86%85%E6%A0%B8%E6%80%81%E6%8C%89%E9%94%AE%E8%AE%B0%E5%BD%95%E5%92%8C%E6%A8%A1%E6%8B%9F/
在内核中我只是做了一个HOOK监听 之后驱动还需要完成一些不断按下键位的操作 这里我直接用了朋友的项目整合进跳跳虎中
项目地址:https://github.com/MeeSong/DirectInput
之后便是编译测试运行 效果还不错 自动模式下空中可进行四次加速 MCJ也可以做到一些不错的效果 最高的调教可以让地速大于350(人类正常行走速度为250)
随后又在环3写了一些其他代码 比如长跳和海皇跳等等
当我兴冲冲准备进入游戏秀操作的时候 我发现问题没有那么简单
一是这个游戏会屏蔽速度过快的按下某键操作 意思就是如果你利用类似鼠标宏键盘宏疯狂发送消息的话 人物会粘在地上不站起来 所以每次发送按键消息必须要有间隔
那么问题来了 这个垃圾游戏优化一坨屎 一旦房间内人多的时候 FPS就会下降 FPS一下降 连跳脚本就不怎么正常工作了
这个问题对于按键模拟来说几乎是无解的 而且后来也不怎么玩这个游戏了 就直接丢到一边不管了
我之前发过一个帖子 是一个内核反反调试插件 不知道有没有注意过 我在未来要实现的功能中 将过HS游戏保护放在了首位 原因就是因为这个游戏
帖子地址
10年前 这个游戏最火的时候 也是游戏公司最有钱的时候 那时候的游戏保护似乎什么都有 HS xigncode3 NGS乱七八糟的反正都有貌似
可惜如今游戏过气 再加上氪金玩法劝退玩家 现在连尼玛个驱动保护都没了
等于说我这反反调试插件白写了别?
行吧...
我发出这个反反调试帖子的时候 @戏言跟班丶 认出了我的github ID 并且找到了我
他告诉我了不少关于这个游戏的小道消息 然后又贴了不少资料给我 不过他还是没弄懂如何Hook引擎 于是乎 我打开游戏 点击更新 然后开始了研究
首先先说一下这个游戏目前的反外挂手段
不知道有多少人会把processhacker直接当任务管理器用 我就是其中之一 我开着processhacker玩游戏 直接给我封7天
这波操作有点骚啊?
我尼玛什么都还没干呢就先给我封7天?
于是乎我开始了第一轮尝试
保护进程
我以前写过不少工具 小部分开源了 大部分留在了手里 进程保护就是其中之一
在内核利用ObRegisterCallbacks直接将句柄的访问权限关闭即可
项目地址:https://github.com/DragonQuestHero/QT-Process-Protect
关键代码:
[C++] 纯文本查看 复制代码
HANDLE pid = PsGetProcessId((PEPROCESS)OperationInformation->Object);
if (_List->Search((ULONG)pid, 0))
{
OperationInformation->Parameters->CreateHandleInformation.DesiredAccess = 0;
}
保护processhacker进程不被打开 然后进入游戏
成功了...还真就过了
RNM就这???
你这也要叫保护?
你还不如给撤了 这你都什么玩意卧槽?
随后尝试了CE x32dbg调试都可以正常进行
说实话 你这东西弄了还不如不弄 我x32dbg什么插件都没开 就赤裸裸的调试
好吧 那第一轮保护过了以后开始第二轮
根据 @戏言跟班丶 的小道消息 我先去UC找了一波CS1.6的代码
地址1:[color=var(--color-text-link)]https://www.unknowncheats.me/forum/counterstrike-1-5-1-6-and-mods/341723-hack-evol.html
地址2:[color=var(--color-text-link)]https://github.com/eVOL-UC/cs-1.6(顺便问一句 github eVOL-UC的这个家伙应该是国内的?要不然他头像怎么这么奇怪)
OK 打开CS1.6开始测试 各种连跳各种秀 该游戏使用了同款引擎 应该内部都是差不多的玩意
根据 @戏言跟班丶的小道消息 我又在UC逛了一圈 发现结构体和偏移略有变化 修改项目编译 准备注入
不过 @戏言跟班丶说在游戏中 还有另外一层保护 对游戏引擎的关键位置都进行了CRC验证
我一开始还寻思着要不要直接上驱动干他CRC 不过 @戏言跟班丶给了一个帖子
地址:https://bbs.pediy.com/thread-254726.htm
这个帖子指明了这个游戏的CRC漏洞 并且这个漏洞如今也没有任何变化 宛如一个智力缺陷
直接硬刚吧
创建线程,死循环锤他
[C++] 纯文本查看 复制代码
void WorkThread()
{
while (true)
{
ULONG temp_addr2 = (ULONG)GetModuleHandleA("hw.dll");
temp_addr2 += 0xA57444;
ULONG* temp_addr = (ULONG*)temp_addr2;
*temp_addr = 0xFFFFFFFF;
Sleep(1);
}
}
进入游戏 注入DLL HOOK引擎 成功
卧槽 就这就搞定了?
上午找资料下午改代码 晚上就可以玩了
可以 是时候该我秀一波了 一张图我全程连跳 怕是房间里的每个人都会觉得我是个KZ的超级大佬
结果当天晚上我就遇见了炸房的...
简单来说 给主机IP发送大量UDP消息 导致主机掉线 大概是这么个原理 我并没有深入研究 因为我是个想玩游戏的玩家 并不是来搞破坏的
有兴趣的可以看看这个帖子地址:https://bingfeng.tw/thread-657408-1-1.html
当天太晚了 我也没在意 直接睡觉 结果第二天早上起来游戏就更新了 基址也有变动 之前我都是写死的 等于说昨晚找了半天的地址白干了
没办法 再来一波吧 顺便记录一下我是如何开启某些功能的
游戏中有一个道具叫做"生命探测器" 其作用是可以看见僵尸的位置
通过反复模糊查询 最终我找到了这个地址
该地址为生命探测器的标志位 下面的那个地址也是标志位 如果玩家获得了生命探测器 该标志位会置1
直接修改为1 进游戏测试
发现并没有效果
啧...破游戏搞这么多花里胡哨的东西干什么,简单点不行么?
没办法 只能看看代码了
首先下断看看谁改写过地址 在获取道具后顺利拿到
setne byte ptr [client.dll+E39360]
这里的client.dll+E39360和我找到的标志位是同一个地址 记住这个地址
随后上IDA看一下流程
该分支首先调用了某个函数 随后验证返回值 但是没有对这个返回值进行任何的判断
接下来看第二个调用
说实话 我逆向水平菜的一B 直接F5吧
大概扫了一眼 说实话 没看懂...
垃圾游戏搞这么多花里胡哨的干什么玩意
在看看动态调试结果
注意看箭头所指的位置 刚好和该标志位是同一个地址
emmmmm
然后我又跟了一圈 第一个call只是将某个全局变量拿了出来 然后不断取值 最后走一个调用再取返回值
在该返回值和标志位同时验证成功的情况下 继续一些操作
emmmm
QNMD不弄了 直接调用试试看
[C++] 纯文本查看 复制代码
if (GetAsyncKeyState(VK_F3) & 1)
{
ULONG temp_addr2 = (ULONG)GetModuleHandleA("client.dll");
temp_addr2 += 0xDB22C4;
temp_addr = (ULONG*)temp_addr2;
if (*temp_addr == 2)
{
temp_addr2 = (ULONG)GetModuleHandleA("client.dll");
temp_addr2 += 0xE39360;
temp_addr = (ULONG*)temp_addr2;
*temp_addr = 1;
temp_addr2 = (ULONG)GetModuleHandleA("client.dll");
temp_addr2 += 0x631110;
_UNKNOW UNKNOW = (_UNKNOW)temp_addr2;
UNKNOW();
}
}
第一个判断是因为要判断阵营 也就是只有玩家在人类的阵营下才开启生命探测器
顺便一提 观察的时候也属于人类阵营 只不过玩家是死亡状态而已
进入游戏 调用 成功!
我还在死亡状态下就能直接透视到僵尸的位置了 玩逃杀极其好用 你们慢慢抢道具去吧 我先走一步
搞定之后 我再次信心满满的进入游戏 这次我有了僵尸透视 还有地速将近400的MCJ 你TM能看见我尾灯就算我输好么?
然后我真的输了...
艹 我被一个地速过千的神仙抓了 如果说我是在骑自行车的话 他的速度简直就是在开飞机
搞了半天我还只是个筑基的?
这我能忍?再次找资料找代码 结果我却发现 这个游戏的问题根本没有那么简单
在反外挂如此脆弱的前提下 游戏里面早已充满了飞天遁地和加速
最严重的是炸房
我玩了三天 被炸了三天...
而且那位修士是无差别轰炸 只要你开游戏房间 他就进去直接炸房 所有人都没办法进行游戏
而且炸房这个东西居然也不是一天两天了 而是早就有这个东西
你还真就有点上汽大众2019款帕萨特的味道了
没办法 我被逼无奈只能再次查找资料 据说游戏开始后可以拿到IP和端口 进行DDOS的话可以炸房
我寻思能不能找到玩家的IP 然后以暴制暴 直接给他干掉线 结果却看到了这样的一段对话
行吧...那我认输了...不玩了 再见!
即便是我写出了飞天遁地和加速甚至炸房这种变态功能 那有什么意义呢?我只是想单纯的装个B 让别人以为我是KZ大佬而已 我把房间炸了 那我玩什么?
当初写跳跳虎1的时候 我删除了环3的代码 也没有放出过二进制文件 就是怕被封号
原本这份代码至少也要等到我不玩这个游戏以后才真正放出来 但现在也没有意义了 直接上代码和二进制文件吧 我也不害怕封号了
之前debug的时候 一不小心让游戏跑了起来
然后我就被制裁了...
你有这闲工夫为什么不去治治那些大罗金仙?找我个筑基的出气很有意思么?
最后在补充一句
垃圾游戏 吃相难看 一个劲的让玩家氪金却丝毫不在意玩家的意见 也从来不在乎游戏环境如何 吃屎吧 告辞!
现在我又得浪费时间去重新搞一份CSGO内存加速连跳 CSGO的僵尸逃跑我不信还有炸服务器挂
(我以前很少逛论坛 貌似等级不够不让上传附件 那就没办法了 各位自己编译去吧...里面的地址应该直到下一次更新前都可以用 之后各位自己手动更新)
跳跳虎2项目地址:https://github.com/DragonQuestHero/CSOL-AutoBhop
|