44.第二阶段x86游戏实战2-C++HOOK提取游戏lua
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:43.第二阶段x86游戏实战2-提取游戏里面的lua
上一个内容里通过对lua_dostring打断点看返回到什么位置,然后把返回到的位置全部标记了下来,然后通过对所有返回到的地址做断点,然后在游戏中点击按钮等操作,看看什么位置的断点没有被触发,没被触发的地址是我们要找到位置,通过这种方式最终找到了我们想要的地方,然后本次开始使用C++对它做HOOK从而得到游戏的lua脚本
然后开始之前,需要说明,要HOOK的位置是下图红框位置
然后这里使用x32dbg不使用OD了,OD会卡死,x32dbg和OD一样都是用来动态调试的,它的附加方式,如下图点击文件,再点击附加
然后在游戏启动器点击运行游戏,然后快速点击刷新,刷新完快速双击游戏,如下图红框
附加之后点击符号,找到luaPlus里的lua_dostring,然后按F2给lua_dostring打断点,然后按F9运行,x32dbg会莫名乱断下来,这里要自行区分断的位置对不对(比如我们要找lua_dostring但是断下来的位置不是lua_dostring位置这就不对,这就需要继续按F9,直到再lua_dostring位置断下来)
然后x32dbg乱断的情况可以点击下图选项
然后点击忽略上一次,这样可以减少断下来的情况,注意这里会把上一次断点的位置忽略也就是再执行到上一次断点(异常)的位置不会断下来了
然后来到上一个内容里找到的我们想要的位置,如下图断点位置,然后hook的位置在下图断点的位置,然后这时可以观察栈esp+0位置是lua脚本的内容,esp+4(esp+8位置的名字不知道为啥它会乱码)的位置是lue脚本的名字,有了这些开始写C++代码
然后注入的时候要注意,不能太早,太早注入器获取不到游戏句柄从而注入失败
核心代码,它实现了把lua写入到硬盘上
HOOK位置,0x31C44B是偏移
效果图:
使用记事本打开
HOOK.cpp文件的内容
// HOOK.cpp: 实现文件
//#include "pch.h"
#include "MFCLibrary3.h"
#include "HOOK.h"
#include "afxdialogex.h"
#include "CLVEH.H"
#include "stringex.h"
void Call_输出调试信息(char*pszFormat, ...)
{
#ifdef _DEBUGchar szbufFormat[0x1000];char szbufFormat_Game[0x1100] = "";va_list argList;va_start(argList, pszFormat);vsprintf_s(szbufFormat, pszFormat, argList);strcat_s(szbufFormat_Game, szbufFormat);OutputDebugStringA(szbufFormat_Game);va_end(argList);#endif}
void LuaHook(EXCEPTION_POINTERS* ExceptionInfo)
{stringex luaFile = (char*)*(DWORD*)(ExceptionInfo->ContextRecord->Esp + 4);//lua的目录地址(lua文件名)int weizhi = luaFile.rfind("/");int tmp = 0;if (weizhi == -1) {weizhi = 0;tmp = 0;}else {tmp = weizhi;weizhi++;}string FILES = luaFile.substr(weizhi, luaFile.size() - tmp);stringex PATH;PATH = "d:\\lua\\";PATH = PATH + FILES;Call_输出调试信息("--- %s", PATH.c_str());char* luaText = (char*)*(DWORD*)(ExceptionInfo->ContextRecord->Esp + 0);//lua的文件内容Call_输出调试信息("jinru3");// CreateFileA是Windows提供的函数HANDLE hResFile = CreateFileA(PATH.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建文件 // INVALID_HANDLE_VALUE意思是创建文件失败if (INVALID_HANDLE_VALUE == hResFile){Call_输出调试信息("创建失败");}DWORD dwWritten = 0;//写入文件的大小 // SetFilePointer是Windows提供的函数,意思是设置偏移,就是在文件中第几行第几列开始写入SetFilePointer(hResFile, 0, 0, FILE_BEGIN);// WriteFile是Windows提供的函数,意思是给文件写内容WriteFile(hResFile, luaText, strlen(luaText), &dwWritten, NULL);//写入文件 // FlushFileBuffers是Windows提供的函数,意思是刷新缓冲区,一般只有刷新了缓冲区数据才算真正的写到文件中放到硬盘里了FlushFileBuffers(hResFile);// CloseHandle是Windows提供的函数,意思是关闭句柄(句柄是一个抽象的概念为了系统的安全搞的),在这里的意思是关闭文件// 不关闭的效果,在删除文件时提示文件已打开无法删除这种提示CloseHandle(hResFile);//关闭文件句柄 //lua.WriteToFile(PATH);}
// HOOK 对话框IMPLEMENT_DYNAMIC(HOOK, CDialogEx)HOOK::HOOK(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG1, pParent)
{CCLVEH::Instance()->AddVeh("HOOKLUA", "Game.exe", 0x31C44B, 0, 2, 0, LuaHook);CCLVEH::Instance()->InitVeh();}HOOK::~HOOK()
{
}void HOOK::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(HOOK, CDialogEx)ON_BN_CLICKED(IDC_BUTTON1, &HOOK::OnBnClickedButton1)
END_MESSAGE_MAP()// HOOK 消息处理程序void HOOK::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码
}
上方的代码不全,只有手写的代码
完整代码:
链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5
提取码:q9n5
复制这段内容后打开百度网盘手机App,操作更方便哦