欢迎光临散文网 会员登陆 & 注册

2021腾讯游戏安全技术复赛pc客户端安全wp

2021-04-19 10:45 作者:吾爱破解论坛  | 我要投稿

作者论坛账号:Qfrost


题目说明:

  1. shootgame是一个游戏,hack.exe是游戏shootergame的一个外挂程序。

  2. 运行shootgame游戏,运行hack.exe,成功执行外挂功能并分析外挂实现过程。

  3. 实现一个与hack.exe的功能相同的,但是游戏逻辑原理不同的外挂程序。(游戏逻辑原理不同:指外挂程序对读写游戏数据结构或代码的攻击内容不同,并不是读写内存方式、注入内存方式、外挂核心核心代码载体差异的不同)

评分标准:满分10分

  1. flag(2分)    成功执行hack功能,给出外挂执行成功的flag。

  2. 代码(3分)    与hack.exe外挂功能相同,但实现原理与hack.exe不同的程序源码,仅需要提供可编译的工程完整代码,不需要提供已经编译出来的bin文件。

  3. 文档(4分)    详细描述解题过程,如涉及编写程序,必须提供源代码。

  4. 时间(1分)    正确提交flag、代码、文档的顺序,第1名计1分,后每1名-0.05分。

很明显,今年是写挂了。本fw通了两个宵只能很勉强的做出几个简单的功能。羡慕带哥直接dump SDK两小时生成带几十个功能的盖。(师傅们tql

hack.exe

加载程序进IDA,main函数开头解密字符串,试图打开hack.dat文件,因为dat文件不存在,所以hack.exe退出


我随便创了一个文件然后往里面写了一些东西,然后hack.exe就可以往下运行读取其中的内容然后进decode解密,decode函数里面是SSE优化后的解密算法,其中有两个分支,若长度大于0x40会走SSE优化的算法,若小于则走下面的分支,但本质的解密算法是一样的。具体算法后面给出分析


这一部分是计算shellcode的长度,shellcode会用于dll的加载


再下面v9就是decode函数对hack.dat解密出来的内容,通过取值取出ProcName,结合上下文可以知道这个ProcName就是游戏的进程名,在下面的 CreateToolhelp32Snapshot + Process32First 进程枚举中搜索游戏进程

再往下走下面两个循环分别是解密出flag和check flag


如果check成功则解密出 flag:%s 字符串并调用printf函数输出flag


下面会解密出一个dll并申请空间用于后续的注入


起动调程序,通过setIP手动的让程序运行decode函数解密DLL,然后通过idc脚本对其dump确定是一个dll文件,附dump.idc




利用注入器将DLL注入到游戏中,弹出提示,测试发现带有右键自瞄的外挂功能


回过头来继续看hack.exe。后面一大段都是解密出各种函数(这里就不一一截图了)


最后将dll,shellcode写入到游戏进程空间并起远线程调用shellcode加载dll


可以看到外挂成功启动并输出flag


Flag: 2RSRhrofoWtLeLrJCSlTireznrtx.oeLxuehyyAwbpCOZq0tsS7MZyVdOUoE8

DumpFile.dll

直接看这个dll发现很乱,来回看了一下发现是封装了一个hook引擎进去。外挂注入后可以实现右键自瞄的功能,同时只有敌人离自己在一定范围内才会触发自瞄。因为是按键自瞄,直接想到GetAsyncKeyState函数。IDA看dll的导入表果然看到交叉引用,只有sub_180005050一个函数调用过该函数,确定此处为作弊功能


发现浮点数写操作,0x398很像是一个偏移,附加上去跟了一下



动调跟了发现这两个值分别是角色的上下摇摆角和左右偏移角。向上回溯寻找v16的来源定位到这个地方


获得计算公式,发现此处的基址是出于作弊模块空间的,回到初始化函数找到原基址,输入CE


以此为入手点,从头看这个作弊函数。这个大循环就是自瞄了


GetAimTarget函数会尝试匹配符合条件的自瞄目标,匹配成功则返回目标对象,否则返回-1,其也是通过枚举角色结构列表来实现的


然后会获取每个角色的名字进行匹配


会在CampName函数中对名字进行字符串匹配


下面是距离计算逻辑


通过屏幕中心点与敌人的屏幕坐标 距离 来匹配距离准星 最近的敌人,若能匹配到,敌人对象就会通过v3返回。至此GetAimTarget函数分析完毕。


通过GetAimTarget取到的敌人对象,则通过内存对其取坐标,易分析得0x164,0x168,0x16C分别为对象的X,Y,Z坐标

最后会对坐标做角度变换和归一化处理,最终计算得到上下摇摆角和左右偏移角填入游戏数据


至此外挂功能函数分析完毕

外挂攻击的数据(实现自瞄的方式)



外挂实现

写了两个外挂,编译环境均为  visual studio 2019 x64 release

Cheat1

纯外部跨进程的通过修改镜头角度的实现右键自瞄



Cheat2

思路:因为要实现自瞄,而镜头又不知道还有什么别的攻击方式,因此换了一个思路,把子弹出发的坐标改到敌人的坐标上,这样可以开枪直接就可以打死敌人 并且可以无视任何建筑物。我从子弹数量入手,找到游戏开枪的地方,开枪的地方一定会有一个子弹开始坐标,我们先用CE搜索子弹数量,并对其下访问断点


定位到了子弹数量减少处。因为要实现修改子弹发射点到敌人坐标处,我们需要找到子弹发射的地方,因此这里向上回溯

回溯了一层发现大量的call,我们在头部下断,粗粗看了一下这些call,发现在子弹减少call的上一个call里调用了rand函数。


因为弹道是具有随机性的, rand函数引起了我的注意,然后想起第一天在百度上搜到的关于这款游戏的开发文档的源码


上下看了一下发现其他部分也很像,认为这个call就是武器开火函数



从call的头部下断 然后在游戏中开枪 再往下可以看到调用了函数取了一个坐标,我不知道这个坐标具体是个什么坐标 但是肯定是跟弹道有关的坐标


我通过在此处下断点,面对墙壁开枪,并修改了这些值,发现墙壁上没有出现弹孔,认为这些值就是控制子弹的起始坐标,而下面这个call就是碰撞call。如果能修改这个参数为敌人的坐标,应该就可以实现子弹全图自瞄。 我采用了外部注入shellcode hook此处,跳转到写入的自瞄shellcode上,完成了参数的修改。经测试,确实可以达到开枪后子弹能直接打中敌人并且无视建筑物的效果。 同时,在我添加bot后发现bot开枪也是经过的这个函数 所以我们hook这个函数 不仅可以让bot的子弹打不中我们 我们还可以打死这些bot (同时实现了无敌跟子弹穿墙追踪的效果)

下面贴一下shellcode


待外挂启动后,会先将shellcode注入游戏空间,并跨进程的不断枚举游戏对象列表,发现存活的敌人便将其坐标写入自瞄坐标内存上,shellcode会在每次开枪的时候将自瞄坐标内存上的值替换到碰撞call的参数上,以此就可以实现站着不动开枪杀死全图敌人且无敌的效果。



至此,外挂实现完毕


原文地址:https://www.52pojie.cn/thread-1415867-1-1.html


此活动来自腾讯游戏安全部门联合吾爱破解论坛举办的【2021游戏安全技术竞赛】,参加比赛实习绿色通道+丰厚奖金等着你,活动详情:https://www.52pojie.cn/thread-1396337-1-1.html,印证那句话未知攻焉知防,只有了解攻击才能更好做好防御,防外挂的思路可以源于做如何外挂。

2021腾讯游戏安全技术复赛pc客户端安全wp的评论 (共 条)

分享到微博请遵守国家法律