2,640
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<windows.h>
#include<TlHelp32.h>
#include<stdio.h>
using namespace std;
DWORD changeAsm(HANDLE mproc, DWORD pid);
DWORD huoqu(LPCWSTR procName);
DWORD huoqujizhi(LPCWSTR procName);
DWORD GetBaseAddr(DWORD pid);
int main()
{
LPCWSTR procName = L"QQ.exe"; //进程名
do{
DWORD jizhi;
DWORD pid;
pid = huoqu(procName);//获取游戏进程id
jizhi = huoqujizhi(procName);
if (jizhi != NULL){
printf("\n%ls进程基址= 0x%08X",procName, jizhi);
printf("\n%ls确认PID %u (0x %08X )\n", procName, pid, pid);
}
system("pause");
} while (1);
return 0;
}
DWORD huoqujizhi(LPCWSTR procName)
{
DWORD jizhi;
DWORD pid;
pid = huoqu(procName);//获取游戏进程id
if (!pid)
{
printf(" 无法进程,程序是否打开?\n");
return NULL;
}
HANDLE mProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (mProc == NULL)
{
printf(" 无法获取进程权限\n");
return NULL;
}
//jizhi = GetBaseAddr(pid);
jizhi = changeAsm(mProc,pid);
return jizhi;
}
DWORD huoqu(LPCWSTR procName)
{
DWORD FAN = NULL;
PROCESSENTRY32 pe32;
//在使用这个结构前,先设置它的大小
pe32.dwSize = sizeof(pe32);
//给系统内所有的进程拍个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" 无法创建进程列表\n");
return NULL;
}
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while (bMore)
{
if (lstrcmpi(procName, pe32.szExeFile) == 0)
{
FAN = pe32.th32ProcessID;
break;
}
bMore = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap);
return FAN;
}
//简单更改sub为add
DWORD changeAsm(HANDLE mproc, DWORD pid)
{
DWORD addressOfChange;//这个因为会变,所有遍历内存中的模块
HANDLE phSnapshot;
MODULEENTRY32 me32;//存放快照信息的结构体
phSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);//创建进程快照
if (phSnapshot == INVALID_HANDLE_VALUE)
{
printf(" 无法创建进程\n");
return NULL;
}
//使用之前先设置大小
me32.dwSize = sizeof(MODULEENTRY32);
if (!Module32First(phSnapshot, &me32))
{
printf(" 无法读取进程\n");
return NULL;
}
do
{
if (me32.th32ProcessID == pid)
{
addressOfChange = (DWORD)me32.modBaseAddr;
break;
}
} while (Module32Next(phSnapshot, &me32));
BYTE oldByte[8];
DWORD dwNum = 0;
if (!ReadProcessMemory(mproc, &addressOfChange, &oldByte, 8, &dwNum))
{
printf(" 无法读取内存\n");
return addressOfChange;
}
else{
printf(" 0x%08X\n", addressOfChange);
printf(" 0x%08X\n", oldByte);
return addressOfChange;
}
}
DWORD GetBaseAddr(DWORD pid)
{
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
if (hModuleSnap == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, L"创建进程失败", L"!", MB_OK);
}
MODULEENTRY32 me;
me.dwSize = sizeof(MODULEENTRY32);
Module32First(hModuleSnap, &me);
DWORD dwBaseAddr;
dwBaseAddr = (DWORD)me.modBaseAddr;
CloseHandle(hModuleSnap);
return dwBaseAddr;
}