#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
bool GetModuleBase(long long &ulModBase,pid_t pid,const char * pszModName){
bool bRet = false;
FILE * fp = NULL;
char szMapFilePath[32]={0};
char szMapFileLine[1024]={0};
if(pszModName == NULL)
{
return bRet;
}
if(pid < 0)
{
sprintf(szMapFilePath,"/proc/self/maps");
}else{
sprintf(szMapFilePath,"/proc/%d/maps",pid);
}
fp = fopen(szMapFilePath,"r");
if(fp != NULL)
{
while(fgets(szMapFileLine,sizeof(szMapFileLine),fp)!=NULL)
{
if(strstr(szMapFileLine,pszModName))
{
char * pszModAddrStart = strtok(szMapFileLine,"-");
if(pszModAddrStart)
{
ulModBase = strtoul(pszModAddrStart,NULL,16);
if(ulModBase == 0x8000)
ulModBase =0;
bRet = true;
break;
}
}
}
fclose(fp);
}
return bRet;
}
bool GetModuleFullName(pid_t pid,const char * pszModName,char *pszFullModName,int nBuffSize)
{
bool bRet = false;
FILE * fp = NULL;
char szMapFilePath[32]={0};
char szMapFileLine[1024]={0};
char * pszFullName = NULL;
if(pszModName == NULL|| pszFullModName == NULL||nBuffSize<=0)
{
return bRet;
}
if(pid<0)
{
sprintf(szMapFilePath,"/proc/self/maps");
}
else
{
sprintf(szMapFilePath,"/proc/%d/maps",pid);
}
fp = fopen(szMapFilePath,"r");
if(fp!=NULL)
{
while(fgets(szMapFileLine,sizeof(szMapFileLine),fp)!=NULL)
{
if(strstr(szMapFileLine,pszModName))
{
if(szMapFileLine[strlen(szMapFileLine) -1]=='\n')
{
szMapFileLine[strlen(szMapFileLine) -1]=0;
}
pszFullName = strchr(szMapFileLine,'/');
if(pszFullName == NULL)
{
continue;
}
strncpy(pszFullModName,pszFullName,nBuffSize -1);
bRet = true;
}
}
fclose(fp);
}
return bRet;
}
int main(int argc,char ** argv)
{
long long ulCModBase = 0;
char szCModPath[256] = {0};
if(GetModuleBase(ulCModBase,getpid(),"libc-2.23.so"))
{
printf("c mod base:0x%llx\n", ulCModBase);
}
if (GetModuleFullName(getpid(), "libc-2.23.so", szCModPath, 256))
{
printf("c mod full path:%s\n", szCModPath);
}
printf("finish \n");
return 0;
}
linux
修改对应的模块
android
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
LOCAL_MODULE := test1
LOCAL_SRC_FILES := test.cpp
include $(BUILD_EXECUTABLE)
.......
int main(int argc,char ** argv)
{
long long ulCModBase = 0;
char szCModPath[256] = {0};
if(GetModuleBase(ulCModBase,getpid(),"libc.so"))
{
printf("c mod base:0x%llx\n", ulCModBase);
}
if (GetModuleFullName(getpid(), "libc.so", szCModPath, 256))
{
printf("c mod full path:%s\n", szCModPath);
}
printf("finish \n");
return 0;
}