関数のアドレスから関数名を取得することはそうそう無いことですが…使用を誤らないようにw
>DLL内のエクスポート済み関数のアドレスの取得はできるのですが、
>そのアドレスから関数名の取得ができません。
DLLのエクスポートディレクトリを調べれば取得できます.
DLLのエクスポートディレクトリならimagehlp.dllを使えば取得できます.
http://nienie.com/~masapico/api_ImageDirectoryEntryToData.html
ただ,以下のようにDLLのモジュールハンドルから自力で探した方が簡単です.
#module
#uselib "kernel32.dll"
#cfunc GetModuleHandle "GetModuleHandleA" sptr
#defcfunc getFuncName str DLLName, int FuncAddress
/*
【概要】
関数のアドレスから関数名を取得
【引数】
DLLName : ライブラリ名
FuncAddress : 関数のアドレス
【戻り値】
FuncAddressの値からDLLName内のエクスポートされる関数名を
取得し,成功すれば関数名を,そうでないならヌル文字を返す.
*/
BaseAddress=GetModuleHandle(DLLName) : if(BaseAddress==0) { return "" }
// PEヘッダの位置
dupptr _dup, BaseAddress+0x3C, 4 ; IMAGE_DOS_HEADER.e_lfanew
// エクスポートディレクトリ
dupptr _dup, BaseAddress+_dup+0x78, 4 : ExportDirectory = BaseAddress+_dup
dupptr _dup, ExportDirectory+0x18, 4 : NumberOfNames = _dup
dupptr _dup, ExportDirectory+0x1C, 4 : AddressOfFunctions = BaseAddress+_dup
dupptr _dup, ExportDirectory+0x20, 4 : AddressOfNames = BaseAddress+_dup
dupptr _dup, ExportDirectory+0x24, 4 : AddressOfNameOrdinals = BaseAddress+_dup
// 関数のアドレスを比較
Index=-1
repeat NumberOfNames
dupptr _dup, AddressOfNameOrdinals+cnt*2, 2
dupptr _dup, AddressOfFunctions+(_dup&0xFFFF)*4, 4
if(FuncAddress==_dup+BaseAddress) { Index=cnt : break }
loop
if(Index==-1) { return "" }
// 関数名を取得
dupptr _dup, AddressOfNames+Index*4, 4
dupptr _dup, BaseAddress+_dup, 64, 2
return _dup
#global
#include "user32.as"
mes getFuncName("user32.dll", varptr(MessageBoxA))
PEヘッダについては
http://codezine.jp/a/article/aid/412.aspx?p=1
エクスポートディレクトリについては
http://win32assembly.online.fr/pe-tut7.html