以“疯狂赛车怀旧版”为例,达成过掉本地检测的目的
ce吧
全部回复
仅看楼主
level 7
我找到了这个游戏中的氮气数量,修改成100并锁定后,达成了无限氮气的目标,但是一旦开启无限氮气,进入游戏时就会冒出弹框,然后游戏闪退。
本帖讲的是:运用基础知识“手动查找地址”的技巧,来找到游戏的本地检测
选择这个游戏的原因是,我的电脑比较差,这个游戏比较老,只有这种游戏我的电脑才能带的动,而且这个游戏比较简单,里面调用的系统call都没有变化,正好适合刚学会基础知识的新手来练习
2026年01月28日 14点01分 1
level 7
现在我面临的问题就是:只有一个弹窗,点完确定后立刻闪退,所以我能想到的入手方法有三个
1:从弹窗入手
找到负责弹窗的代码,这样就可以往回找是哪里出了问题导致弹窗。
但是当时的我不知道该怎样用ce给弹窗下断点,我没法定位弹窗的代码
2:从弹窗上面的文字入手
既然无法直接定位弹窗,就得先找弹窗代码的位置,找到后就可以继续了。
3:从闪退入手
因为我发现弹窗后游戏仍然在运行,只不过是不能进行任何操作,点完确认后游戏才会闪退,找到负责闪退的代码就可以无视弹窗,继续运行游戏了,但是我也不知道怎么用ce给闪退代码下断点。
所以最终选择了从文字入手
2026年01月28日 14点01分 2
不用从文字入手,可以从消息框的api入手
2026年01月28日 14点01分
@叶-辰 我不会,我也不知道该怎么下手
2026年01月28日 14点01分
level 10
[呵呵]你锁100可以直接右键查看什么访问了这个地址,差不多就能找着检测
2026年01月28日 14点01分 3
我也试过了,没得到结果,也不知道是哪里出了问题
2026年01月28日 15点01分
这不是小旭吗[阴险]
2026年01月29日 01点01分
level 7
数据类型选字符串,搜索:程序被非法修改,为了游戏的公平,请正常游戏!
直接扫描搜不到任何结果,说明字符串用的编码类型不是ASCII(大概吧,我也不知道对不对),勾选代码页也搜不到。utf-16也搜不到东西。
理论上来说应该是能扫到东西的,内存中肯定是有一串数据来代表这句话,等用到的时候直接调用就可以了,(不排除有神经病代码,写个字符串也是临时拼一串字符来输出,碰见这种代码算我倒霉)
那么问题出在哪里?
2026年01月28日 14点01分 4
我还以为你是发教程
2026年01月28日 15点01分
这种老游戏可能是big5编码或者gbk编码,太老了ce不支持,得你手动转十六进制数组 再搜
2026年01月28日 15点01分
@叶-辰 稍等,我慢慢来
2026年01月28日 15点01分
level 10
你这游戏不是模拟器里的吧
2026年01月28日 15点01分 5
level 7
经过一番查找后,我才想到,既然是字符串,那可能就压根不让随便修改,我之前只搜索可写类型,所以才搜索不到。
改了下选项后搜到了。
2026年01月28日 15点01分 6
原来你真是发教程
2026年01月28日 15点01分
你可以直接4字节不可写不对齐搜这个字符串地址
2026年01月28日 16点01分
level 7
将地址拉下来,右键-查找访问,进入游戏,游戏弹框,成功拦截到三条代码
2026年01月28日 15点01分 7
level 7
重新进入游戏,这时候选择这个老游戏的好处就体现出来了,拦截到的这三条地址完全没有变动。
面对这三条地址我很发愁,别说当时我怎么想的了,就是现在我第二遍看见了,我也看不懂是啥意思。
懵了一分钟,没想出什么办法,只好碰碰运气了。
首先从第一条开始吧。
分别打开额外信息窗口和内存窗口
我们观察这句代码:mov al,[ecx] 将ecx的值传递给al
从信息窗口可以看出,ecx正好就是我们找到的字符串所在的地址,而这个地址的值存储的就是文字信息
也就是说,当ecx的地址为 00C0EF1C 时,就是弹框调用文字的时候。
接下来我们的目标就是:找到ecx在什么条件下会变成 00C0EF1C
2026年01月28日 15点01分 8
level 7
选中地址,按下f5下断点,进入游戏,成功断下
还好游戏比较老,没有什么弯弯绕绕,这一段代码并不是公用代码,它只有在文字被调用时才使用,断下来的地方ecx正好就是00C0EF1C
(现在游戏不是这么简单,学会操作手法就行,照抄肯定是不行的)
顺便给代码打上注释,免得忘记了
2026年01月28日 15点01分 9
level 7
接下来观察代码,这句代码的上方有一句代码是:mov ecx,[e
bp
+0C] 将ebp+0c的值传递给ecx
可以猜测ecx的值可能是由这一句代码来决定的。
我们将这个地址输入ce来看看对不对。
记得勾选十六进制,截图时忘记画剪头了
2026年01月28日 15点01分 10
level 7
如果有了经验,看见ebp+xx、esp+xx这种代码,就可以知道这里涉及到堆栈,我们可以直接从堆栈窗口来看到对应的信息
在堆栈窗口右键,选择完整堆栈,ebp+*
这样就能看见ebp+c的值正好就是00C0EF1C
所以我们的目标就是找到ebp+c的值是怎么来的
2026年01月28日 16点01分 11
level 7
由于涉及到堆栈,建议先看一下堆栈的基础知识,不用看懂,有点了解就够了
不看也没有关系,反正这里也用不到。
我们先简单的将ebp+0c看作一个整体
我们继续往上翻,直到这段代码已经到头了,也没找到ebp+0c的赋值语句,所以猜测ebp+0c的值可能是在这个call外面赋予的
所以我们需要点单步退出来跳出当前这个call
如果直接点单步退出,会发现一直卡在我们刚才下的那个断点上
经过观察后发现,下面有一句代码正在跳回到我们下断点的代码上,导致代码循环运行,所以一直被中断
所以我们先去掉断点,再进行单步退出
另外再次观察ecx后发现,ecx的值在不断的变动,原来之前正好等于00C0EF1C是因为我们运气好,这个代码用到的第一个值就是我们想要的
2026年01月28日 16点01分 12
如果你不信邪,顶着暂停一直不停的点步出,直到跳出,你就会发现,居然直接跳到了外面,节省了不知道多少时间,™d,6……
2026年01月28日 16点01分
level 7
没注意时间过12点了,我去刷短视频赚点金币,顺便休息一会儿
2026年01月28日 16点01分 13
level 7
跳出去后,来到这个地方,test eax,eax
上面一句代码是call USER32.MBToWCSEx
我们刚才就是在这个call里面,猜测这个call就是用来输出文字的,在注释上标记一下
单步退出就是从当前代码运行到代码返回去的地方,也就是call的下一句
(unity游戏不是这样的,它的代码不一样,点一下步出就飞出去外太空了,需要从头点步出,或者自己手动点到返回)
其实没有啥有用的信息,跟ebp+c只有两个,但是一个是push,一个是cmp,所以猜测可能还在这个call的外面。
call后面的这个地址是:USER32.MBToWCSEx
百度后得知,MBToWCSEx 是一个系统函数,作用是将消息框的文字转换成字符串。
这说明我们目前在MassageBoxEx函数中,只要跳出去,找谁调用了这个消息框函数,就知道检测的地方在哪里了。
不过当时我还看不懂。
2026年01月28日 17点01分 14
MassageBoxA函数 照着百度超,看错行,抄错了,我觉得大家应该能理解,我就不重新写了
2026年01月28日 17点01分
level 7
我们继续步出
这次步出后发现,突然不能点击单步退出了。
这是因为我用的这个版本ce有bug,它运行到本来该停的地方没停下来,导致虽然断点还在,但是游戏还是继续运行了
2026年01月28日 17点01分 15
当前这个call就是弹窗call了,所有的需要弹出消息框的代码都会调用这个call
2026年01月28日 17点01分
1 2 尾页