内容参考于:易道云信息技术研究院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),来到下图位置打断点
然后登陆游戏它就卡住了
首先它是一个虚函数,也就是继承来的函数,带有继承的类的特点,下图红框位置应该是一个类中的数据
但是虚函数的头部,也就是下图红框位置,它是一个内存地址,这个内存地址指向了一个表(这个表指是数组),这个表里是继承来的数据(函数)
来到0x1062F2FC(由于是小端序存储所以跟内存是反着的)位置,查看内存,可以看出全是内存地址,这些内存地址就全是函数
看下图红框位置,偏移34位置正好是游戏要调用的函数地址
然后也就是说,我只要把这个虚函数表(简称虚表)的值改成我们的函数,它就可以跳转到我们的函数里,改成什么就跳什么,然后还有一个东西,先把这里的断点取消掉(确保所有断点全部取消),按ctrl+f9,然后按f8,来到上一层,下图红框位置经过使用条件断点,发现调用connect函数的类地址是它的返回值,但是它也是一个虚函数
然后通过条件断点,断下来查看edx
然后发现edx的值在edx执行过程中被销毁了(也就是被更改了)
这种的如果想要分析它里面是什么(分析edx里的代码是什么),就要hook掉它,并且不断记录它的栈和调用的情况,然后通过返回值判断是否等于调用connect类的地址(我们想要的结果),当等于时,就能根据栈和调用情况得出有用的内存地址了,然后再去追
然后下图红框位置是调用connect函数的上一层,它是一个函数指针,下方的写法是函数指针的写法,所以它是会变的
然后再来分析调用connect位置,也就是下图断点位置
按f7进入函数
它的返回值是ret 8,所以它是俩四字节的参数,然后xor al, al,这个al寄存器是8比特也就是1字节,所以它的返回值是bool类型
然后x96dbg也给我们分析出了函数名
所以还原的函数:bool GameWinSock::connect(char* ip, int port)
项目文件:删除无用文件
删除方式:右击选项移除
然后点删除:
现在的文件:
新加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();
}