47.x86游戏实战-VEHHOOK封包函数

news2024/11/14 22:19:22

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:46.x86游戏实战-DXX封包实现进入地图房间

上一个内容实现了进入地图,它call了很多函数

如下图红框圈出来的都是固定的

然后它们的参数每次都要找就很麻烦,如下图,可以在函数头部下断点

然后如下图红框看,这样函数的第一个参数就是esp+4,第二个参数就是esp+4+4以此类推,接下里是采用Windows的异常链的机制来实现断点(详情看:【有道云笔记】VEH Hook异常Hook)使用Windows异常链实现的HOOK 微尘网络 给了封装好的代码(如果不嫌麻烦可以看【有道云笔记】VEH Hook异常Hook看明白之后自己实现一个,其实【有道云笔记】VEH Hook异常Hook里也实现了百分之80或90的功能了,为了不浪费时间跟课程节奏就要采用 微尘网络封装好的代码)

效果图:它就把函数的参数地址打印出来了(EIP寄存器是接下来要运行的代码的地址,也就是当前函数地址)

代码相关

首先添加两个按钮

它俩的属性

点击事件的处理函数代码

DXXDlg.cpp文件的内容

// DXXDlg.cpp: 实现文件
//

#include "pch.h"
#include "WCDXX.h"
#include "afxdialogex.h"
#include "DXXDlg.h"
#include "MyStrust.h"
#include "json.h"
#include "CLVEH.h"

// DXXDlg 对话框

IMPLEMENT_DYNAMIC(DXXDlg, CDialogEx)

DXXDlg::DXXDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_DIALOG1, pParent)
{
	OutputDebugStringA("执行流程-执行DXXDlg构造函数流程1");
}

DXXDlg::~DXXDlg()
{
	OutputDebugStringA("执行流程-执行DXXDlg析构函数流程1");
}

void DXXDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(DXXDlg, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &DXXDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &DXXDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &DXXDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &DXXDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, &DXXDlg::OnBnClickedButton5)
	ON_BN_CLICKED(IDC_BUTTON6, &DXXDlg::OnBnClickedButton6)
	ON_BN_CLICKED(IDC_BUTTON7, &DXXDlg::OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON8, &DXXDlg::OnBnClickedButton8)
END_MESSAGE_MAP()


// DXXDlg 消息处理程序


void DXXDlg::OnBnClickedButton1()
{
	MyStrust mystruct;
	mystruct.InitMy();
}


void DXXDlg::OnBnClickedButton2()
{

}


void DXXDlg::OnBnClickedButton3()
{
	
}


void DXXDlg::OnBnClickedButton4()
{
	MyStrust mystruct;
	mystruct.InitMy(); // 初始化玩家角色数据
	mystruct.ChangeBlooad(mystruct.My.Blood/2); // 修改血量
	
	// TODO: 在此添加控件通知处理程序代码
}


void DXXDlg::OnBnClickedButton5()
{
	MyStrust mystruct;
	mystruct.FindMaster();
}


void DXXDlg::OnBnClickedButton6()
{
	MyStrust mystruct;
	mystruct.AllKill();
}

// 断点的处理函数,ExceptionInfo里面有当前断点的寄存器的值
void fun(_EXCEPTION_POINTERS* ExceptionInfo) {
	call_loaA("wetool:EIP=%X,ECX=%X,参数=%X", ExceptionInfo->ContextRecord->Eip, ExceptionInfo->ContextRecord->Ecx, *(DWORD*)(ExceptionInfo->ContextRecord->Esp + 4));
}

// HOOK按钮的点击事件处理函数
void DXXDlg::OnBnClickedButton7()
{
	// 调用AddVeh添加要下断点的地址,地址不要写重了,写重了关闭断点的时候游戏会闪退
	CCLVEH::Instance()->AddVeh("n1", 0, 0, 0x01127D60, 1, 0, fun);
	CCLVEH::Instance()->AddVeh("n2", 0, 0, 0x01128550, 1, 0, fun);
	CCLVEH::Instance()->AddVeh("n3", 0, 0, 0x01128580, 1, 0, fun);
	// 下断点
	CCLVEH::Instance()->InitVeh();
}

// 卸载HOOK按钮的点击事件处理函数
void DXXDlg::OnBnClickedButton8()
{
	// 关闭断点
	CCLVEH::Instance()->ExitVeh();
}

CLVEH.h文件的内容

#pragma once
#include "afxmt.h"
#include <vector>
using namespace std;


#define VEHADMIN CCLVEH::Instance()

struct _VehData
{
	char VehName_[512];
	char MoudleName_[512];
	int   MoudleOffset_;
	DWORD VehHookAdress_;
	DWORD HookCodeLen_;
	BOOL  IsOnce_;
	int OldCode_;
	void(*Fun_)(struct _EXCEPTION_POINTERS * ExceptionInfo);
};


LONG NTAPI veh_optimization(struct _EXCEPTION_POINTERS * ExceptionInfo);


class CCLVEH
{
public:
	static CCLVEH* Instance();
	CCLVEH::~CCLVEH()
	{
		ExitVeh();
	}
public:
	vector<_VehData> VehList;
	CCriticalSection cs_;
	LPVOID m_Handle = 0;
public:
	void AddVeh(char * VehName, char *MoudleName, DWORD MoudleOffset, DWORD VehHookAdress, DWORD HookCodeLen_, int IsOnce, void(*Fun)(struct _EXCEPTION_POINTERS * ExceptionInfo));

public:
	void BreakAll();
	void BreakOne(DWORD CodeAdress);
	void InitVeh();
	void BreakRun(DWORD CodeAdress, _EXCEPTION_POINTERS * ExceptionInfo);
	void ExitVeh();
};

CLVEH.cpp

#include "pch.h"
#include "CLVEH.h"

#pragma  warning(disable:4996)
void VehWriteMemCode(DWORD Adress, DWORD ArgAdress, DWORD ArgLen)
{
	DWORD OldPro;
	VirtualProtect((LPVOID)Adress, ArgLen, PAGE_EXECUTE_READWRITE, &OldPro);

	_try{
		
		memcpy((void*)Adress, (void*)ArgAdress, ArgLen);
	}
	_except(1)
	{

	}

	VirtualProtect((LPVOID)Adress, ArgLen, OldPro, NULL);
}
LONG NTAPI veh_optimization(struct _EXCEPTION_POINTERS * ExceptionInfo)
{

	DWORD Addr = (DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress;
	if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
	{
		//Call_输出调试信息("BreakRun\n");
		CCLVEH::Instance()->BreakRun(Addr, ExceptionInfo);
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	else if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP)
	{
		//Call_输出调试信息("BreakOne\n");
		CCLVEH::Instance()->BreakOne(Addr);
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	return EXCEPTION_EXECUTE_HANDLER;
}


CCLVEH* CCLVEH::Instance()
{
	static CCLVEH instance;
	return &instance;
}



void CCLVEH::AddVeh(char * VehName, char *MoudleName, DWORD MoudleOffset, DWORD VehHookAdress, DWORD HookCodeLen_, int IsOnce, void(*Fun)(struct _EXCEPTION_POINTERS * ExceptionInfo))
{
	_VehData Data;

	strcpy(Data.VehName_, VehName);

	if (MoudleName != NULL)
		strcpy(Data.MoudleName_, MoudleName);
	else
		memset(Data.MoudleName_, 0, 512);

	Data.MoudleOffset_ = MoudleOffset;
	Data.VehHookAdress_ = VehHookAdress;
	Data.HookCodeLen_ = HookCodeLen_;
	Data.IsOnce_ = IsOnce;
	Data.Fun_ = Fun;
	VehList.push_back(Data);

}
void CCLVEH::BreakAll()
{
	cs_.Lock();
	vector<_VehData>::iterator It = VehList.begin();

	for (; It != VehList.end(); It++)
	{
		if (It->MoudleName_[0] != 0)
		{
			It->VehHookAdress_ = (DWORD)GetModuleHandleA(It->MoudleName_) + It->MoudleOffset_;
		}

		It->OldCode_ = *(BYTE*)It->VehHookAdress_;
		DWORD SetCodeData = 0xcc;
	
		VehWriteMemCode(It->VehHookAdress_, (DWORD)&SetCodeData, 1);

	}
	cs_.Unlock();
}
void CCLVEH::BreakOne(DWORD CodeAdress)
{
	cs_.Lock();
	vector<_VehData>::iterator It = VehList.begin();

	for (; It != VehList.end(); It++)
	{
	
		if (It->MoudleName_[0] != 0)
		{
			It->VehHookAdress_ = (DWORD)GetModuleHandleA(It->MoudleName_) + It->MoudleOffset_;
		}
		if (CodeAdress == It->VehHookAdress_ + It->HookCodeLen_)
		{
			DWORD SetCodeData = 0xcc;
			VehWriteMemCode(It->VehHookAdress_, (DWORD)&SetCodeData, 1);
			break;
		}


	}
	cs_.Unlock();
}

void CCLVEH::BreakRun(DWORD CodeAdress, _EXCEPTION_POINTERS * ExceptionInfo)
{
	cs_.Lock();
	vector<_VehData>::iterator It = VehList.begin();

	for (; It != VehList.end(); It++)
	{
		if (It->MoudleName_[0] != 0)
		{
			It->VehHookAdress_ = (DWORD)GetModuleHandleA(It->MoudleName_) + It->MoudleOffset_;
		}
		if (CodeAdress == It->VehHookAdress_)
		{
			VehWriteMemCode(It->VehHookAdress_, (DWORD)&It->OldCode_, 1);
		//	Call_输出调试信息("It->IsOnce_=%d\n", It->IsOnce_);
			if (It->IsOnce_ == 0)
			{
			//	Call_输出调试信息("IsOnce_\n");
				ExceptionInfo->ContextRecord->EFlags |= 0x100;
			}

			if (It->Fun_ != NULL)
			{
				It->Fun_(ExceptionInfo);
			}

			break;
		}
		

	}
	cs_.Unlock();
}
void CCLVEH::InitVeh()
{
	m_Handle = AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)veh_optimization);

	BreakAll();
}



void CCLVEH::ExitVeh()
{
	cs_.Lock();
	RemoveVectoredExceptionHandler(m_Handle);


	vector<_VehData>::iterator It = VehList.begin();

	for (; It != VehList.end(); It++)
	{
		if (It->MoudleName_[0] != 0)
		{
			It->VehHookAdress_ = (DWORD)GetModuleHandleA(It->MoudleName_) + It->MoudleOffset_;
		}

		VehWriteMemCode(It->VehHookAdress_, (DWORD)&It->OldCode_, 1);
	}
	
	cs_.Unlock();
}

上方的代码不全,只有手写的代码

完整代码:以 44.x86游戏实战-C++实现吸怪加秒杀 它的代码为基础进行修改

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5

提取码:q9n5

复制这段内容后打开百度网盘手机App,操作更方便哦


img

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Aiseesoft Mac Video Converter Ultimate:高效多能的视频转换与编辑工具

Aiseesoft Mac Video Converter Ultimate是一款视频转换与编辑软件&#xff0c;以其强大的功能和简单易用的操作界面赢得了广泛好评。该软件不仅支持多种视频格式的转换&#xff0c;还集成了丰富的视频编辑功能&#xff0c;满足了用户多样化的视频处理需求。 核心功能概述 视频…

mysqlcheck

mysql bin中的其他工具包 对于mysql的其他工具, 有很多选项是公共的, 例如你在对数据库进行检查的时候, 需要指定host和user以及其password来连接上mysqlserver来进行相关操作, 这个时候其实用到的host等东西跟我们之前的mysql-client其实是类似的 也就是说他们是作为mysql众…

顺序表的顺序表示—动态分配

顺序表的顺序表示—动态分配 代码实现 #include <stdio.h> #include <stdlib.h> #define InitSize 15 // 初始化扩容长度typedef struct{int *data; // 动态分配数组的指针int MaxSize;int length; // 当前长度 }SeqList;void InitList(SeqList &L){// 申请一…

C++不同数据类型连接成一个字符串

在C中数据连接的方式使用号进行连接。 1.都是字符型时直接使用连接几个字符串&#xff1b; 2.不是字符类型时&#xff0c;要用to_string函数转换后再连接。

做空股指期货一手多少钱?

股指期货的保证金比例是12%-15%不等&#xff0c;所以做空一手股指期货的保证金最少是要十几万元&#xff0c;部分平台两万。关于做空一手股指期货的具体金额&#xff0c;这并非固定不变&#xff0c;而是会根据市场的实时价格、合约的乘数以及交易所的规定等因素而有所变动。 股…

Verilog刷题笔记59

题目: Exams/m2014 q6c 解题&#xff1a; module top_module (input [6:1] y,input w,output Y2,output Y4);assign Y2y[1]&w0;assign Y4(y[2]&w1)|(y[3]&w1)|(y[5]&w1)|(y[6]&w1);endmodule结果正确: 注意点: 起初&#xff0c;我的代码有错误,代码如下…

快速判断一个项目是Spring MVC框架还是Spring Boot框架

1. 查看项目的启动类 Spring Boot: 通常有一个主类&#xff0c;包含 SpringBootApplication 注解&#xff0c;并且有一个 main 方法来启动应用程序。 SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Appli…

探索数据结构:图(三)之最短路径算法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 最短路径算法 最短路径问题可分为单源最短路径和多源最短路径。其指…

如何使用ssm实现珠宝首饰交易平台开发

TOC ssm101珠宝首饰交易平台开发jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于珠宝首饰交易平台所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、商品分类管理、商品信息管…

【Material-UI】Radio Group中的 Label Placement 属性详解

文章目录 一、Radio Group 组件概述1. 组件介绍2. Label Placement 属性的作用 二、Label Placement 属性的基本用法三、Label Placement 属性详解1. 标签位置的选择2. 如何在实际项目中选择标签位置 四、Label Placement 属性的实际应用场景1. 表单布局中的应用2. 符合用户习惯…

多进程多线程及之间通信机制

目录 前言 一、多进程与多线程 1. 多进程 多进程的特点 多进程的应用场景 2. 多线程 多线程的特点 多线程的应用场景 3. 多进程与多线程的对比 二、进程与线程之间的通信机制 1. 进程间通信&#xff08;IPC, Inter-Process Communication&#xff09; 2. 线程间通信…

Golang | Leetcode Golang题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; type pair struct {x, y int }func canMeasureWater(jug1Capacity int, jug2Capacity int, targetCapacity int) bool {//剪枝if jug1Capacityjug2Capacity < targetCapacity {return false}var (dfs func(x, y int) bool // jug1有x水…

NC包含min函数的栈

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 定义栈的数据…

基于STM32开发的智能水箱液位控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化液位监测与控制水泵控制与状态显示Wi-Fi通信与远程监控应用场景 家庭用水系统的液位控制工业水箱的液位管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能水箱液位控制系…

线程池详解(建议收藏)

概念 线程池&#xff08;Thread Pool&#xff09;是一种基于池化技术的多线程处理形式&#xff0c;用于管理线程的创建和生命周期&#xff0c;以及提供一个用于并行执行任务的线程队列。线程池的主要目的是减少在创建和销毁线程时所花费的开销和资源&#xff0c;提高程序性能&…

C# messagePack对类(class)序列化简单示例

c# messagepack对类&#xff08;class&#xff09;序列化的简单示例 0 引言1 示例2 纠错3 结语 0 引言 MessagePack是一种高效的二进制序列化格式&#xff0c;它可以在C#中用于序列化和反序列化对象。与其他序列化格式相比&#xff0c;如JSON和XML&#xff0c;MessagePack的编…

西安电子高速PCB学习(五)

感抗&#xff08;Inductive Reactance&#xff09;和容抗&#xff08;Capacitive Reactance&#xff09;是电感和电容在交流电路中对电流产生阻碍的特性。这两个概念源于交流电路中&#xff0c;电感和电容对交流电流的相应反应。 感抗&#xff08;Inductive Reactance&#xf…

如何使用ssm实现电脑配件销售系统的设计与实现

TOC ssm128电脑配件销售系统的设计与实现jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于电脑配件销售系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、商品分类管理、商…

PyTorch升级之旅——主要组成模块

本文仅作为个人学习记录使用 文章目录 前言 一、深度学习的简单流程 二、基本配置 三、数据读入 四、模型构建 五、模型初始化 六、损失函数 七、训练和评估 八、可视化 九、PyTorch优化器 总结 前言 学习链接&#xff1a;第三章&#xff1a;PyTorch的主要组成模块…

推荐几个缓解工作心情的VS Code插件

vs-cats 使用了这个插件&#xff0c;在写到"cat"/"Cat"单词时&#xff0c;可以在单词左边出现猫猫表情&#xff0c;而且在鼠标停靠在单词附近时还能显示猫猫图片 vscode-pets 使用这个插件可以在VS Code中养很多电子小动物&#xff0c;可以饲养的宠物有&a…