8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现

内容参考于:易道云信息技术研究院VIP课

上一个内容:通过逆向分析确定游戏明文接收数据过程

码云地址(master 分支):https://gitee.com/dye_your_fingers/titan

码云版本号:bcf7559184863febdcad819e48aaacad9f25d633

代码下载地址,在 titan 目录下,文件名为:titan-模游戏底层功能对接类GameProc的实现.zip

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取码:q9n5

--来自百度网盘超级会员V4的分享

HOOK引擎,文件名为:黑兔sdk.zip

链接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取码:78h8

--来自百度网盘超级会员V4的分享

以 模拟游戏登陆器启动游戏并且完成注入 它的代码为基础进行修改

首先回忆一下connect的位置(0x10617010),来到下图位置打断点c0856cba44ea4578b650c39f891fc120.png

然后登陆游戏它就卡住了

39f7a5ef2be941ec9e3ba526d90c9b71.png

首先它是一个虚函数,也就是继承来的函数,带有继承的类的特点,下图红框位置应该是一个类中的数据

8ca54ae63e3a4c3dafc36fa64ce10f1e.png

但是虚函数的头部,也就是下图红框位置,它是一个内存地址,这个内存地址指向了一个表(这个表指是数组),这个表里是继承来的数据(函数)

a4233c1f02a14cc69a29866dd00eb9ca.png

来到0x1062F2FC(由于是小端序存储所以跟内存是反着的)位置,查看内存,可以看出全是内存地址,这些内存地址就全是函数

76fa67c84497430397a1f1955cef460c.png

看下图红框位置,偏移34位置正好是游戏要调用的函数地址

cd1c7e5cc7824aa28abefb5a90d12ba6.png

然后也就是说,我只要把这个虚函数表(简称虚表)的值改成我们的函数,它就可以跳转到我们的函数里,改成什么就跳什么,然后还有一个东西,先把这里的断点取消掉(确保所有断点全部取消),按ctrl+f9,然后按f8,来到上一层,下图红框位置经过使用条件断点,发现调用connect函数的类地址是它的返回值,但是它也是一个虚函数

2f0aa9b6487049a2b5cd972a0734de37.png

然后通过条件断点,断下来查看edx

e2cd115a4507481c8b6375ed82f546dd.png

然后发现edx的值在edx执行过程中被销毁了(也就是被更改了)

25d51ebef84b4baeb1e23a66471a774f.png

这种的如果想要分析它里面是什么(分析edx里的代码是什么),就要hook掉它,并且不断记录它的栈和调用的情况,然后通过返回值判断是否等于调用connect类的地址(我们想要的结果),当等于时,就能根据栈和调用情况得出有用的内存地址了,然后再去追

然后下图红框位置是调用connect函数的上一层,它是一个函数指针,下方的写法是函数指针的写法,所以它是会变的

22662264bc954b84b5dcdb287a2b8267.png

然后再来分析调用connect位置,也就是下图断点位置1b5b40361b0647eaa3ad4000a129843e.png

按f7进入函数

9c67fdcaf418461ebc6161170fd3f302.png

它的返回值是ret 8,所以它是俩四字节的参数,然后xor al, al,这个al寄存器是8比特也就是1字节,所以它的返回值是bool类型

ff4f600405d64d7d8081e1fa4838b3aa.png

然后x96dbg也给我们分析出了函数名

ad0155d008b14ddbac853c4ac3f6001f.png

所以还原的函数:bool GameWinSock::connect(char* ip, int port)

项目文件:删除无用文件

删除方式:右击选项移除

9c23189f15bd4dc094439e190044a20c.png

然后点删除:

6ba429a196e9415fa02d63cbb618ce23.png

现在的文件:

3f86d4c7d4ea40d39f004d0e88804bb1.png

新加GameProc.h文件:

#pragma once
#include <htdHook2.h>

// GameProc类 负责游戏功能与模块的对接,也就是HOOK、获取游戏数据这种操作
class GameProc
{
	htd::hook::htdHook2* hooker;
public:
	GameProc();// 初始化 hooker
	/*
		
	*/
	void LoadBase(); 
	void Init();// 初始化
	void InitInterface(); // 接口初始化
};

新加GameProc.cpp文件:

#include "pch.h"
#include "GameProc.h"

GameProc::GameProc()
{
	hooker = new htd::hook::htdHook2();
	Init();
	InitInterface();
}

void GameProc::LoadBase()
{

}

void GameProc::Init()
{
}

void GameProc::InitInterface()
{
	LoadBase();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值