c语言取程序内部模块基址


#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <iostream>

//取进程id

DWORD GetProcessIDByName(const char* pName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return NULL;
    }
    PROCESSENTRY32 pe = { sizeof(pe) };
    for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
        if (strcmp(pe.szExeFile, pName) == 0) {
            CloseHandle(hSnapshot);
            return pe.th32ProcessID;
        }
        //printf("%-6d %s\n", pe.th32ProcessID, pe.szExeFile);
    }
    CloseHandle(hSnapshot);
    return 0;
}


//获取程序内部模块基址
PVOID GetProcessImageBase(DWORD dwProcessId,char* dllName)
{
    PVOID pProcessImageBase = NULL;
    MODULEENTRY32 me32 = { 0 };
    me32.dwSize = sizeof(MODULEENTRY32);
    // 获取指定进程全部模块的快照
    HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
    if (INVALID_HANDLE_VALUE == hModuleSnap)
    {
    return pProcessImageBase;
    }
    // 获取快照中第一条信息
    BOOL bRet = ::Module32First(hModuleSnap, &me32);
    while (strcmp((char*)me32.szModule, dllName)!=0)
    {
    Module32Next(hModuleSnap, &me32);
    }
    pProcessImageBase = (PVOID)me32.modBaseAddr;
    // 关闭句柄
    ::CloseHandle(hModuleSnap);
    return pProcessImageBase;
}

int main(int argc, char* argv[])
{
 char* gameName = (char*)"cittt.com.exe";
DWORD processID= GetProcessIDByName(gameName);
HANDLE h =   OpenProcess(PROCESS_ALL_ACCESS,false, processID);
DWORD base_address =  (DWORD)GetProcessImageBase(processID, "cittt.com.exe");

printf("%d\n",processID);
printf("%d\n",base_address);
system("pause");
    return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值