CS 1.6 Hack 我们的主题是为老游戏CS1.6(Esai 3248版本)创建一个插件。这主要涉及反汇编、DLL 注入和其他游戏修改技术的使用。
DLL注入
我知道每个DLL 文件都有一个dllMain 条目,我可以在其中设置当进程/线程附加/取消分离DLL 时要执行的操作。接下来,创建插件代码并将其插入到cstrike.exe 中以实现许多作弊功能。
作为具体的注入方式,我们采用了远程创建线程注入的方法。具体步骤及说明如下
首先,获取注入目标的进程句柄。通过进程名、pid等获取打开注入目标的内存空间存放dll的路径,远程写入,获取函数LoadLibraryW的地址。加载DLL。所有win32进程都添加到kernel.dll中,因此该函数的内存位置对于所有进程都是相同的。这使得在注入目标上创建远程线程并运行LoadLibraryW 变得容易。当然,该参数是先前写入目标内存空间的DLL路径名的私有消息。编辑:“01”您可以访问讲座和资料了!至此,DLL已经成功插入,并进行了相关操作。这里我们要做的就是下面介绍的hook操作。
挂钩openGL函数实现透视、防烟、闪
我们知道cs1.6有一个opengl模式,可以调用像glBegin这样的函数来绘制字符和其他模型。然后,您可以通过在执行相关操作之前执行必要的操作来完成相关的hack。例如,如果识别出正在抽取烟雾弹,则可以通过直接终止抽取操作来实现防烟雾。如果您正在绘制角色模型,则可以通过关闭深度检测或使角色的深度非常接近来实现透视。
那么现在的核心就是如何在游戏调用相关函数的时候,首先调用你插入的函数,而不影响原来函数的正常行为。
请注意以下事实:
每次游戏中调用相关函数时,都会从入口开始执行,因此需要跳转到入口上预先执行的代码目标。 jmp 函数会覆盖原来的指令。你需要备份它。原始函数new_entry 允许您保存new_entry 的地址,以防在目标中使用它。每条指令都有自己的长度,除法不能随意中断。因此,必须使用IDA等工具检查入口处的汇编指令,找到长度为len的字节,并确保len不会中止5或更多的指令。关于len,对于hook函数,len必须设置为7(或更高,但不能中断命令)
同时提供了相关示例代码,方便理解。
上面的代码,在运行glVertex2f时,会首先跳转到Hooked_glVertex2f函数的执行,可以意识到pglVertex2f是原函数的函数备份。当然,如果判断后不需要绘制(烟雾等),则返回即可。
通过分析mp.dll实现黑客攻击
使用IDA和CE修饰符等工具,您将找到核心dll——mp.dll。大部分游戏相关的功能都有,这也是我们攻击的重点。
位置数据
获取游戏中的角色和枪支数据是实施黑客攻击的非常重要的一步。这里我们使用CE修饰符来完成相关操作。本节以健康值(HP)为例,说明如何识别关键数据的内存地址。
首先,我们在游戏中以不同的方式迭代HP的变化,并使用CE来监控内存的变化。如果内存中的某些数据总是与HP匹配,我们可以假设这个地址很可能存储玩家的健康状态。但在实际操作中,HP值往往在内存中存在多份,必须逐一分析、筛选,找到记录HP的唯一内存地址。
然而,即使你在这里得到了地址,这个地址也不是静态的。由于每次重新运行进程时进程的地址可能会发生变化,因此必须将获得的绝对地址转换为相对于进程的偏移地址。具体来说,它会在每个级别中查找指针,直到在游戏的主进程cstrike.exe 中找到该地址。基本步骤是:
获取HP存储地址0x0B221D5C。
因此,如果您观察更改值并伤害自身的代码,您会发现更改地址的语句包含单词[eax+00000160]。
因此,现在我们可以大胆地得出结论,eax 存储了一个指向特定结构的指针,并且该结构的成员hp 存储在位置+160 处。所以我们读取eax的值,直接在内存中查找这个值,找到这个指针存放在哪里。
至此我已经成功找到hp的上层地址了。重复上述操作,直到该地址不是绝对内存地址,而是cstrike.exe + offset的形式,并发现HP的正确访问方法,而不必担心加载进程时和malloc时的可用空间差异。
同样,我们还确定了其他易于观察和更改的值,并利用它们获得了大量有用的数据:
其中一些信息(例如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代码中检测调用者的信息,如果有的话,添加无敌或者双重攻击之类的功能。
实现的一些功能包括无限弹药、即时杀戮(用户造成的伤害固定为255)、无敌以及可以在任何地方购买枪支。有兴趣的读者可以自己尝试一下。我们建议您首先考虑使用CE修饰符来实现类似的功能,然后将其写入dll文件中。
标题:c++写插件,c++插件下载
链接:https://yyuanw.com/news/xydt/7591.html
版权:文章转载自网络,如有侵权,请联系删除!