void DrawLine(Vec2& start, Vec2& end){glLineWidth(1.2);glBegin(GL_LINES);glColor4f(255, 255, 255, 100);glVertex2f(start.x, start.y);glVertex2f(end.x, end.y);glEnd();}写一个init函数,实现初始化void init_address(const char*process_name){std::cout << "请先启动游戏"<< std::endl;DWORD process_id = get_process_id(process_name);HANDLE process_handle = get_process_handle(process_id);g_process_id = process_id; //将pid保存到全局变量g_process_handle = process_handle;//将process_handle保存到全局变量//获取模块信息get_moduel_info(process_id, "engine.dll", engine_module);get_moduel_info(process_id, "client.dll", client_module);get_moduel_info(process_id, "server.dll", server_module);UINT_PTR temp_address;float Matrix[16];UINT_PTR matrix_address = client_module.module_address + dwViewMatrix; //获取视角矩阵地址g_matrix_address = matrix_address; //将视角矩阵地址保存到全局变量//获取人物视角地址ReadProcessMemory(g_process_handle, (LPVOID)(engine_module.module_address + 0x58CFDC), &temp_address, 4, NULL);//[engine.dll + 58CFDC]+00004D90g_angle_address = temp_address + dwClientState_ViewAngles;//获取本地人物地址 [client.dll+0xDC04CC]+100 = 生命值ReadProcessMemory(g_process_handle, (LPVOID)(client_module.module_address + dwLocalPlayer), &temp_address, 4, NULL);g_local_player = temp_address; //[g_local_player+100] = 生命值//获得ENtitylist地址[client.dll+0x4DDC90C + i *0x10]+100 = 敌人生命值g_player_list_address = client_module.module_address + dwEntityList;}先说一下整体的思路:
通过进程名(csgo.exe)获取进程ID
↓
通过进程ID获取进程句柄、client.dll模块的信息
↓
通过进程句柄读取人物视角矩阵地址、本地人物对象地址、敌人对象地址 并保存到全局变量(初始化完成)
↓
获得屏幕大小储存在全局变量、创建透明窗口
↓
循环遍历敌人对象,通过地址读取到人物的视角矩阵、敌人的位置
↓
在循环中将敌人的位置结合矩阵,转换成2D坐标
↓
再循环中在透明窗口上把算出来的坐标画出来
再写一段伪代码出来帮助理解,代码贴在后面
int main{获取视角矩阵地址、获取本地人物地址、获取敌人对象地址获取屏幕分辨率根据屏幕分辨率创建窗口while(1)消息循环{清除画的线获得视角矩阵,因为会变,所以需要不停的获取for(int i=0;i<64;i++)因为游戏人数最大为64{获得自己的阵营获取当前敌人对象根据对象获取人物血量、阵营、生存状态、敌人是否有效如果敌人血量<=0 或者 敌人阵营=自己阵营 或者 无效 或者 敌人对象为空 或者 敌人生存状态则遍历下一个对象获得敌人的位置将敌人的坐标转换为2D坐标画线}}}代码部分GetImformation.h
#pragma oncestruct Vec2{public:float x, y;};struct Vec3{public:float x, y, z;};bool is_error();void error(const char*text);class module_information{public:HANDLE module_handle;char module_name[1024];char *module_data;UINT_PTR module_address;int module_size;void alloc(int size){module_size = size;module_data = https://www.huyubaike.com/biancheng/(char *)VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);if (is_error())error("申请内存失败");}void release(){if (module_data)VirtualFree(module_data, 0, MEM_RELEASE);module_data = https://www.huyubaike.com/biancheng/nullptr;}};void init_address(const char*process_name);DWORD get_process_id(const char*process_name);HANDLE get_process_handle(DWORD process_id);void ConvertToRange(Vec2 &Point);bool WorldToScreen(const Vec3& VecOrgin, Vec2& VecScreen, float* Matrix);void get_moduel_info(DWORD process_id, const char *name, OUT module_information&info);DWORD read_memory(HANDLE process, DWORD address, void *recv, int size);template
经验总结扩展阅读
- 适合隔夜带饭的菜谱
- 雨伞放行李箱托运会被开箱吗
- 台湾的美称
- 夏天乳鸽煲汤用什么材料
- 连州特产有哪些
- 华县大地震是哪一年
- 芋圆材料
- 中药可以托运吗
- 2023年10月13日出货行吗 2023年10月13日出货黄道吉日
- 脱光是什么意思?