DllFuncList.zip/DllFuncList.c
#include <windows.h>
#include <stdio.h>
#include <imagehlp.h>//dbghelp.h
#pragma comment(lib,"imagehlp.lib")
char AppDir[256];
void SetAppDir(void){
int i;
GetModuleFileName(NULL,AppDir,256);
i = strlen(AppDir)-1;
while(AppDir[i] != '\\' && AppDir[i] != '/' && i > 0)i--;
AppDir[i] = '\0';
SetCurrentDirectory(AppDir);
}
BOOL ShowExportedFunction(LPCTSTR name){
HMODULE hm;
unsigned int i,j,size,base;
char** n_list;
short *num;
IMAGE_EXPORT_DIRECTORY *data;
hm = LoadLibrary(name);
if(hm == NULL){
printf("指定されたライブラリを読み込めませんでした\n");
return 1;
}
base = (int)hm;
data = ImageDirectoryEntryToData(hm,TRUE,IMAGE_DIRECTORY_ENTRY_EXPORT,&size);
if(data == NULL){
printf("ライブラリから情報を読み込めませんでした\n");
FreeLibrary(hm);
return 1;
}
//関数名リストの取得(相対アドレスでdll内格納なのでコピーしてからdllのアドレスを加算)
n_list = (char **)malloc(sizeof(char**) * data->NumberOfNames);
memcpy(n_list,(void *)(data->AddressOfNames + base),sizeof(char**) * data->NumberOfNames);
for(j = 0; j < data->NumberOfNames; j++){
n_list[j] += base;
}
num = (short *)(data->AddressOfNameOrdinals + base);
printf("%s関数一覧\n",name);
i = 0;
while(i < data->NumberOfFunctions){
printf("Number:%5d(0x%04x)",data->Base + i,data->Base + i);
for(j = 0; j < data->NumberOfNames; j++){
if(num[j] != i)continue;
//関数名を出力
printf(" Addr:0x%08x FuncName:%s",GetProcAddress(hm,n_list[j]),n_list[j]);
break;
}
printf("\n");
i++;
}
free(n_list);
FreeLibrary(hm);
return 0;
}
int main(int argc,char *argv[]){
char str[256],*s;
int i;
SetAppDir();
if(argc < 2){
printf("解析するdllへのパスを入力してください\n");
gets(str);
s = str;
if(str[0] == '\"')s++;
if(s[strlen(s)-1] == '\"')s[strlen(s)-1] = '\0';
ShowExportedFunction(s);
} else {
i = 1;
while(i < argc){
ShowExportedFunction(argv[i]);
i++;
}
}
printf("終了する時はENTERを押してください\n");
getchar();
return 0;
}