57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

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

码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:51307d6bf69f2f3c645c70d09f841f5e32da79b9

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-接管游戏的自动药水设定功能.zip

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

提取码:q9n5

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

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

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

提取码:78h8

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

上一节内容:通过UI分析自动药水设定功能-CSDN博客

以 通过内核信息检测调试器-CSDN博客它的代码为基础进行修改

首先利用我们工具把自动药水设定功能代码放到壳里,如下图:c8c750这个地址必须在列表第一行,否侧会在点击按钮时闪退,原因是在GameEx.cpp文件里InitInterface函数里有hook,hook的顺序是跟之前列表顺序来的,之前的顺序就是c8c750在第一个,如果c8c750位置不在第一个,那原本c8c750函数的hook就会hook到自动药水设定函数里,然后由于地址代码的长度不同(现在hook的方式是写一个int3,然后把这一行的汇编代码保存起来,执行完我们的代码再让它执行原本的代码然后再跳回到int3的下一行,如果长度不一样汇编代码就乱了,然后就执行报错,效果就是会闪退),就会变成混乱的汇编代码​​​​​​​

GameEx.cpp文件的修改

#include "pch.h"
#include "GameEx.h"
#include "htdHook2.h"
#include "GameProtect.h"extern int client;
extern GameProtect* _protect;
extern unsigned _stdcall GetFunctionAddress(int index);
htd::hook::htdHook2 hooker;#include <windows.h>
#include<stdio.h>
#include<TlHelp32.h>/**声明要拦截的函数地址
*/
auto h = GetModuleHandle(NULL);
DWORD address = (DWORD)h;
DWORD addRExit = address + 0x88C77E;size_t 被拦截修改的函数的地址 = (size_t)addRExit;LONG NTAPI 异常回调(struct _EXCEPTION_POINTERS* Excep)
{printf("异常回调1\n");/**判断出异常的地方是否为 我们修改的地方*/if ((size_t)Excep->ExceptionRecord->ExceptionAddress == 被拦截修改的函数的地址) {//const char* szStr = "nei Rong Bei Xiu Gai";//*(DWORD*)(Excep->ContextRecord->Esp + 0x8) = (DWORD)szStr;//szStr = "biao Ti Bei Xiu Gai";//*(DWORD*)(Excep->ContextRecord->Esp + 0xC) = (DWORD)szStr;AfxMessageBox(L"游戏退出!");DWORD* _esp = (DWORD*)Excep->ContextRecord->Esp;DWORD _val = _esp[1];if (_val == 0x1035D0C) {AfxMessageBox(L"游戏退出2!");auto hMuls = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, L"system_seamp");if (hMuls) ReleaseSemaphore(hMuls, 1, 0);ExitProcess(0);}Excep->ContextRecord->Eip = *(DWORD *) Excep->ContextRecord->Esp;Excep->ContextRecord->Esp += 8;return EXCEPTION_CONTINUE_EXECUTION;}else {/**防止被其它地方修改了函数地址*/Excep->ContextRecord->Dr0 = 被拦截修改的函数的地址;Excep->ContextRecord->Dr7 = 0x405;return EXCEPTION_CONTINUE_SEARCH;}}VOID 设置线程的dr寄存器(HANDLE 线程句柄) {printf("设置线程的dr寄存器1\n");CONTEXT ctx;ctx.ContextFlags = CONTEXT_ALL;GetThreadContext(线程句柄, &ctx);ctx.Dr0 = 被拦截修改的函数的地址;ctx.Dr7 = 0x1;SetThreadContext(线程句柄, &ctx);printf("设置线程的dr寄存器2\n");
}VOID 使用dr寄存器拦截修改函数() {printf("使用dr寄存器拦截修改函数1\n");HANDLE 线程快照句柄 = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, GetCurrentProcessId());if (线程快照句柄 == INVALID_HANDLE_VALUE) {printf("线程快照创建失败");return;}THREADENTRY32* 线程结构体 = new THREADENTRY32;线程结构体->dwSize = sizeof(THREADENTRY32);/**Thread32First获取快照中第一个线程返回值bool类型*/// Thread32First(线程快照句柄, &线程结构体);HANDLE 线程句柄 = NULL;printf("使用dr寄存器拦截修改函数2\n");/**Thread32Next获取线程快照中下一个线程*/while (Thread32Next(线程快照句柄, 线程结构体)){if (线程结构体->th32OwnerProcessID == GetCurrentProcessId()) {printf("使用dr寄存器拦截修改函数3\n");线程句柄 = OpenThread(THREAD_ALL_ACCESS, FALSE, 线程结构体->th32ThreadID);printf("使用dr寄存器拦截修改函数4\n");设置线程的dr寄存器(线程句柄);printf("使用dr寄存器拦截修改函数5\n");CloseHandle(线程句柄);}}
}bool AutoHelper(HOOKREFS2) {bool vip = false;if (vip)return false;else return true;
}bool ExitGame(HOOKREFS2) {// if (_protect->CheckDebugByNT())AfxMessageBox(L"检测到了DEBUG程序的存在");// AfxMessageBox(L"游戏退出2222!");DWORD* _esp = (DWORD*)_ESP;DWORD _val = _esp[1];if (_val == 0x1035D0C) {// AfxMessageBox(L"游戏退出!");auto hMuls = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, L"system_seamp");if (hMuls) ReleaseSemaphore(hMuls, 1, 0);client--;ExitProcess(0);}return true;
}GameEx::GameEx()
{// AfxMessageBox(L"注册hook!");// auto h = GetModuleHandle(NULL);// DWORD address = (DWORD)h;// DWORD* addRExit = (DWORD*)(address + 0x88C77E);/**addRExit = 0;*/// CString txt;// txt.Format(L"addRExit[0]D:%d,addRExit[0]X:%X,addRExit:%X", addRExit[0], addRExit[0], addRExit);// AfxMessageBox(txt);// hooker.SetHook((LPVOID)addRExit, 3, ExitGame);//AddVectoredExceptionHandler(1, 异常回调);//设置线程的dr寄存器(GetCurrentThread());
}void GameEx::InitInterface()
{unsigned addr_cps =  GetFunctionAddress(0);hooker.SetHook((LPVOID)(addr_cps + 0x30 - 2), 0x3, ExitGame);hooker.SetHook((LPVOID)(addr_cps + 0x51 - 2), 0x3, ExitGame);unsigned addr_autohelper = GetFunctionAddress(1);hooker.SetHook((LPVOID)(addr_autohelper), 0x03, AutoHelper, (LPVOID)(addr_autohelper + 0x90));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314322.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PiflowX组件-ReadFromUpsertKafka

ReadFromUpsertKafka组件 组件说明 upsert方式从Kafka topic中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HO…

2023-12-11 LeetCode每日一题(最小体力消耗路径)

2023-12-11每日一题 一、题目编号 1631. 最小体力消耗路径二、题目链接 点击跳转到题目位置 三、题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格…

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

JAR文件如何在没有安装JDK的电脑上运行(指定运行环境)

一、JAR包是什么&#xff1f; 首先&#xff0c;我们来了解一下JAR&#xff08;Java Archive&#xff09;包。JAR包是一种文件格式&#xff0c;用于将Java类、资源和元数据打包到一个文件中。它通常用于将Java库、应用程序或模块分发给其他开发人员或部署到不同的环境中。JAR包可…

使用flutter开发一个简单的轮播图带指示器的组件

使用PageView开发一个带指示器的轮播图组件&#xff0c;当轮播图切换的时候&#xff0c;指示器也会跟着切换&#xff0c;切换到当前轮播图所在的索引时&#xff0c;指示器的背景色会变成蓝色&#xff0c;否则是灰色。使用了一个curIndex变量来记录当前激活的轮播图索引。并使用…

高通平台开发系列讲解(驱动篇)如何修改UART节点名字

平台内核版本高通平台Linux4.14文章目录 一、背景二、分析过程三、解决方案一、背景 /dev/ttyMSM1强行改成/dev/ttyMSM2 以适配应用: 二、分析过程 解决思路:Uart对应的驱动源码位于kernel/msm-4.9/drivers/tty/serial/msm_serial.c,在msm_serial_probe函数的最后通过uart…

Go语言实战:如何使用Timeout Context优雅地取消任务

Go语言实战&#xff1a;如何使用Timeout Context优雅地取消任务 引言Go语言和并发编程简介什么是ContextTimeout Context的原理实战演示最佳实践和注意事项总结 引言 在现代软件开发中&#xff0c;尤其是在处理高并发系统时&#xff0c;正确地管理和取消正在进行的任务成为一项…

iToF人脸识别

iToF(间接飞行时间)是一种测量光飞行时间的技术,主要应用于人脸识别。 iToF人脸识别技术在哪些场景下会用到 iToF人脸识别技术可以应用于许多场景,以下是一些常见的应用场景: 平安城市:在城市监控系统中,iToF人脸识别技术可以用于实时监控、目标检测和识别,以及异常行为…

UDP协议基本原理

前言 本文主要讲解传输层中的UDP协议&#xff0c;我准备从UDP的特点出发&#xff0c;深入理解UDP协议&#xff0c;从UDP协议的结构推出UDP协议的特点&#xff1b; 一、理解端口号 前面我们总是说用IP加端口号的方式定位全网的唯一进程&#xff0c;通常在TCP/IP中&#xff0c;我…

系统学习Python——装饰器:函数装饰器-[对方法进行装饰:基础知识]

分类目录&#xff1a;《系统学习Python》总目录 我们在前面的文章中编写了第一个基于类的tracer函数装饰器的时候&#xff0c;我们简单地假设它也应该适用于任何方法一一一被装饰的方法应该同样地工作&#xff0c;并且自带的self实例参数应该直接包含在*args的前面。但这一假设…

在多Module项目中,给IDEA底部选项卡区域添加Services选项卡

一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时&#xff0c;如果要调试测需要依次启动各个项目比较麻烦。 idea其实提供了各module的启动管理工具了&#xff0c;可以快速启动和关闭各个服务&#xff0c;也能批量操作&#xff0c;比如一次…

简单FTP客户端软件开发——VMware安装Linux虚拟机(命令行版)

VMware安装包和Linux系统镜像&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1UwF4DT8hNXp_cV0NpSfTww?pwdxnoh 提取码&#xff1a;xnoh 这个学期做计网课程设计【简单FTP客户端软件开发】需要在Linux上配置 ftp服务器&#xff0c;故此用VMware安装了Linux虚拟机&…