HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0218
KENTADLL内のエクスポート済み関数のアドレスから関数名を取得4解決


KENTA

リンク

2008/2/18(Mon) 21:12:32|NO.13625

DLL内のエクスポート済み関数のアドレスの取得はできるのですが、
そのアドレスから関数名の取得ができません。
取得できる方法があれば、教えてください。



この記事に返信する


Shinya

リンク

2008/2/19(Tue) 11:00:30|NO.13637

関数のアドレスから関数名を取得することはそうそう無いことですが…使用を誤らないように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



KENTA

リンク

2008/2/19(Tue) 13:34:46|NO.13638

Shinyaさん、ありがとうございます。
おかげで関数名を取得できました。



FUJI

リンク

2008/2/19(Tue) 15:47:03|NO.13639

HSPのFunc Info内から探すとか。

#module #defcfunc getFuncName int FuncAddress mref hspctx, 68 dupptr hsphed, hspctx.0, 96 // hspctx.hsphed / sizeof HSPHED ds_ptr = lpeek( hspctx, 12 ) // hspctx.mem_mds finfo_ptr = lpeek( hspctx, 840 ) // hspctx.mem_finfo max_finfo = lpeek( hsphed, 60 ) // hsphed.max_finfo dupptr finfo, finfo_ptr, max_finfo for i, 0, max_finfo, 28 // sizeof STRUCTDAT == 28 nameidx = lpeek( finfo, i + 12 ) proc = lpeek( finfo, i + 24 ) if proc == FuncAddress : return strf( "%s", ds_ptr + nameidx ) next return "" #global #include "user32.as" mes getFuncName(varptr(MessageBoxA))



Shinya

リンク

2008/2/19(Tue) 18:14:07|NO.13640

>HSPのFunc Info内から探すとか。
fujidigさんのは高度な裏技ですね断然シンプルで速いです.
こちらを使った方がよさそうです.



ONION software Copyright 1997-2023(c) All rights reserved.