DLL関数パラメーターの検索
-
08-07-2019 - |
質問
ドキュメント化されていない DLL関数のパラメーターを見つけるにはどうすればよいですか?
インターネットで検索した結果、1つの方法が見つかりました。装飾された機能が含まれています。しかし、それらを取得する方法を見つけることができません。
ご協力いただければ幸いです。
解決
Paulが述べたように、IDA Pro(または無料版)のようなものを使用して、アプリケーションを逆アセンブルする必要があります。
優れた入門リソースは、Wikibook x86逆アセンブリです。具体的には、関数とスタックフレームのセクションをご覧ください。関数パラメーターの推定は、標準タイプのいくつかのパラメーターを取得する単純な関数の場合は簡単です。
おそらく、この種のことを始める最善の方法は、小さなテストDLLを作成し、既知のパラメーターを使用していくつかの関数を作成し、DLLを逆アセンブルしてパターンを確認することです。サードパーティのものを分解するのではなく、独自の関数(ソースコードがあり、完全なシグネチャを知っている)から逆アセンブリを学びます。
他のヒント
かなり詳細な回答を行いましたこちら、ReactOS再びそう思われるので、あなたの最善の策です。全員はここから少し外れています。
システムDLLを逆アセンブルしようとする強く落胆します。
非常により冒険的(そして、これまでのものの見た目からは議論されていなかったと思います)、テクニックはPDBの内容を列挙することです。
PDBファイルはご存知のようにデバッグシンボルですが、Microsoftは反トラスト法廷の訴訟により、文書化されていない情報を大量にリリースする必要があります。
膨大な量のWindows APIの完全に正確で使用可能な更新された情報は、PDBファイルを介してのみ文書化されます。呼び出し規約、引数の数、さらには引数のタイプと名前も文書化されています(ただし、コースの使用に関する詳細ではありません)。
DIA SDKを確認してください。dia2dumpはVisual Studioと共に配布される良い例です。さらに調査するために、それはまた、機能を装飾しないためのソリューションを提供します。
また、kernel32はUnDecorateSymbolNameを提供するため、デバッグSDKライブラリにリンクしたくない場合にも使用できます。
これを行う唯一の方法は、関数を逆アセンブルし、レジスタとスタックをどのように使用するかを確認することです。 IDA Proはこれを行うのに最適なツールですが、些細なことではありません。
COM DLLですか? COM DLLの場合は、登録して、OLEビューを使用してInterafacesとパラメーターを確認します。
まず、 Dependency Walker をダウンロードして、DLLを開きます。エクスポートおよびインポートされたシンボルが表示されます。関数名が_MyFunctionのように見える場合、それは" C"です。スタイル(装飾されていない)で、あまり関係ない(前述のように逆アセンブルされる可能性があります)
?_ MyFunction @ LoNgSetOfSome @ _StrangeChAracTersのようなものであれば、C ++で装飾されており、「装飾解除」を試みることができます。 こちら
からの{unofficial}情報を使用してお持ちの情報が装飾されていない関数名のみである場合、残念ながらそれだけから関数パラメーターを推測することはできません。
アセンブリが得意であれば、関数のマシンコードを逆アセンブルしてリバースエンジニアリングすることができます。しかし、これは最も単純な関数を除くすべてに対して実行するのはかなり難しいです。
Windowsが使用するPE形式についてはあまり詳しくありませんが、これを実行する簡単な方法はないと確信しています。シンボルテーブルが削除されていない場合、いくつかの情報(Windowsがどのようにデバッグ情報をPEに保存するかはわかりません)を見つけることができるかもしれませんが、それはほとんど確実にパラメータータイプで役立ちません。最良の方法は、DLLをデバッガーにロードして実験することです。スタックフレームの生メモリを監視し、さまざまな変数タイプを送信します。
PEファイル内のデバッグ情報に関する適切なリソースを見つけたとしても、プライベート関数に関する情報はほとんど確実にありません。