好友
阅读权限10
听众
最后登录1970-1-1
|
菜鸟一个,刚尝试学习逆向,找了好久的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;
}
|
免费评分
-
参与人数 1 | 吾爱币 +3 |
热心值 +1 |
收起
理由
|
苏紫方璇
| + 3 |
+ 1 |
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|