关于绝地求生某辅助白名单画中画逆向分析<二>

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

猜测该外挂用的是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的逻辑

重大发现吧 那个HOOK是我自己标注的,那个Hook就是steam自己写的hook 方法
跟进去之后你会看到 还有调试信息输出。一步一步仔细分析你会发现会走到我们尚一章讲到的画中画单步到的steam函数里
仔细分析在这个过程中走过的每一个函数
你会发现有一个函数是读取一个地址处的数据再分发数据然后就进行显示了。

就是这个switch 负责共享内存中的数据解析的。现在搞清楚是哪个内存地址存放传过来的数据了,好那就找来源。。
memmove(a2, (const void )((_QWORD *)(v6 + 0x150) + v8), v10);

高亮的代码处指向一个+150偏移处的指针,我们来找这个地址的初始化画函数

这个地址找到了,
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)//恢复对齐状态
这个是他图片显示的共享内存结构体,采用的是环形存放格式
共享内存写入逻辑我已经逆向处源码了

int write_mem_data(char * data ,int datalen)
{
int copyedlen = datalen;
BYTE unknow =NULL;//标识mx是否成功的 1标识失败 0标识成功
while (1)
{
if(unknow)
{
goto LABEL_10;
}
//DWORD * MemHasUsed=(DWORD *)((ULONG_PTR)g_p_ShareMem +0xc);
if (g_mem_maxSize - g_p_ShareMem->Mem_data_Unprocessed_count < datalen)
{
break;
}
LABEL_8:
if(!unknow && WaitForSingleObject(g_h_Mutex,-1)!=0)
{
MessageBoxA(NULL,FUNCTION,”148”,MB_OK);
return 0;
}
LABEL_10:
if (g_p_ShareMem->Mem_data_tail_off > g_mem_maxSize)
{
ReleaseMutex(g_h_Mutex);
return 0;
}
if (g_mem_maxSize - g_p_ShareMem->Mem_data_Unprocessed_count >= datalen)
{
char * data_mem = &(g_p_ShareMem->data[g_p_ShareMem->Mem_data_tail_off]);
if (g_p_ShareMem->Mem_data_tail_off+datalen <= g_mem_maxSize)
{
memcpy(data_mem,data,datalen);
g_p_ShareMem->Mem_data_tail_off += datalen;
}else
{

            int copyed_size = g_mem_maxSize - g_p_ShareMem->Mem_data_tail_off;memcpy(data_mem,data,copyed_size);memcpy(g_p_ShareMem->data,data+copyed_size,datalen - copyed_size);g_p_ShareMem->Mem_data_tail_off = datalen-copyed_size;copyedlen = datalen;}if (!unknow){g_p_ShareMem->Mem_data_Unprocessed_count += copyedlen;SetEvent(g_h_Event_Written);ReleaseMutex(g_h_Mutex);}return copyedlen;}if (unknow){//空间不足return 0;}ReleaseMutex(g_h_Mutex);
}
while(WaitForSingleObject(g_h_Event_Avail,g_maxTime)!=0)
{if (g_mem_maxSize - *(DWORD *)((ULONG_PTR)g_p_ShareMem +0xc) >= datalen ){goto LABEL_8;}
}
//等待超时
return 0;

}
int put_data_(char * data ,int datalen)
{
int ret = 0;
if (datalen >0 && datalen<= g_mem_maxSize )
{
LABEL_12:
ret += write_mem_data(data,datalen);
}
else
{
while(1)
{
int v7 = write_mem_data(&(data[ret]),g_mem_maxSize);
ret += v7;
if (v7!= g_mem_maxSize)
{
break;
}
if (datalen - ret <= g_mem_maxSize)
{
goto LABEL_12;
}
}

}
return ret;

}
到这里还不能使用,共享内存的格式逆向完毕了,但是内容的格式还没研究,还不能使用该协议实现游戏内的画图写了这么久明天再写吧,

关于绝地求生游戏白名单画中画逆向分析相关推荐

  1. 关于绝地求生某辅助白名单画中画逆向分析

    关于绝地求生游戏白名单画中画逆向分析<一> 最近一款韩国的一款叫做绝地求生的游戏火了,几乎可以说是红遍了大部分的中国网吧.极富有创造力的中国外挂作者又发现了一块新大陆,什么路飞外挂,铁锅外 ...

  2. 绝地求生手游版显示服务器加载中,绝地求生游戏一直卡在游戏读取界面怎么办_绝地求生游戏开启卡在读取界面解决办法_游戏吧...

    绝地求生更新后,开启游戏或者开始新的一局卡在读取界面成了家常便饭.有的是卡在Initializing界面,有的是卡在大厅,画面只有背景图片没有人物.那么出现这种情况该怎么解决呢? 绝地求生游戏卡在读取 ...

  3. 绝地求生游戏总显示服务器崩溃,绝地求生总是游戏崩溃怎么办_绝地求生游戏崩溃解决办法_绝地求生_我爱秘籍...

    相信有很多网友在玩绝地求生时总是出现游戏崩溃的现象,但是又不知道该如何解决.下面小编为大家带来绝地求生游戏崩溃解决办法,希望对大家有所帮助. 内容来源:PUBG官博 绝地求生游戏崩溃解决办法 部分玩家 ...

  4. 绝地求生服务器未响应怎么办,绝地求生游戏崩溃解决方法 绝地求生崩溃怎么办...

    原标题:绝地求生游戏崩溃解决方法 绝地求生崩溃怎么办 A PLAYERUNKNOWN'S BATTLEGROUNDS process has crashen! We are very sorry th ...

  5. 无法启动游戏 因为计算机,绝地求生游戏无法启动怎么办 无法启动解决方法一览...

    绝地求生游戏无法启动怎么办 无法启动解决方法一览 2018-04-09 13:39:46来源:游戏下载编辑:评论(0) 绝地求生无法启动怎么办?很多玩家在启动游戏的时候遇到BE服务启动失败的问题.今天 ...

  6. 计算机管理中be启动不了,绝地求生BE服务启动失败解决方法 绝地求生游戏无法启动怎么办...

    绝地求生BE服务启动失败解决方法,绝地求生游戏无法启动怎么办?绝地求生BE服务启动失败怎么解决?想必不少友友都不太清楚吧?下面跟随小编冉冉一起去看看吧! 绝地求生BE服务启动失败怎么办 过一阵窗口消失 ...

  7. 绝地求生信号服务器崩溃,绝地求生游戏崩溃怎么办?更新显示servers are too busy解决方法...

    绝地求生4.19更新内容 绝地求生游戏崩溃怎么办?更新显示servers are too busy解决方法来看看绝地求生4.19更新到什么时候?更新提示Servers are too busy怎么办的 ...

  8. 计算机高特效吃鸡游戏主机配置单,绝地求生游戏电脑配置单介绍,游戏开最高画质都不带卡的!...

    原标题:绝地求生游戏电脑配置单介绍,游戏开最高画质都不带卡的! 想必大家对绝地求生游戏不陌生吧,目前市面上比较火的游戏就是绝地求生游戏,也就是我们常说的"吃鸡"游戏.很多人以为玩& ...

  9. 绝地求生游戏怎么转到计算机上玩,绝地求生大逃杀吃鸡游戏提示tslgame.exe 应用程序错误解决方法...

    众所周知,玩家口中所谓的"吃鸡"游戏就是绝地求生大逃杀,这款游戏虽然比较好玩,但是游戏优化比较差,此外游戏的应用程序会出现各种报错,最为常见的就是tslgame.exe 应用程序错 ...

最新文章

  1. LabVIEW图像灰度分析与变换(基础篇—4)
  2. 解密ATS 4.2.3的缓存状态密码
  3. 电信应在短时间内放弃CDMA网络
  4. grafana模板_EMQ X + InfluxDB + Grafana:物联网数据监控可视化方案
  5. hdu1561 树形dp
  6. PAI分布式机器学习平台编程模型演进之路
  7. 浅析如何在Nancy中生成API文档
  8. JAVA入门级教学之(标识符与关键字)
  9. 深入浅出教你做一个快速开发平台
  10. Spring-jdbc-JdbcTemplate
  11. c++ mfc程序 屏幕只显示部分内容_Visual C++ MFC 简明教程
  12. 大数据开发比赛echarts所有要学习的主要图表 简单化 得分点
  13. soliworks三维机柜布局(二)创建设备位置
  14. 20160218.CCPP体系详解(0028天)
  15. 关系数据库标准语言SQL——详解版2
  16. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第一篇)
  17. 什么是3G工程师,3G工程师知识储备
  18. C语言用数组实现十个国家名字按字典排序
  19. Vue实现web网页锁屏功能
  20. 计算机防火墙不能更改,电脑防火墙无法设置

热门文章

  1. Arduino音乐代码《卡农》(简易版)
  2. [戴爾*卡耐基]個人簡介
  3. UMAX软件服务平台——SoftTown软建堂
  4. 解决:Win11蓝牙鼠标经常断连问题(亲测有效)
  5. TL4050B25QDBZRQ1
  6. linux系统查看usb转串口驱动,Linux usb转串口驱动
  7. 全球及中国光通信箱体行业市场需求前景与发展规划分析报告2022-2028年
  8. 阿里云ECS用docker建Discuz!论坛和mediawiki
  9. 用c语言做自动售货机程序,C语言实现查询自动售货机中的商品价格【实例分享】...
  10. 2023养老展,中福协养老展,中国国际养老服务业博览会