他人の空似自作物置場

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;
}