首页
社区
课程
招聘
[原创]关于绝地求生某辅助白名单画中画逆向分析 二
发表于: 2018-8-27 11:56 9680

[原创]关于绝地求生某辅助白名单画中画逆向分析 二

2018-8-27 11:56
9680

拖了好久,最近在忙着找工作,延误给大家分享心得的时间,好了废话不多讲步入正题。

猜测该外挂用的是steam协议了。那怎么来确定他是否用的是steam协议呢?
我仔细研究了steam相关的设置和反复的测试发现:steam有个设置

这个地址找到了,
CSharedMemStream has memory already locked for put. Don’t write with memory locked.
这个调试信息告诉我们。100%共享内存
现在查看共享内存名字吧!
直接给 F5代码吧!
__int64 __fastcall CSharedMemStream_1800B05E0(__int64 a1, const char *a2, unsigned int a3, int a4, unsigned int a5, char a6)
{
const char *v6; // rbp
__int64 v7; // rbx
unsigned int v8; // edi
unsigned int v9; // eax
char v10; // bp
_QWORD *v11; // rax
__int64 v12; // rax
__int64 v13; // r8
__int64 v14; // r9
const char *v15; // rcx
__int64 v16; // rax
unsigned __int8 (__fastcall ***v17)(_QWORD); // rax
unsigned int *v18; // rax
char v19; // cl
__int64 v20; // r9
char DstBuf; // [rsp+40h] [rbp-118h]
char v23; // [rsp+170h] [rbp+18h]

v6 = a2;
v7 = a1;
(_QWORD )a1 = &CSharedMemStream::`vftable’;
v8 = 512;
if ( a3 > 0x200 )
v8 = a3;
(_WORD )(a1 + 328) = 0;
(_QWORD )(a1 + 272) = 0i64;
(_QWORD )(a1 + 280) = 0i64;
(_QWORD )(a1 + 288) = 0i64;
(_QWORD )(a1 + 320) = 0i64;
(_DWORD )(a1 + 296) = v8;
(_DWORD )(a1 + 304) = a4;
(_BYTE )(a1 + 330) = 0;
(_BYTE )(a1 + 332) = 0;
if ( a5 )
{
v9 = v8;
if ( a5 < v8 )
v9 = a5;
}
else
{
v9 = 1;
if ( v8 / 0x19 > 1 )
v9 = v8 / 0x19;
}
(_DWORD )(a1 + 300) = v9;
(_QWORD )(a1 + 0x150) = malloc_1800BAAF0(v9);
(_QWORD )(v7 + 344) = 0i64;
strncpy((char *)(v7 + 8), v6, 0x100ui64);
sprintf_s_1(&DstBuf, 0x100ui64, “%s_mutex”, v7 + 8);
LOBYTE(a5) = 0;
v23 = 0;
v10 = a6;
v11 = mutex_180098A70(&DstBuf, 1u, &a5, a6);
(_QWORD )(v7 + 264) = v11;
if ( v11 )
{
if ( !(_BYTE)a5 )
((void (__fastcall *)(_QWORD *, signed __int64))*v11)(v11, 0xFFFFFFFFi64);
sprintf_s_1(&DstBuf, 0x100ui64, “%s_written”, v7 + 8);
v12 = event_180098910(&DstBuf, 0, 0, 0i64, v10);
(_QWORD )(v7 + 280) = v12;
if ( !v12 )
{
v15 = “Failed creating write event %s\n”;
LABEL_20:
sub_1800996F0((__int64)v15, (__int64)&DstBuf, v13, v14);
((void (__cdecl )(_QWORD))((_QWORD *)(v7 + 264) + 32i64))((_QWORD )(v7 + 264));
return v7;
}
sprintf_s_1(&DstBuf, 0x100ui64, “%s_avail”, v7 + 8);
v16 = event_180098910(&DstBuf, 0, 0, 0i64, v10);
(_QWORD )(v7 + 0x120) = v16;
if ( !v16 )
{
v15 = “Failed creating read event %s\n”;
goto LABEL_20;
}
sprintf_s_1(&DstBuf, 0x100ui64, “%s_mem”, v7 + 8);
v17 = (unsigned __int8 (__fastcall *)(_QWORD))create_map_180098BC0(&DstBuf, v8 + 16, 2, (bool *)&v23);
(_QWORD )(v7 + 272) = v17;
if ( !v17 )
{
v15 = “Failed creating file mapping %s\n”;
goto LABEL_20;
}
if ( !(**v17)(v17) )
{
v15 = “Failed creating view of file for %s\n”;
goto LABEL_20;
}
v18 = (unsigned int )((__int64 (__cdecl )(_QWORD))((_QWORD *)(v7 + 272) + 8i64))((_QWORD *)(v7 + 272));
(_QWORD )(v7 + 0x140) = v18;
v19 = v23;
(_BYTE )(v7 + 0x14A) = v23;
if ( v19 )
{
memset(v18, 0, v8 + 16i64);
(_DWORD )((_QWORD )(v7 + 0x140) + 8i64) = v8;
}
else
{
v20 = v18[2];
if ( (_DWORD)v20 == v8 )
{
(_DWORD )(v7 + 0x128) = v8;
}
else
{
sub_1800996F0(
(__int64)”Size on connection to existing CSharedMemStream doesn’t match actual: %s, %u, %u”,
(__int64)&DstBuf,
v8,
v20);
(_DWORD )(v7 + 0x128) = 0;
}
}
((void (__cdecl )(_QWORD))((_QWORD *)(v7 + 264) + 32i64))((_QWORD )(v7 + 264));
(_QWORD )(v7 + 0x138) = (_QWORD )(v7 + 320) + 16i64;
(_BYTE )(v7 + 0x148) = 1;
}
return v7;
}
可以看出他是用的event 做通信控制 共享内存做信息载体
具体怎么逆向这个共享内存的格式我就不细说了。主要是分析共享内存的结构体,

#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为4字节对齐
typedef struct strshareMem
{
DWORD Mem_data_Head_off;//有用数据头部偏移
DWORD Mem_data_tail_off;//有用数据尾部偏移
DWORD p3; //保留数据
DWORD Mem_data_Unprocessed_count;//未处理数据量
char data [0x1000000];
}mystrshareMem,*pmystrshareMem;
#pragma pack(pop)//恢复对齐状态
这个是他图片显示的共享内存结构体,采用的是环形存放格式
共享内存写入逻辑我已经逆向处源码了

拖了好久,最近在忙着找工作,延误给大家分享心得的时间,好了废话不多讲步入正题。

猜测该外挂用的是steam协议了。那怎么来确定他是否用的是steam协议呢?
我仔细研究了steam相关的设置和反复的测试发现:steam有个设置

去掉这个钩之后游戏中按下shift+tab 就不会显示那个steam信息了
经过验证去掉这个钩之后该透视辅助的透视功能失效了。到此为止该外挂的白名单画中画方法已经确定。
但steam是有着什么样的协议会被人利用呢?
接下来给大家具体分析实现原理
用IDA打开上次提到的那个模块(GameOverlayRenderer64.dll)
从dllmain开始分析貌似有点不科学,那怎么下手呢?
顺便教一下大家一些基本的逆向顺序,
在接到一个逆向任务的时候,不要直接就开始逆向,先搞清楚几个问题:我们逆向是要达到什么目的。逆向的是程序的哪个功能。逆向的这个功能在程序里用在什么方面。对这个功能的实现先大致猜测下会用到哪些api(方便下段调试)哪些字符串等等。总之,在具体实施逆向之前一定要先做一下初步的预估。第二步就是查壳,看下该程序用了什么壳,主要目的就是预估工作量。第三步,我的习惯是先放到IDA里先过一下,如果是加了壳,就dump内存看下,(看看导入表,看看字符串,看看导出表,看看main,看看区段)当然也可以根据自己的习惯来,上调试器 等都是可以的,总之怎么顺手怎么来具体方法太多了且每个人的习惯不同,我就不复述了。
开始分析了 我们分析这个模块的目的呢就是找协议借口。该协议是用在画中画方面的,该协议是基于进程间通信的。
ida分析需要一段时间,我们先来猜下他会用到写什么进程间通信协议呢?
具体有哪些进程间通信协议呢!!百度最清楚。。。
我们先从最简单也最常见的来“共享内存”,创建共享内存会用到哪些api呢!百度最清楚,我们看下该dll的导入表看看他用了哪些api,看看有没有共享内存相关的 

很幸运找到一个。
其他进程间通信的方法查找类似。如果你这方面的知识比较少,没找到。也有其他办法。
我们再想想我们还有个前面分析出来的点没用到。(d3d HOOK)就算不知道D3D用的是几但是也就那几模块吧,百度下hookDx的方法一堆,总能找到一些方法吧!如果还找不到。上次不是便利了下d3d画图循环么。从那个hook跳板开始找起。
IDA到这个时候应该是分析完了我们看下字符串,每次都会有很多奇迹,这次也不例外。 

看到这张图相信研究过dxhook的就清楚了吧这些都是dxhook用模块 好的我们看下游戏用的是dx几 貌似是dx10
好,我们来分析dx10的逻辑

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (27)
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
好像是直接可以用协议来绘图
2018-8-27 15:03
0
雪    币: 217
活跃值: (134)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
GameOverlayUI.exe更值得研究,东西也是从这里来的
2018-8-28 00:26
0
雪    币: 573
活跃值: (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以可以 感谢分享经验心得
2018-8-28 01:10
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
扫地sodi GameOverlayUI.exe更值得研究,东西也是从这里来的
其实核心是gameoverlayui.dll和vgui2_s.dll
2018-8-28 08:50
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我分享的东西不涉及这些
2018-8-28 10:43
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
更底层
2018-8-28 10:44
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
偏重底层协议
2018-8-28 10:45
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
后续会给出彻底的防治方法
2018-8-28 10:45
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
包括注入到UI的那种方法
2018-8-28 10:47
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
只针对steam协议,到时勿喷
2018-8-28 10:47
0
雪    币: 70
活跃值: (1332)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
hzqst 其实核心是gameoverlayui.dll和vgui2_s.dll
这几个dll load到自己进程中可以直接使用
2018-8-28 12:19
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
明天分享防治方法。。
2018-8-28 20:37
0
雪    币: 103
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我像说 这都是国外开源 而且被玩烂了的方法了 不是打击楼主 分析这么多 直接贴git连接更加省事 核心就是vgui2_s.dll 利用缓冲区达到绘制
而且协议 是国外大牛逆向好了 唯一缺点就是 用的不舒心 不如原生dx设备那种随心所欲 而且协议也是steam未公开 用来方便自己 还有给某些厂商自定义开发的
如果你会科学姿势 还能搜到 steam 最早给出的有 这些协议的文档
2018-8-29 15:23
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
你直接发呀!
2018-8-30 16:49
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
发来福利下大家。。
2018-8-30 16:50
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
starkin 我像说 这都是国外开源 而且被玩烂了的方法了 不是打击楼主 分析这么多 直接贴git连接更加省事 核心就是vgui2_s.dll 利用缓冲区达到绘制 而且协议 是国外大牛逆向好了 唯一缺点就是 用的 ...
我逆向出来是我的水平,别人逆向出来是别人的水平,我能逆向出来不代表别人就逆向不出来。
2018-8-30 16:54
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
18
你哪里看到我评价你的分享不好了?    
最后于 2018-8-30 21:42 被安于此生编辑 ,原因:
2018-8-30 16:57
0
雪    币: 3545
活跃值: (4679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
feikele 我逆向出来是我的水平,别人逆向出来是别人的水平,我能逆向出来不代表别人就逆向不出来。
你逆你的 无需管他们说什么
2018-8-30 17:58
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
安于此生 https://blog.his.cat/a/fuck_battleye.cat
好好看看我自分享的和他一样吗? 他是需要load 那俩dll 的 我的是直接协议的,朋友,你都没看完我写d,,我就想呵呵了
最后于 2018-8-30 19:06 被feikele编辑 ,原因:
2018-8-30 19:06
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
别和我哔哔什么国外的大牛,和我没关系,国外的大牛认识你么?
2018-8-30 19:08
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
国外大牛逆向出来你们对人家的代码看都没看出什么原理来!!steam用的那俩dll 都是第三方的,那老外只是调用了vgui的接口而已,并没有逆向什么进程间通信这些,我在给你们说实现原理,你们告诉我你用的是别人写好的而且还没看明白别人代码!你们对得起人家的分享么?
2018-8-30 19:16
1
雪    币: 3
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这个东西,我曾经也逆向过,历时一个月,全天逆向这个玩意儿。
我确定,网上的东西都是没法拿来用的(我都试过,最后我直接看Source这个游戏引擎有部分参考代码),
实际上这个东西你逆向完后会发现这个东西有缺陷的,部分协议stream没有实现(你没听错,比如画线和椭圆是空函数)
所以导致画图需要绕弯路,效果很差
==
楼主不用管别人,逆向你的
最后于 2018-8-30 19:57 被Aaaaaaaaq编辑 ,原因:
2018-8-30 19:56
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
24
Aaaaaaaaq 这个东西,我曾经也逆向过,历时一个月,全天逆向这个玩意儿。我确定,网上的东西都是没法拿来用的(我都试过,最后我直接看Source这个游戏引擎有部分参考代码),实际上这个东西你逆向完后会发现这个东西有缺 ...
那几个函数是被游戏和谐掉了
2018-8-31 13:51
0
雪    币: 223
活跃值: (94)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
Aaaaaaaaq 这个东西,我曾经也逆向过,历时一个月,全天逆向这个玩意儿。我确定,网上的东西都是没法拿来用的(我都试过,最后我直接看Source这个游戏引擎有部分参考代码),实际上这个东西你逆向完后会发现这个东西有缺 ...
游戏里的switch case 就没有分发椭圆的接口
2018-8-31 13:52
0
游客
登录 | 注册 方可回帖
返回
//