【发布时间】:2014-10-26 11:28:09
【问题描述】:
我最近一直在玩内存读取/编辑,并遇到了一个我认为是由于 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 位应用程序的基地址或让这个脚本工作?
谢谢
【问题讨论】:
-
这可能有用(注意讨论引用目标程序和寻找程序的位数)stackoverflow.com/questions/17412545/…
-
modBaseAddr是一个指针。停止将其转换为 32 位整数。您知道在 64 位 Windows 上指针是 64 位宽的吗?您将无法从在 32 位 WOW64 模拟器下运行的 32 位进程查看 64 位进程。所以以 64 位运行是必不可少的。
标签: c++ winapi visual-c++