_Верный 2020-12-13 23:02 采纳率: 100%
浏览 17
已结题

有大佬能帮我解读下这些代码么?

#include <iostream>
#include "windows.h"
#include "tlhelp32.h" 
#include "vector"
#include <string> 
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <direct.h>
DWORD pID;
HANDLE pHandle;
DWORD64 GlobalPTR;
LPCSTR SigGlobalPTR = "\x4C\x8D\x05\x00\x00\x00\x00\x4D\x8B\x08\x4D\x85\xC9\x74\x11";
LPCSTR MaskGlobalPTR = "xxx????xxxxxxxx";

struct module { DWORD64 dwBase, dwSize; };
module pModule;
module GetModule(const char* moduleName) {
	HANDLE hmodule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID);
	MODULEENTRY32 mEntry;
	mEntry.dwSize = sizeof(mEntry);
	do {
		if (!_stricmp(mEntry.szModule, moduleName)) {
			CloseHandle(hmodule);

			pModule = { (DWORD64)mEntry.hModule, mEntry.modBaseSize };
			return pModule;
		}
	} while (Module32Next(hmodule, &mEntry));

	module mod = { (DWORD64)false, (DWORD64)false };
	return mod;
}

HANDLE GetProcess(const char* processName) {
	HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	PROCESSENTRY32 entry;
	entry.dwSize = sizeof(entry);
	do
		if (!_stricmp(entry.szExeFile, processName)) {
			pID = entry.th32ProcessID;
			CloseHandle(handle);
			pHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
			return pHandle;
		}
	while (Process32Next(handle, &entry));


}

bool MemoryCompare(const BYTE* bData, const BYTE* bMask, const char* szMask) {
	for (; *szMask; ++szMask, ++bData, ++bMask) {
		if (*szMask == 'x' && *bData != *bMask) {
			return false;
		}
	}
	return (*szMask == NULL);
}

DWORD64 FindSignature(DWORD64 start, DWORD64 size, const char* sig, const char* mask) {
	BYTE* data = new BYTE[size];
	SIZE_T bytesRead;
	ReadProcessMemory(pHandle, (LPVOID)start, data, size, &bytesRead);
	for (DWORD64 i = 0; i < size; i++) {
		if (MemoryCompare((const BYTE*)(data + i), (const BYTE*)sig, mask)) {
			return start + i;
		}
	}
	delete[] data;
	return NULL;
}

template<typename T> T ReadMemory(DWORD64 address) { T r; ReadProcessMemory(pHandle, (void*)address, &r, sizeof(T), 0); return r; };
template<typename T> void WriteMemory(DWORD64 address, T value) { T v = value; WriteProcessMemory(pHandle, (void*)address, &v, sizeof(T), 0); };

DWORD64 GA(int index) { int a = (8 * (index >> 0x12 & 0x3F)), b = (8 * (index & 0x3FFFF)); return ReadMemory<DWORD64>(GlobalPTR + a) + b; }
//DWORD64 GA(int index){ return ReadMemory<DWORD64>(GlobalPTR + (8 * (index >> 0x12 & 0x3F))) + (8 * (index & 0x3FFFF)); }
template <typename T> T GG(int index) { return ReadMemory<T>(GA(index)); };
template <typename T> void SG(int index, T value) { WriteMemory<T>(GA(index), value); };
int main(int argc, char* argv[])
{
	if (GetProcess("GTA5.exe")) 
	{
		module mod = GetModule("GTA5.exe");
		DWORD64 _Address = FindSignature(mod.dwBase, mod.dwSize, SigGlobalPTR, MaskGlobalPTR);
		GlobalPTR = _Address + ReadMemory<int>(_Address + 3) + 7;
		SG<int>(1696433 + 1497 + 736 + 92 + 1 + 0, std::stoi(argv[1]));
		SG<int>(1696433 + 1497 + 736 + 92 + 1 + 1, std::stoi(argv[2]));
		SG<int>(1696433 + 1497 + 736 + 92 + 1 + 2, std::stoi(argv[3]));
		SG<int>(1696433 + 1497 + 736 + 92 + 1 + 3, std::stoi(argv[4]));
		int Player_1 = GG<int>(1696433 + 1497 + 736 + 92 + 1 + 0); // Global_1696433.f_1497.f_736.f_92[0] -> 1696433+1497+736+92+1+0
		int Player_2 = GG<int>(1696433 + 1497 + 736 + 92 + 1 + 1); // Global_1696433.f_1497.f_736.f_92[1] -> 1696433+1497+736+92+1+1
		int Player_3 = GG<int>(1696433 + 1497 + 736 + 92 + 1 + 2); // Global_1696433.f_1497.f_736.f_92[2] -> 1696433+1497+736+92+1+2
		int Player_4 = GG<int>(1696433 + 1497 + 736 + 92 + 1 + 3); // Global_1696433.f_1497.f_736.f_92[3] -> 1696433+1497+736+92+1+3
	}
}

我是一个C初学者,目前这个方面仅仅会用简单的基址+偏移(例如XXX.EXE+1FABCDE+12+45+56)这样来获取计算地址,这个代码是我一个朋友给的,但是我不明白其中含义,有人能帮忙解答一下么?

  • 写回答

1条回答 默认 最新

  • 无厘头编程 2020-12-14 08:30
    关注

    Grand Theft Auto 5: Casino Heist's bonus cut for players。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月27日
  • 已采纳回答 2月19日

悬赏问题

  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加