C语言获取进程所有模块地址(游戏外挂必备)
2022-07-06
编译环境:Unicode字符集
代码结构
--程序
-Toolhelp.h
-源.cpp
编译代码:
Toolhelp.h
#pragma once // 尝试 将 delphi 翻译成 c++ #include<Windows.h> #include"Tlhelp321.h" class TToolhelp { public: TToolhelp(DWORD dwFlags = 0, DWORD dwProcessID = 0); ~TToolhelp(); BOOL CreateSnapshot(DWORD dwFlags, DWORD dwProcessID = 0); BOOL ProcessFirst(PPROCESSENTRY32 ppe); BOOL ProcessNext(PPROCESSENTRY32 ppe); BOOL ProcessFind(DWORD dwProcessId, PPROCESSENTRY32 ppe); BOOL ModuleFirst(PMODULEENTRY32 pme); BOOL ModuleNext(PMODULEENTRY32 pme); BOOL ModuleFind_BaseAddr(void *pvBaseAddr, PMODULEENTRY32 pme); BOOL ModuleFind_ModName(WCHAR * pszModName, PMODULEENTRY32 pme); BOOL ThreadFirst(PTHREADENTRY32 pte); BOOL ThreadNext(PTHREADENTRY32 pte); BOOL HeapListFirst(PHEAPLIST32 phl); BOOL HeapListNext(PHEAPLIST32 phl); int HowManyHeaps(); BOOL HeapFirst(PHEAPENTRY32 phe, DWORD dwProcessID, DWORD dwHeapID); BOOL HeapNext(PHEAPENTRY32 phe); int HowManyBlocksInHeap(DWORD dwProcessID, DWORD dwHeapId); BOOL IsAHeap(HANDLE hProcess, void * pvBlock, DWORD * pdwFlags); BOOL EnableDebugPrivilege(BOOL fEnable = TRUE); BOOL ReadProcessMemory(DWORD dwProcessID, void* pvBaseAddress, void* pvBuffer, DWORD cbRead, DWORD *pdwNumberOfBytesRead = NULL); private: HANDLE m_hSnapshot; }; //构造函数 TToolhelp::TToolhelp(DWORD dwFlags, DWORD dwProcessID) { m_hSnapshot = INVALID_HANDLE_VALUE; CreateSnapshot(dwFlags, dwProcessID); } //析构函数 TToolhelp::~TToolhelp() { if (m_hSnapshot != INVALID_HANDLE_VALUE) { CloseHandle(m_hSnapshot); } } // 建立快照 BOOL TToolhelp::CreateSnapshot(DWORD dwFlags, DWORD dwProcessID) { if (m_hSnapshot != INVALID_HANDLE_VALUE) { CloseHandle(m_hSnapshot); } if (dwFlags == 0) m_hSnapshot = INVALID_HANDLE_VALUE; else m_hSnapshot = CreateToolhelp32Snapshot(dwFlags, dwProcessID); return m_hSnapshot != INVALID_HANDLE_VALUE; } // 进程枚举 BOOL TToolhelp::ProcessFirst(PPROCESSENTRY32 ppe) { if (Process32First(m_hSnapshot, ppe) && ppe->th32ProcessID == 0) { return ProcessNext(ppe); } } BOOL TToolhelp::ProcessNext(PPROCESSENTRY32 ppe) { if (Process32First(m_hSnapshot, ppe) && ppe->th32ProcessID == 0) { return ProcessNext(ppe); } } BOOL TToolhelp::ProcessFind(DWORD dwProcessId, PPROCESSENTRY32 ppe) { BOOL R = ProcessFirst(ppe); while (R) { if (ppe->th32ProcessID == dwProcessId) break; R = ProcessNext(ppe); } return R; } // 模块枚举 BOOL TToolhelp::ModuleFirst(PMODULEENTRY32 pme) { return Module32First(m_hSnapshot, pme); } BOOL TToolhelp::ModuleNext(PMODULEENTRY32 pme) { return Module32Next(m_hSnapshot, pme); } BOOL TToolhelp::ModuleFind_BaseAddr(void *pvBaseAddr, PMODULEENTRY32 pme) { BOOL R = ModuleFirst(pme); while (R) { if (pme->modBaseAddr == pvBaseAddr) break; R = ModuleNext(pme); } return R; } BOOL TToolhelp::ModuleFind_ModName(WCHAR *pszModName, PMODULEENTRY32 pme) { BOOL R = ModuleFirst(pme); while (R) { if (lstrcmpi(pme->szModule, pszModName) == 0 || lstrcmpi(pme->szExePath, pszModName) == 0) break; R = ModuleNext(pme); } return R; } // 线程枚举 BOOL TToolhelp::ThreadFirst(PTHREADENTRY32 pte) { return Thread32First(m_hSnapshot, pte); } BOOL TToolhelp::ThreadNext(PTHREADENTRY32 pte) { return Thread32Next(m_hSnapshot, pte); } // 内存枚举 int TToolhelp::HowManyHeaps() { HEAPLIST32 hl; BOOL fOK; int R = 0; hl.dwSize = sizeof(HEAPLIST32); fOK = HeapListFirst(&hl); while (fOK) { R++; fOK = HeapListNext(&hl); } return R; } int TToolhelp::HowManyBlocksInHeap(DWORD dwProcessID, DWORD dwHeapId) { HEAPENTRY32 he; BOOL fOK; int R = 0; he.dwSize = sizeof(he); fOK = HeapFirst(&he, dwProcessID, dwHeapId); while (fOK) { R++; fOK = HeapNext(&he); } return R; } BOOL TToolhelp::HeapListFirst(PHEAPLIST32 phl) { return Heap32ListFirst(m_hSnapshot, phl); } BOOL TToolhelp::HeapListNext(PHEAPLIST32 phl) { return Heap32ListNext(m_hSnapshot, phl); } BOOL TToolhelp::HeapFirst(PHEAPENTRY32 phe, DWORD dwProcessID, DWORD dwHeapID) { return Heap32First(phe, dwProcessID, dwHeapID); }; BOOL TToolhelp::HeapNext(PHEAPENTRY32 phe) { return Heap32Next(phe); } BOOL TToolhelp::IsAHeap(HANDLE hProcess, void *pvBlock, DWORD *pdwFlags) { HEAPLIST32 hl; HEAPENTRY32 he; MEMORY_BASIC_INFORMATION mbi; BOOL fOkHL, fOkHE; BOOL R = FALSE; hl.dwSize = sizeof(HEAPLIST32); he.dwSize = sizeof(HEAPENTRY32); fOkHL = HeapListFirst(&hl); while (fOkHL) { fOkHE = HeapFirst(&he, hl.th32ProcessID, hl.th32HeapID); while (fOkHE) { VirtualQueryEx(hProcess, &he.dwAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if (DWORD(mbi.AllocationBase) <= DWORD(pvBlock) && DWORD(pvBlock) <= DWORD(mbi.AllocationBase) + mbi.RegionSize) { *pdwFlags = hl.dwFlags; R = TRUE; return R; }; fOkHE = HeapNext(&he); } fOkHL = HeapListNext(&hl); } } // 提升权限 BOOL TToolhelp::EnableDebugPrivilege(BOOL fEnable) { HANDLE hToken; TOKEN_PRIVILEGES tp; BOOL R = FALSE; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); if (fEnable) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); R = GetLastError() == ERROR_SUCCESS; CloseHandle(hToken); } return R; } // 内存读取 BOOL TToolhelp::ReadProcessMemory(DWORD dwProcessID, void * pvBaseAddress, void * pvBuffer, DWORD cbRead, DWORD *pdwNumberOfBytesRead) { return Toolhelp32ReadProcessMemory(dwProcessID, pvBaseAddress, pvBuffer, cbRead, pdwNumberOfBytesRead); }
源.cpp
#include <iostream> #include <string> #include <windows.h> #include "Tlhelp32.h" #include"Toolhelp.h" using namespace std; /*Char*转TCHAR*/ LPWSTR ConvertCharToLPWSTR(const char* szString) { int dwLen = strlen(szString) + 1; int nwLen = MultiByteToWideChar(CP_ACP, 0, szString, dwLen, NULL, 0);//算出合适的长度 LPWSTR lpszPath = new WCHAR[dwLen]; MultiByteToWideChar(CP_ACP, 0, szString, dwLen, lpszPath, nwLen); return lpszPath; } int main() { cout << "请输入窗口标题:"; string title; getline(cin, title); HWND hWnd; LPCWSTR newititle = ConvertCharToLPWSTR(title.c_str()); hWnd = FindWindow(NULL, newititle);//根据窗口标题获取窗口句柄 cout << hWnd << endl; DWORD PID; GetWindowThreadProcessId(hWnd, &PID);//存入PID HANDLE hprocess; hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);//获取进程 setlocale(LC_ALL, "chs"); MODULEENTRY32 meme; meme.dwSize = sizeof(MODULEENTRY32); BOOL fmOk; TToolhelp(NULL).EnableDebugPrivilege(TRUE); TToolhelp thModules = TToolhelp(TH32CS_SNAPALL, PID);//进程号 cout << PID << endl; fmOk = thModules.ModuleFirst(&meme); while (fmOk) { // 模块 wprintf(L"模块基址:十进制 %d ,十六进制 0x%x ,模块大小:%d,模块名称:%s\n", meme.modBaseAddr, meme.modBaseAddr, meme.modBaseSize, meme.szModule); fmOk = thModules.ModuleNext(&meme); } TToolhelp(NULL).EnableDebugPrivilege(FALSE); while (true); }
发表评论: