gpt4 book ai didi

C++ 获取 64 位应用程序的模块基址

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:37 28 4
gpt4 key购买 nike

我最近一直在玩内存读取/编辑,遇到了一个问题,我认为这是由于 64 位应用程序引起的,我也尝试在 64 位下编译。我对使用 32 位应用程序的此脚本没有任何问题,但是当我在纸牌上尝试此操作时,它无法获取基地址,因此无法计算出正确的偏移量等。这是脚本:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
using namespace std;

DWORD dwGetModuleBaseAddress(DWORD dwProcessID, TCHAR *lpszModuleName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
DWORD dwModuleBaseAddress = 0;
if (hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = { 0 };
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}

int main()
{
DWORD address = 0xBAFA8;
HWND hwnd = FindWindow(0, L"Solitaire");
DWORD pid;
int data = 0;
int newData = 0;
if (hwnd)
{
GetWindowThreadProcessId(hwnd, &pid);
HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
if (phandle)
{
DWORD base = dwGetModuleBaseAddress(pid, L"Solitaire.exe");
cout << "Base: " << (void*)base << endl;

ReadProcessMemory(phandle, (LPCVOID)(base + address), &data, sizeof(data), 0);
}
else {
cout << "Couldnt get handle" << endl;
}

}
else {
cout << "Couldn't find window" << endl;
}
cin.get();
return 0;
}

问题可能是我使用的函数使用了 MODULE32,但是我尝试了其他函数(使用 EnumModules)仍然无法返回地址。

关于如何获取 64 位应用程序的基地址或使此脚本正常工作的任何想法?

谢谢

最佳答案

好吧,您的代码永远无法成功运行,因为您谈论的是 64 位,但您使用的是 DWORD 作为基地址! Solitare 可能有一个 32 位地址,但你不能保证这一点,你永远不应该假设它。

这个功能有效。它只需要相关进程的进程 ID,并假定您需要该进程的基地址。即不是它的 DLL 之一。如果您不想要拥有进程,那么您需要遍历 moduleArray使用类似 for (int i=0; i<moduleCount; i++ ) { // do something with moduleArray[i] } 的东西然后检查模块文件名。

如果您只想要启动过程(可执行文件),您可以假设它是数组中的第一个元素。

DWORD_PTR GetProcessBaseAddress( DWORD processID )
{
DWORD_PTR baseAddress = 0;
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
HMODULE *moduleArray;
LPBYTE moduleArrayBytes;
DWORD bytesRequired;

if ( processHandle )
{
if ( EnumProcessModules( processHandle, NULL, 0, &bytesRequired ) )
{
if ( bytesRequired )
{
moduleArrayBytes = (LPBYTE)LocalAlloc( LPTR, bytesRequired );

if ( moduleArrayBytes )
{
unsigned int moduleCount;

moduleCount = bytesRequired / sizeof( HMODULE );
moduleArray = (HMODULE *)moduleArrayBytes;

if ( EnumProcessModules( processHandle, moduleArray, bytesRequired, &bytesRequired ) )
{
baseAddress = (DWORD_PTR)moduleArray[0];
}

LocalFree( moduleArrayBytes );
}
}
}

CloseHandle( processHandle );
}

return baseAddress;
}

关于C++ 获取 64 位应用程序的模块基址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26572459/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com