没用的C代码
asm版本:函数地址动态加载api
根据导出表查找函数名
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <iostream>
using std::cout;
using std::endl;
void * getExportApi(DWORD base_addr ,const char * api_name) {
if (0 == base_addr || 0 == api_name) return 0;
size_t api_name_len = strlen(api_name);
IMAGE_DOS_HEADER * dos = (IMAGE_DOS_HEADER*)base_addr;
IMAGE_NT_HEADERS * nt = (IMAGE_NT_HEADERS *)(base_addr + dos->e_lfanew);
DWORD export_rva= nt->OptionalHeader.DataDirectory[0].VirtualAddress;
if (0 == export_rva)
return 0;
DWORD export_mem = export_rva + base_addr;
IMAGE_EXPORT_DIRECTORY * export_dir = (IMAGE_EXPORT_DIRECTORY *)export_mem;
DWORD n = export_dir->NumberOfNames;
if (0 == n)
return 0;
DWORD * addr_names = (DWORD*)(export_dir->AddressOfNames + base_addr);
WORD * addr_ord = (WORD*)(export_dir->AddressOfNameOrdinals + base_addr);
DWORD * addr_funcs = (DWORD*)(export_dir->AddressOfFunctions + base_addr);
char * func_name = 0;
int iIndex = 0;
for (int i = 0; i < n; ++i) {
func_name = (char*)(addr_names[i] + base_addr) ;
if (0 == memcmp(func_name, api_name, api_name_len)) {
iIndex = i;
break;
}
}
if (0 == iIndex)
return 0;
iIndex = addr_ord[iIndex];
return (void*)(addr_funcs[iIndex] + base_addr);
}
int main()
{
HMODULE hKernerl32 = LoadLibraryA("kernel32.dll");
cout << getExportApi((DWORD)hKernerl32, "LoadLibraryA") << endl;
HMODULE(__stdcall * pfunc)(LPCSTR) = LoadLibraryA;
cout << pfunc << endl;
getchar();
return 0;
}