web-dev-qa-db-ja.com

DLL関数パラメータの検索

文書化されていない Dll関数のパラメータを見つけるにはどうすればよいですか?

私はインターネット全体を検索し、1つの方法を見つけることになりました:それは装飾された機能を含みます。しかし、私はそれらを取得する方法を見つけることができません。

助けていただければ幸いです。

18
user37875

Paulが指摘したように、IDA Pro(またはその無料バージョン)のようなものを使用して、アプリケーションを逆アセンブルする必要があります。

優れた入門リソースは、ウィキブックス x86 Disassembly です。具体的には、 関数とスタックフレーム のセクションを見てください。関数パラメーターの推定は、標準タイプのいくつかのパラメーターを使用する単純な関数の場合は簡単です。

おそらく、この種のことを始めるための最良の方法は、小さなテストDLLを作成し、既知のパラメーターを使用していくつかの関数を作成してから、DLLを逆アセンブルして、パターンを確認することです。サードパーティのものを逆アセンブルするのではなく、独自の関数(ソースコードがあり、完全な署名を知っている)。

8
user2189331

私はかなり詳細な答えをしました ここ 、ReactOSはあなたの最善の策です、ここのみんなは少しベースから外れています。

私はシステムDLLを逆アセンブルしようとすることを強くお勧めしません

[〜#〜]はるかに[〜#〜]より冒険的(そして私は物事の見た目からこれまで議論されたとは思わない)、テクニックはPDBの内容を列挙します。

ご存知かもしれませんが、PDBファイルはデバッグシンボルですが、独占禁止法訴訟の訴訟により、Microsoftは、文書化されていない大量の情報を公開する必要があります。

大量のWindowsAPIに関する完全に正確で使用可能で更新された情報は、PDBファイルを介してのみ文書化されています。呼び出し規約、引数の数、さらには引数のタイプと名前も文書化されています(ただし、もちろん使用に関する詳細は文書化されていません:)。

DIA SDKを確認してください。dia2dumpは、Visual Studioで配布される良い例です。さらに調査するために、装飾を解除するためのソリューションを提供し、具体的に質問に答えます。

また、kernel32はUnDecorateSymbolNameを提供しているため、デバッグSDKライブラリにリンクしたくない場合にも使用できます。

8

これを行う唯一の方法は、関数を分解し、レジスタとスタックをどのように使用するかを確認することです。 IDA Proはこれを行うのに最適なツールですが、簡単なことではありません。

5
Ana Betts

COM Dllですか? COM Dllの場合は、それを登録し、OLEビューを使用して、インターフェイスとパラメーターを確認します。

4
Vinay

まず、 Dependency Walker をダウンロードして、その中のDLLを開きます。エクスポートおよびインポートされたシンボルが表示されます。関数名が_MyFunctionのようになっている場合は、「C」です。 「スタイル(装飾されていない)とあなたはそれとあまり関係がありません(前に言ったように分解されるかもしれません)

?_MyFunction @ LoNgSetOfSome @ _StrangeChAracTersに似ている場合は、C++で装飾されており、 ここ からの{非公式}情報を使用して「装飾解除」を試みることができます。

2
Dmitry Khalatov

あなたが持っている唯一の情報が装飾されていない関数名である場合、残念ながらそれだけから関数パラメータを推測することはできません。

アセンブリに問題がなければ、関数のマシンコードを逆アセンブルしてリバースエンジニアリングできる可能性があります。しかし、それは最も単純な関数以外のすべてに対して行うのはかなり難しいです。

1
Greg Hewgill

私はWindowsが使用するPE形式にあまり詳しくありませんが、これを行うための本当に簡単な方法はないと確信しています。シンボルテーブルが削除されていない場合は、いくつかの情報を見つけることができるかもしれませんが(Windowsがデバッグ情報をPEに保存する方法がわからない)、パラメーターの種類についてはほとんど間違いなく役に立ちません。最善の方法は、DLLをデバッガーにロードして、それを試してみることです...スタックフレーム上のrawメモリを監視し、さまざまな変数タイプを送信するなどです。

PEファイルのデバッグ情報に関する優れたリソースを見つけたとしても、プライベート関数に関する情報はほぼ確実にありません。

1
Jason Coco