CS 1.6 hack

我们的课题是为过时的游戏CS1.6(Esai 3248版)编写插件,主要涉及到利用反汇编、DLL注入等技术对游戏进行修改。

DLL注入

我知道每个dll文件都有一个dllMain的条目,您可以在其中设置当进程/线程附加/解除附加dll时要执行的操作。然后我们编写我们的插件代码,然后注入到cstrike.exe中,就可以实现很多作弊的功能。

至于具体的注入方式,我们采用了远程创建线程注入的方法。具体流程及解释如下

首先获取注入目标的进程句柄。可以通过进程名、pid等获取为注入目标开辟一块内存空间存放dll的路径,然后远程写入获取加载dll的函数LoadLibraryW的地址。由于所有win32进程都添加了kernel.dll,所以该函数的内存位置在所有进程中都是相同的,这给我们提供了方便

至此,dll已经成功注入,并进行了相关操作。我们这里执行的是下面介绍的hook操作

挂钩opengl函数实现透视、防烟、闪光

我们知道cs1.6有opengl模式,就是通过调用glBegin等函数来绘制字符等模型。那么在执行相关操作之前,先执行我们想要的操作就可以实现相关的hack了。例如,如果识别出正在抽取烟雾弹,则可以通过直接终止抽取操作来实现防烟雾。如果您正在绘制角色模型,则可以通过关闭深度检测或将角色的深度拉得很近来实现透视效果。

因此,当前的核心是如何在游戏调用相关函数时,先调用我们插入的函数,同时又不影响原有函数的正常运行。

注意以下事实将会有所帮助

游戏中每次调用相关函数时,都会从入口开始执行,所以我们需要在入口处跳转到我们预先执行的代码目标。 jmp函数会覆盖原来的指令。我们需要备份它并留下一个接口才能正确执行它。在原来的函数new_entry中,我们可以保存new_entry的地址,以备在目标中使用。每条指令都有自己的长度,我们不能随意中断分割。因此,我们需要使用IDA等工具来检查入口处的汇编指令,找到len长度的字节,并保证len大于等于5并且不会中断指令。关于len的示意图如下。对于钩子函数,len需要设置为7(或更大,但不能中断命令)

c++配合Cheat Engine实现cs1.6插件

同时,为了方便理解,提供了相关示例代码。

上面的代码可以实现,在执行glVertex2f时,会首先跳转到我们的Hooked_glVertex2f函数中执行,而pglVertex2f就是原来函数的函数备份。当然,如果判断后不需要绘制(比如烟雾),就直接返回即可。

通过分析mp.dll实现hack

通过IDA、CE修改器等工具,我们可以发现一个核心dll——mp.dll。大部分游戏相关的功能都存在其中,这也是我们攻击的重点。

位置数据

获取游戏中的角色和枪械的数据是我们实施hack的非常重要的一步。这里我们使用CE修饰符来帮助我们完成相关操作。这里以健康值(HP)为例来说明我们如何定位关键数据的内存地址。

我们首先在游戏中通过各种方法反复改变我们的HP,并使用CE来监控内存变化。如果内存中的某个数据始终和我们的HP一致,那么我们就可以认为这个地址大概率存储着玩家的生命值。但在实际操作中,HP的值往往在内存中存在多份,需要逐一分析、筛选,找到记录HP的唯一内存地址。

但即使我们在这里得到一个地址,这个地址也不会是静态的。每次进程再次运行时,进程的地址可能会发生变化,所以我们需要将获得的绝对地址转换为相对于进程的偏移地址。具体来说,我们逐级寻找它的指针,直到这个地址位于游戏主进程cstrike.exe中。基本步骤如下

我们获得了HP存储地址0x0B221D5C。

我们监控那里修改值的代码,伤害自己,然后可以看到修改地址的语句中包含了[eax+00000160]这样的字样。

因此,我们可以大胆推断,此时eax存储的是一个指向某个结构体的指针,而hp作为该结构体的成员,存储在+160位置。因此,我们读取eax的值,然后直接在内存中查找这个值,找到这个指针存放的位置。

至此,我们已经成功找到hp的上层地址了。重复上述操作,直到该地址不再是绝对内存地址,而是cstrike.exe + offset的形式。我们找到了HP正确的访问方式,不用担心进程加载和malloc时空间打开的差异。影响。

c++配合Cheat Engine实现cs1.6插件

同样,我们还找到了其他易于观察和修改的值,并依靠它们获得了大量有用的数据,如下:

其中X、Y、Z坐标等信息很难通过搜索内存来定位。但从确定的玩家血量、护甲等信息可以猜测,[cstrike.exe+11069BC]+7c]存储的是玩家相关信息,而[[cstrike.exe+11069BC]+7c]+4]里面存储的是与玩家对象直接相关的信息。然后通过监控[[cstrike.exe+11069BC]+7c]+4]中的所有偏移量,我们就可以定位到这些很难直接定位的数据。

关键语句定位

找到关键数据后,我们需要找到修改该数据的函数语句。我们首先使用CE来监控修改关键数据的语句,这里经常会得到很多语句;然后我们需要一一查看反汇编,过滤,最终找到核心语句。这样我们就得到了该语句相对于动态链接库起始位置的地址。由于动态链接库在内存中的加载地址是不固定的,所以我们需要使用Windows提供的一系列API来计算出这条语句在内存中实际加载的地址,然后才能进行后续的操作。

定位目标函数的一般过程如下:

使用CE来监控内存,不断修改游戏中的某个状态,找到内存中控制这个状态的数据地址。

使用CE找到修改这个数据的语句的地址(实际上你关心的是dll中的偏移量)。

基于IDA Pro对dll的反汇编,根据上面得到的地址找到对应的语句,阅读包含该语句的函数的汇编代码,理解其含义。

关键语句的修改

修改分为两类。一种是简单地编写新的语句来覆盖原来的内容。这部分比较简单。只需要将机器码直接写入指定的内存即可。但是,也有很多限制。一般只写入0x90(nop),相当于去掉某条指令。

这个方法确实不错,可以达到很多效果,比如不掉血,不掉甲。不过,由于这些功能是全局共享的,即双方都不损失生命值或护甲,所以作为插件肯定会失败。

比较通用的方法是按照前面的写法进行hook,在hook代码中可以检测到调用者的信息。如果是自己的话,可以添加无敌、攻击倍增等功能。

用户评论

迁心

哇,这个c++和Cheat Engine的结合真是太酷了,cs1.6的插件开发是不是就简单多了?

    有5位网友表示赞同!

妄灸

搞这个插件能提高游戏体验吗?我是不是也可以试试自己开发一个?

    有11位网友表示赞同!

(り。薆情海

对新手来说,这个教程是不是有点复杂啊?能详细点吗?

    有19位网友表示赞同!

墨城烟柳

我一直想自己搞个cs1.6插件,现在有了教程,终于可以动手试试了!

    有17位网友表示赞同!

余笙南吟

学这个之前,我最好先复习一下C++和Cheat Engine的基础知识吧。

    有14位网友表示赞同!

涐们的幸福像流星丶

插件开发难度大不大?有没有什么推荐的书籍或资源?

    有12位网友表示赞同!

╭摇划花蜜的午后

哈哈,终于有人把C++和Cheat Engine结合起来开发cs1.6插件了,太实用了!

    有14位网友表示赞同!

暖栀

这个教程看起来很详细,但是我得先看看我电脑上有没有装Cheat Engine。

    有19位网友表示赞同!

面瘫脸

学这个肯定能提升我的编程技能,但是得花时间学习啊。

    有12位网友表示赞同!

清羽墨安

这个插件能解决cs1.6的哪些常见问题?比如作弊啊,卡顿啊之类的。

    有14位网友表示赞同!

心已麻木i

c++配合Cheat Engine搞cs1.6插件,听起来好专业啊,我也想试试。

    有10位网友表示赞同!

我没有爱人i

教程里的代码能直接用吗?还是需要自己修改?

    有14位网友表示赞同!

闷骚闷出味道了

学习了,这种插件开发对游戏公平性有影响吗?

    有13位网友表示赞同!

夜晟洛

我之前一直想自己做一个cs1.6的插件,现在有了这个教程,真是太及时了!

    有7位网友表示赞同!

仅有的余温

搞这个插件需要一定的编程基础吧?我能学会吗?

    有16位网友表示赞同!

oО清风挽发oО

看了教程,感觉开发cs1.6插件也没有那么难嘛,准备动手试试。

    有15位网友表示赞同!

丢了爱情i

这个教程真的很详细,让我对c++和Cheat Engine有了更深的了解。

    有13位网友表示赞同!

命里缺他

cs1.6插件开发是个好技能,学了这个,以后可以自己修改游戏了。

    有9位网友表示赞同!

拽年很骚

希望教程能更新一下,加入更多实战案例,这样学起来更有动力。

    有11位网友表示赞同!

标签: