【C++】从零开始的CS:GO逆向分析3——写出一个透视本篇内容包括:
1. 透视实现的方法介绍
2. 通过进程名获取进程id和进程句柄
3. 通过进程id获取进程中的模块信息(模块大小,模块地址,模块句柄)
4. 读取游戏内存(人物ViewMatrix,敌人坐标,敌人生命值,敌人阵营)
【【C++】从零开始的CS:GO逆向分析3——写出一个透视】5. 三维坐标转二维坐标(游戏内人物坐标转换成屏幕上的坐标)
6. glfw+imgui 在屏幕上的绘制直线
请先依据前两篇,对偏移、基址有基本了解,并且配置好了glfw+imgui的环境,在上篇创建好的工程中创建CPP文件和同名.h文件
![【C++】从零开始的CS:GO逆向分析3——写出一个透视](http://shimg.jingyanzongjie.com/230725/20332UE8-0.png)
文章插图
实现效果:
![【C++】从零开始的CS:GO逆向分析3——写出一个透视](https://www.huyubaike.com//bbsmax.ikafan.com/static/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8xOTk2MzU3LzIwMjIxMC8xOTk2MzU3LTIwMjIxMDEyMjIwMjQ3NzM0LTE1NTAxMTM2NDEucG5n.jpg)
文章插图
透视实现的方法介绍一般有两种方式,一种是外挂,一种是内挂,外挂是在创建一个透明窗口,在透明窗口上画线,让鼠标事件透过窗口,透明窗口覆盖在游戏窗口上 。内挂是通过DLL注入,HOOK游戏中的绘制函数,在游戏绘制人物的时候绘制自己的线 。还剩一种比较少用,但也可以实现,找到人物模型ID,在渲染到人物模型的时候关掉渲染缓冲(应该是叫这个?),使人物模型在墙模型前面渲染,导致可以直接看到人物 。本篇文章采用的是外挂的形式,根据上篇文章已经可以创建出一个覆盖在屏幕上的透明窗口 。
先把需要用到的全局变量声明一下(GetImformation.cpp)变量名起的挺明白的,就不写注释了
DWORD g_process_id = NULL;HANDLE g_process_handle = NULL;UINT_PTR g_local_player = NULL;UINT_PTR g_player_list_address = NULL;UINT_PTR g_matrix_address = NULL;UINT_PTR g_angle_address = NULL;HWND g_game_hwnd = NULL;module_information engine_module;module_information client_module;module_information server_module;float g_client_width;float g_client_height;把需要用到的偏移也声明一下#define dwViewMatrix 0x4DCF254#define dwLocalPlayer 0xDC14CC#define dwClientState 0x58CFDC#define dwEntityList 0x4DDD93C#define dwClientState_ViewAngles 0x4D90#define m_vecOrigin 0x138#define m_bDormant 0xED#define m_lifeState 0x25F#define m_iHealth 0x100#define m_iTeamNum 0xF4再把需要使用到的函数先声明和实现(GetImformation.cpp),实现思路写在后面获取屏幕大小,保存到全局变量void GetWindowSize(){HDC hdc = GetDC(nullptr);g_client_width = GetDeviceCaps(hdc, DESKTOPHORZRES);g_client_height = GetDeviceCaps(hdc, DESKTOPVERTRES);ReleaseDC(nullptr, hdc);}先写一个错误获取函数,以方便获取出错的信息void error(const char*text){MessageBoxA(nullptr, text, nullptr, MB_OK);exit(-1);}bool is_error(){return GetLastError() != 0;}通过进程名获取进程id和进程句柄使用CreateToolhelp32Snapshot函数,创建进程快照,遍历系统快照中的进程名,遍历到process_name,则返回该进程的进程ID
DWORD get_process_id(const char*process_name){HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (is_error()) error("CreateToolhelp32Snapshot失败");PROCESSENTRY32 process_info;ZeroMemory(&process_info, sizeof(process_info));process_info.dwSize = sizeof(process_info);char target[1024];ZeroMemory(target, 1024);strncpy_s(target, process_name, strlen(process_name));_strupr(target);bool state = Process32First(snap, &process_info);while (state){if (strncmp(_strupr(process_info.szExeFile), target, strlen(target)) == 0){return process_info.th32ProcessID;}state = Process32Next(snap, &process_info);}CloseHandle(snap);return 0;}通过进程ID获取进程句柄
HANDLE get_process_handle(DWORD process_id){HANDLE process_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_id);if (is_error())error("get_process_handle失败");return process_handle;}
经验总结扩展阅读
- 适合隔夜带饭的菜谱
- 雨伞放行李箱托运会被开箱吗
- 台湾的美称
- 夏天乳鸽煲汤用什么材料
- 连州特产有哪些
- 华县大地震是哪一年
- 芋圆材料
- 中药可以托运吗
- 2023年10月13日出货行吗 2023年10月13日出货黄道吉日
- 脱光是什么意思?