本帖最后由 lichunfeng 于 2020-9-4 21:10 编辑
这个辅助貌似N天前拿到的了,现已被和谐。当时还原出来了c++代码,由于也是没有加壳,看起来和源码并无太大区别,本质原理就是遍历内存搜索浮点数9.5(人物移动速度),然后将其保存到vector,调用writeprocmemory api 写入更快的速度(比9.5大的值)实现外挂功能,写入9.5还原速度,执行效率相当堪忧,好的方法是找到人物移动速度基址,直接改,因为遍历内存搜索太慢了。这里就不贴汇编代码的分析了,基本上就是一些Api的调用,push 参数 call。贴出部分代码,总滴来说就是一个学习的过程。
bool sFindGame() {//寻找游戏 遍历内存 搜索浮点数9.5
speed.clear();
DWORD fpid = GetProcessIDFromName(_T("FallGuys_client.exe"));//进程名取ID
if (fpid == 0)
{
AfxMessageBox(_T("没有发现游戏进程! 先运行游戏"));
return 0;
}
fHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, fpid);//取得进程句柄
MEMORY_BASIC_INFORMATION MemInfo;
for (static size_t address; VirtualQueryEx(fHandle, (LPVOID)address, &MemInfo, sizeof(MemInfo)); address += MemInfo.RegionSize)
{ //查询内存地址信息 然后遍历搜索浮点数9.5 ,搜索到之后保存
if (MemInfo.State != MEM_COMMIT)
{
continue;
}
std::vector <float> memory(MemInfo.RegionSize);//定义一个动态数组
if (!ReadProcessMemory(fHandle, (LPVOID)address, &memory[0], MemInfo.RegionSize, 0))//读取内存赋值给动态数组
{
continue;
}
size_t size = MemInfo.RegionSize / sizeof(float); //内存取域大小除以浮点长度 即遍历次数
for (size_t i = 0; i < size; i++)
{
if (memory[i] == 9.5f)
{
speed.push_back(address + (i * sizeof(float)));//搜到浮点数9.5然后保存到全局变量
}
}
}
}
void SetSpeed(float sp) {//这个函数就是写入移动速度数值
for (size_t x = 0; x < speed.size(); x++) {
WriteProcessMemory(fHandle, (LPVOID)speed[x],&sp, sizeof(sp), NULL);
}
}
|