吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2914|回复: 16
收起左侧

[其他转载] C语言获取程序基址

   关闭 [复制链接]
zzl2nx 发表于 2022-7-20 23:10
菜鸟一个,刚尝试学习逆向,找了好久的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 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
感谢楼主分享,想问这个做什么用的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表