免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:21.x86游戏实战-实现注入器
在 18.x86游戏实战-找角色人物名字 里找到了名字,名字的地址是 [[0x1AB7CDC]+0x258],然后本次就要在我们的dll里读取出这个名字
OD附加之后脱离(不附加)的方式,右击然后点下图红框的选项
在读取之前,先看一下游戏中文字使用的是什么编码方式
有中文一般都是UNICODE编码,然后游戏是32位所以选择UNICODE(32字符)
选择之后名字就能显示出来了,如果UNICODE显示不正常那就尝试ASCII编码,如果都不正常那就说明这个数据不是一个文字或英文
然后名字的地址是 [[0x1AB7CDC]+0x258] 这个
接下来手动的找一次,来到0x1AB7CDC地址,0x1AB7CDC地址的值是一个内存地址
右击下图红框位置
然后选择数据窗口跟随
然后就能来到下图红框位置
然后这里有个东西,双击下图红框的列它会出现偏移(双击下图列中任意一行数据就能明白了)
然后 [[0x1AB7CDC]+0x258] 到了+0x258了,也就是655B7000+0x258,然后就来到了下图红框位置
然后0x655B7258内存地址的值还是内存地址,所以继续右击下图位置选择数据窗口中跟随
然后来到下图红框位置
然后选择UNICODE(32字符),就可以看到名字了
到这就手动解析 [[0x1AB7CDC]+0x258] 得到了名字,接下来就开始按照上方找名字的过程写c++代码了
代码:
首先给WCDXX窗口添加一个按钮
然后鼠标右击按钮,选择属性
在属性里改一下描述文字
然后双击下图红框的按钮
双完就会创建好按钮点击事件处理函数(按钮点击时执行的代码)了
然后打开Dbgview.exe
确保Dbgview.exe监视里选的内容与下图中的一样
然后注入
注入之后点击下图红框的按钮
然后就给打印出名字了
// DXXDlg.cpp: 实现文件
//
#include "pch.h"
#include "WCDXX.h"
#include "afxdialogex.h"
#include "DXXDlg.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)
END_MESSAGE_MAP()
// DXXDlg 消息处理程序
void DXXDlg::OnBnClickedButton1()
{
// [[0x1AB7CDC]+0x258]
/*
*这个符号表示地址,在c++中被称为指针或指针类型
int表示4字节数字
int*就表示指针类型的int
(int*)0x1AB7CDC;这样表示0x1AB7CDC地址里的内容是4字节的数字
*/
int* address = (int*)0x1AB7CDC;
/*
取出地址中的值,也就是取出0x1AB7CDC里的内容
*address这样在左边只写一个*表示取内存地址里的值
也就是取address它的值,address是0x1AB7CDC,也就是取0x1AB7CDC它的值
*/
int addressValue = *address;
addressValue += 0x258;
/*
(*(int*)addressValue)意思是
把addressValue转成int*,也就是把
addressValue的值当成内存地址,addressValue的值现在是[0x1AB7CDC]+0x258这个
现在这个地址里面的值是名字的地址,所以在左边加了一个*让把名字的地址去除了出来
取出来之后就得到了名字,名字是UNICODE类型,UNICODE又被称为宽字节,宽字节的数据是用两个字节描述一个文字或字母
在c++里wchar_t类型就是UNICODE
然后在c++中名字这种数据被称为字符串,如果要用字符串必须用指针类型也就是wchar_t*
右边加上*让wchar_t变成指针类型的wchar_t,才能在c++中使用字符串
*/
wchar_t* name = (wchar_t*)(*(int*)addressValue);
// 一般函数名后面是W就表示有UNICODE,也就是要用宽字节
OutputDebugStringW(name);
}
完整代码:以 21.x86游戏实战-实现注入器 它的代码为基础进行修改
链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5
提取码:q9n5
复制这段内容后打开百度网盘手机App,操作更方便哦