吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 66415|回复: 257
收起左侧

[原创] C++配合Cheat Engine实现cs1.6外挂

    [复制链接]
Vica 发表于 2018-7-12 23:30
本帖最后由 Vica 于 2018-7-16 20:49 编辑

原文首发于我的博客 https://blog.vicayang.cc/Project-CS1-6-hack/ ,发来这里一是和各网友相互交流,而主要是为我的个人站点打打广告。新人建站不易,欢迎大家多多关注+书签+rss订阅等。近期主要更新相关的笔记和一些之前的做的比较满意的小项目。

CS 1.6 hack

这是大三上学期汇编语言课的大作业,参与者有CalciferZh,和IrisYGL 。我们的选题是对过气游戏CS1.6 (Esai 3248版)进行外挂的编写,主要涉及到利用反汇编、注入dll等技术进行游戏的修改。

DLL注入

我们知道,每个dll文件里都有一个dllMain的入口,可以在那里设置当dll被process/thread进行attath/deattach等操作时执行的操作。那么我们编写我们的外挂代码,然后将其注入进cstrike.exe中就可以实现许多作弊功能了。
至于具体的注入方式,我们采取了远程创建线程注入的方式。具体的过程和解释如下

  1. 先获取注入目标的进程句柄,可以通过进程名、pid等方式获得
  2. 给注入目标开辟一块内存空间存储dll的路径,然后远程写入
  3. 获得加载dll的函数LoadLibraryW的地址,由于所有win32进程都加在了kernel.dll,因此该函数在所有进程的内存位置都是一样的,这为我们提供了方便
  4. 创建在注入目标里远程线程,执行LoadLibraryW,参数自然就是之前写入诸如目标内存空间的dll路径名

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

Hook opengl 函数实现透视、反烟雾、闪光

我们知道,cs1.6有opengl模式,也就是通过调用glBegin等函数进行人物等模型的绘制。那么在执行相关操作之前执行我们想要的操作就可以实现相关的hack。比如说,如果识别出正在绘制烟雾弹,直接终止绘图操作就能够实现反烟雾。如果正在绘制人物的模型,那么关闭深度检测,或者将人物的深度拉到很近也就能实现透视的效果了。
因此目前的核心在于,如何在游戏调用相关的函数的时候,先行调用我们插入的函数,并不影响原函数的正常运行。

void *inject(BYTE *entry, const BYTE *target, const int len) {
  BYTE *new_entry = (BYTE*)malloc(len + 5); 
  DWORD dwback;
  VirtualProtect(entry, len, PAGE_READWRITE, &dwback); 
  memcpy(new_entry, entry, len); 
  new_entry += len;
  new_entry[0] = 0xE9; // jmp
  *(DWORD*)(new_entry + 1) = (DWORD)(entry + len - new_entry) - 5;
  entry[0] = 0xE9; 
  *(DWORD*)(entry + 1) = (DWORD)(target - entry) - 5; 
  VirtualProtect(entry, len, dwback, &dwback);
  return (new_entry - len);
}

​    为了帮助理解这一段代码的功能,我画了一张草图

示意图

注意到下列事实会有助于理解

  • 游戏里每次调用相关函数都会从entry处执行,因此我们需要在entryjmp到我们预先执行的代码target
  • jmp函数会覆盖原有的指令,我们需要对其进行备份,并且留有接口能正确的执行原函数new_entry
  • 我们可以存下new_entry的地址,以备target里使用
  • 每个指令都有各自的长度,我们不能随意打断拆分。所以我们需要用IDA等工具查看entry处的汇编指令情况,找到len长度的字节,保证len大于等于5且不会打断指令

关于len的示意图如下,hook这个函数是len需要设成7(或者更大,但不能打断指令)

示意图

同时为了方便理解,放上相关的示例代码

void APIENTRY Hooked_glVertex2f(GLfloat x, GLfloat y) {
  if (antiFlash && y == coords[3]) { // 开启反闪光且目前正在画闪光
    glColor4f(1, 1, 1, 0.01f); // 将透明度调成0.01
  }
  (*pglVertex2f)(x, y);
}
//...
pglVertex2f = (glVertex2f_t)inject((LPBYTE)GetProcAddress(hOpenGL, "glVertex2f"), (LPBYTE)&Hooked_glVertex2f, 6);

上述代码就可以实现在执行glVertex2f时,先跳转到我们的Hooked_glVertex2f函数执行,而pglVertex2f就是原函数的功能备份。当然如果判断完不需要绘制(比如烟雾)的话,直接return也就可以了。

通过对mp.dll的分析实现hack

在使用IDA和CE修改器等工具后,我们可以发现一个核心的dll——mp.dll。绝大多数的游戏相关的函数都存在里面,这也是我们攻击的重点。

定位数据

拿到游戏里人物、枪械的数据是我们实现hack非常重要的一步。这里我们使用CE修改器帮助我们完成相关的操作。这里以生命值(HP)为例来说明我们如何定位关键数据的内存地址。  

我们首先在游戏中通过各种方式反复改变自己的HP,同时利用CE监控内存变化。如果内存中的某个数据总是和我们的HP保持一致,那么我们就可以认为这个地址很大概率上储存了玩家的生命值。但在实际操作中,HP的值往往在内存中存在多个副本,还需要逐个分析筛选,找到唯一的记录HP的内存地址。  

但是即便我们这里得到了一个地址,这个地址也不会是一成不变的。在重每次新运行进程的时候,进程的地址都有可能变化,因此我们需要把获得的绝对地址转化为相对于进程的偏移地址。具体来说,我们一级一级寻找它的指针,直到这个地址位于游戏主进程cstrike.exe里面。一个基本的步骤如下

  1. 我们获得了HP存储的地址 0x0B221D5C。
  2. 我们监测修改该处值的代码,并使自己受伤,然后可以看到修改该地址的语句含有[eax+00000160]的字样。
  3. 因此我们可以大胆断定,eax此时存的是某个结构体的指针,而hp作为结构体的成员被存储在+160的位置。因此我们读取eax的值,然后直接在内存中搜索这个值,就可以找到存放这个指针的位置。

至此,我们就成功找到了hp上一级的地址。重复上述操作直到该地址不再是绝对的内存地址,而是cstrike.exe + offset的形式时,我们就找到了hp的正确访问方式,而不用担心进程加载以及malloc的时候开辟空间的不同造成的影响。

同样的,我们也对其他容易观测并修改的值进行了定位,并依靠其获得了许多有用的数据如下

地址 描述
[[[cstrike.exe+11069BC]+7c]+4]+160 玩家HP
[[[cstrike.exe+11069BC]+7c]+4]+16C 玩家是否可以受伤
[[[cstrike.exe+11069BC]+7c]+4]+1BC 玩家护甲
[[[cstrike.exe+11069BC]+7c]+4]+8 玩家坐标 X
[[[cstrike.exe+11069BC]+7c]+4]+C 玩家坐标 Y
[[[cstrike.exe+11069BC]+7c]+4]+10 玩家坐标 Z
[[cstrike.exe+11069BC]+7c]+1CC 玩家金钱
[[cstrike.exe+11069BC]+7c]+3C4 到达特定区域(包点、购枪点、人质点)会更新
[[[cstrike.exe+11069BC]+7c]+5EC]+CC 玩家当前武器子弹

其中像X,Y,Z坐标的信息是难以通过搜索内存定位的。但从已经确定的如玩家HP,护甲等信息,我们可以猜到[cstrike.exe+11069BC]+7c]存放着玩家的相关信息,而[[cstrike.exe+11069BC]+7c]+4]里面存放的就是和玩家物体直接相关的信息。那么我们通过对[[cstrike.exe+11069BC]+7c]+4]里所有的offset进行监控,也就能定位出这样一些难以直接定位的数据。

关键语句定位

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

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

  1. 使用CE监视内存,不断修改游戏中的某个状态,找到内存中控制这个状态的数据地址。
  2. 使用CE找到修改这条数据的语句的地址(实际上关心的是在dll中的偏移量)。
  3. 基于IDA Pro对dll的反汇编,根据上面得到的地址,找到对应的语句,阅读包含这条语句的函数的汇编代码,理解含义。

关键语句修改

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

这个方法确实不错,也能达到很多效果比如不掉血不掉甲。但是由于这些函数都是全局共享的,也就是双方都不掉血掉甲,作为一个外挂来说肯定是失败的。

更为通用的办法还是仿照之前的写法进行hook,而在hook的代码里就可以检测调用者的信息,如果是自己就加入类似无敌、攻击翻倍等功能。

我们实现过的功能包括无限子弹,秒杀(用户造成的伤害锁定为255),无敌,随地买枪下包等。有兴趣的读者也可以自行尝试。建议先用CE修改器达到类似功能,然后再考虑如何写入dll文件中。

Demo(需要科学上网)

Youtube 链接

<iframe width="560" height="315" src="https://www.youtube.com/embed/OXbHltHgf-U" frameborder="0" allowfullscreen></iframe>

免费评分

参与人数 82吾爱币 +75 热心值 +81 收起 理由
仓鼠飞轮博士 + 1 + 1 谢谢@Thanks!
LEP + 1 + 1 谢谢@Thanks!
wangwangyang + 1 谢谢@Thanks!
chenwei8865 + 1 用心讨论,共获提升!
yukarinrin + 1 + 1 用心讨论,共获提升!
cyn123 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
lovebout + 1 + 1 6666 , 神贴
六卖神剑 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
44018723 + 1 + 1 用心讨论,共获提升!
YCAPTAIN + 1 + 1 谢谢@Thanks!
ToninG + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
siuhoapdou + 1 + 1 谢谢@Thanks!
艾米iii + 1 + 1 我很赞同!
孟德兄 + 1 用心讨论,共获提升!
GaaraZL + 1 + 1 先顶在看。,
dreamweaver0314 + 1 + 1 用心讨论,共获提升!
Ebichu + 1 + 1 我很赞同!
lyx1104 + 1 + 1 不过这游戏我相信没人开挂,和朋友一起玩开挂是什么心态。
醋拌柠檬 + 1 我很赞同!
sam43125 + 1 + 1 我很赞同!
ADuanGeGe + 1 + 1 我很赞同!
涛之雨 + 1 谢谢@Thanks!
czxtzh + 1 + 1 谢谢@Thanks!
huoji09 + 7 热心回复!
尼古拉洛夫斯基 + 1 + 1 太牛逼了
himici + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
whdfog + 1 + 1 用心讨论,共获提升!
七度空间 + 1 + 1 谢谢@Thanks!
羽月莉音 + 1 + 1 我很赞同!
叶月 + 1 + 1 谢谢@Thanks!
笑心zz + 1 + 1 牛逼啊
咱老陈啥身份呐 + 1 + 1 谢谢@Thanks!
森屿浅心 + 1 + 1 用心讨论,共获提升!
hhh3h + 1 我很赞同!
6662680 + 1 我很赞同!
ximargin + 1 我很赞同!
RoB1n_Ho0d + 1 热心回复!
虚滞 + 1 + 1 谢谢@Thanks!
遛你玩528 + 1 + 1 谢谢@Thanks!
sunnylds7 + 1 + 1 热心回复!
李怡浩 + 1 + 1 用心讨论,共获提升!
博愚c + 1 + 1 谢谢@Thanks!
永远的永远 + 1 + 1 我很赞同!
oyxbl + 1 + 1 热心回复!
zswseu + 1 + 1 我很赞同!
smallpox + 1 + 1 热心回复!
iteamo + 1 + 1 热心回复!
SeimonYH + 1 + 1 我很赞同!
zzzlucas + 1 + 1 谢谢@Thanks!
cbaef + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
啦灯是我干掉的 + 1 + 1 用心讨论,共获提升!
当红灬依赖 + 1 + 1 我很赞同!
Undefine + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lookerJ + 1 + 1 我很赞同!
SomnusXZY + 1 + 1 热心回复!
反正都一样 + 1 + 1 谢谢@Thanks!
jnez112358 + 1 谢谢@Thanks!
隨風而飄 + 1 + 1 用心讨论,共获提升!
小俊 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
170059475 + 1 + 1 用心讨论,共获提升!
lyrong + 2 + 1 用心讨论,共获提升!
Smt、萌牙 + 1 我很赞同!
huangshaocheng + 1 + 1 用心讨论,共获提升!
poisonbcat + 1 + 1 用心讨论,共获提升!
PengZi + 1 + 1 我很赞同!
Zzz奈斯 + 1 + 1 用心讨论,共获提升!
打酱油的咸鱼 + 1 + 1 我很赞同!
Dicker + 1 + 1 谢谢@Thanks!
dianshen + 1 + 1 我很赞同!
Ravey + 1 + 1 谢谢@Thanks!
dszbox + 1 + 1 谢谢@Thanks!
qaz003 + 1 + 1 求私信分享科学进油管。。。
蛋蛋菌 + 1 + 1 谢谢@Thanks!
朱朱你堕落了 + 1 + 1 现在大三学生的水平都已经这么叼了吗? 好吓人!!!
wattwei + 1 有前途啊,这么年轻
xiaoxi2011 + 1 + 1 谢谢@Thanks!
YIMENG + 1 + 1 谢谢@Thanks!
浅笑如昔丶 + 1 作业?老师居然用挂当作业?
gxliujian + 1 我很赞同!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sniper9527 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
天使3号 + 1 + 1 THU大佬~

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2018-7-13 18:45
给予精华鼓励,修改代码hook那可以完善一下。

免费评分

参与人数 1热心值 +1 收起 理由
liphily + 1 能不能把youtube视频拖过来——

查看全部评分

 楼主| Vica 发表于 2018-7-13 23:12
xiaoxi2011 发表于 2018-7-13 23:08
觉得很厉害,可惜我没看懂
谢谢分享

没有看懂一定是讲的人没讲清楚。这份文档对于代码内部没有讲的特别深,主要是给大家一个直观的印象——怎么通过hook这个技术取修改某个函数使其达到我们想要的功能。这种讲法有的人觉得浅显直观有的人觉得我就在天马行空。如果您真的感兴趣的话我是建议你直接看源代码,加起来也就两三百行而且有信息的核心代码就那么十几句,希望能帮到您~
 楼主| Vica 发表于 2018-7-12 23:43
当然我相信各位也不太会再去为这么个过气游戏写hack,不过作为一个入门的练手项目,分析怎么定位,怎么hook等还是很有帮助的,共勉
 楼主| Vica 发表于 2018-7-13 09:59
Github链接 https://github.com/CalciferZh/CS-Hack 居然忘了放了。。
珍惜幸福涙 发表于 2018-7-13 17:28
请教楼主一波伤害锁定为255是怎么分析的呀,我感觉没有比较好的方法定位到伤害
zhaotianrun 发表于 2018-7-13 18:00
这玩意能在服务器上使吗,希望能来个过检测的,这样就厉害了。。。
mirkeyang 发表于 2018-7-13 18:01 来自手机
厉害我的哥,学习了,谢谢!
天使3号 发表于 2018-7-13 18:05
THU,厉害了我的楼主
唯殇 发表于 2018-7-13 19:32
前来学习!!
b1161013873 发表于 2018-7-13 19:53
大佬有成品吗?想试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 16:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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