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;
}
看不懂,感谢分享, FiiCei 发表于 2022-7-22 09:37
感谢楼主分享,想问这个做什么用的
按我个人理解,程序加载后的基址是动态的,当我们要利用某个具体的内存地址时,他这个地址可能每次都不同,所以就需要用 基址+偏移。纯个人理解 学习,感谢分享,楼主厉害 我运行的结果是:
baseImage:360000 正在学习 感谢分享 很强大,和Cheat Engine功能类似,Cheat Engine官网有Delphi源码,可以研究研究. 我也是找了好久,参考下试试 直接调用进程快照函数就可以了 感谢楼主分享,想问这个做什么用的
页:
[1]
2