zzl2nx 发表于 2022-7-20 23:10

C语言获取程序基址

菜鸟一个,刚尝试学习逆向,找了好久的C语言获程序基址的方法,网上资料实在太少,后面在一篇文章看到一个大佬评论说其实就是获取程序第一个模块的地址,后面写代码试了一下,好像确实可以,所以记录一下,如有不对,谢谢大佬指出。

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

//获取进程id
int getProcessId(char * pName,int * pid){
int snMore;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
//打开进程快照
HANDLE psnh = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(psnh == INVALID_HANDLE_VALUE){
    printf("get process snap fail");
    return 0;
}
snMore = Process32First(psnh,&pe32);
while(snMore){
    if(strcmp(pe32.szExeFile,pName) == 0){
      *pid = pe32.th32ProcessID;
      return 1;
    }
    snMore = Process32Next(psnh,&pe32);
}
CloseHandle(psnh);
return 0;
}

//获取首模块地址
int getFirstModuleAddr(int pid,char ** baseImage){
MODULEENTRY32 md32;
md32.dwSize = sizeof(md32);
HANDLE msnh = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
if(msnh == NULL){
    printf("get module snap fail");
    return 0;
}
Module32First(msnh,&md32);
*baseImage = md32.modBaseAddr;
CloseHandle(msnh);
return 1;
}

//获取程序基址
LPVOID getBaseImage(char * pName){
int pid;
char * baseImage = NULL;
int status;
status = getProcessId(pName,&pid);
if(status == 0){
    return NULL;
}
status = getFirstModuleAddr(pid,&baseImage);
if(status == 0){
    return NULL;
}
return baseImage;
}

int main(){
char * baseImage;
baseImage = getBaseImage("WeChat.exe");
if(baseImage == NULL){
    printf("get baseImage fail\n");
    return 0;
}
printf("baseImage:%x\n",baseImage);
system("pause");
return 0;
}

xz91168 发表于 2022-7-21 04:56

看不懂,感谢分享,

zzl2nx 发表于 2022-7-22 13:17

FiiCei 发表于 2022-7-22 09:37
感谢楼主分享,想问这个做什么用的

按我个人理解,程序加载后的基址是动态的,当我们要利用某个具体的内存地址时,他这个地址可能每次都不同,所以就需要用 基址+偏移。纯个人理解

CXC303 发表于 2022-7-21 00:29

学习,感谢分享,楼主厉害

450046181 发表于 2022-7-21 02:03

我运行的结果是:

baseImage:360000

qszf 发表于 2022-7-21 07:24

正在学习

bnb 发表于 2022-7-21 07:46

感谢分享

wqipk 发表于 2022-7-21 08:53

很强大,和Cheat Engine功能类似,Cheat Engine官网有Delphi源码,可以研究研究.

renpeng009 发表于 2022-7-21 11:56

我也是找了好久,参考下试试

BlueTears 发表于 2022-7-21 11:57

直接调用进程快照函数就可以了

FiiCei 发表于 2022-7-22 09:37

感谢楼主分享,想问这个做什么用的
页: [1] 2
查看完整版本: C语言获取程序基址