LIBが欲しいんだけど、DLLしかないと言われました。そんなとき、貴方ならどうしますか?
- Win32APIで提供されているLoadLibrary、GetProcAddressを使えと説得する
- LIBファイルを自力で作る
ここでは、後者の方法について紹介します。
最初にいっておきますが、関数の定義を知らずに呼び出すことを目的とした話ではありません。ヘッダくらいはあるものとし、WindowsSDKにある標準のツールで素早くLIBを作成する方法です。
方法は以下の2ステップです。
- DEFファイルを作成する
- DEFファイルとDLLからLIBを作成する
DEFファイルとはDLLからエクスポートする関数について定義したテキストファイルです。自分で作っても良いのですが、DLLにある関数を延々手で打っていくほど暇ではないため、dumpbinコマンドを使います。
> dumpbin /exports dllname.dll > dllname.tmp
ここで作成されたtmpファイルを関数名だけに編集し、DEFファイルを作成します。具体的には以下の赤字部分のみを使います
ordinal hint RVA name
403 0 00001000 _func1
404 1 00002E20 _func2
まともなテキストエディタなら矩形選択が出来る(ALTキーを押しながらマウスをドラックしてみてください)ので、以下のようなDEFファイルが簡単にできあがります(※1)。完成したファイルの内容を青字で示します。
EXPORTS
_func1
_func2
このファイルをdllname.defとして保存します。
DEFが作成したらDLLからLIBが作れます。
> LIB /DEF:dllname.def /MACHINE:X86 /out:dllname.lib
これで完成です。
DEFファイルを作るのが面倒で、かつ関数が1つしかない場合、LIBコマンドで/EXPORTする関数を指定すれば1行です。
> LIB /DEF:dllname.def /MACHINE:X86 /EXPORT:_func1 /out:dllname.lib
関数のヘッダがない場合?は関数定義を想像して、ヘッダも自分で作ります。
dumpbin /disasmやOllyで頑張りましょう。(謎
—
※1 こういう手順は、正規表現をうまく使えば自動化できますが、頻繁に起こる状況ではないし、スクリプトを書くこと自体がもう手軽じゃないです。




最近のコメント