DLL単体からLIBを作る

LIBが欲しいんだけど、DLLしかないと言われました。そんなとき、貴方ならどうしますか?

  • Win32APIで提供されているLoadLibrary、GetProcAddressを使えと説得する
  • LIBファイルを自力で作る

ここでは、後者の方法について紹介します。


最初にいっておきますが、関数の定義を知らずに呼び出すことを目的とした話ではありません。ヘッダくらいはあるものとし、WindowsSDKにある標準のツールで素早くLIBを作成する方法です。

方法は以下の2ステップです。

  1. DEFファイルを作成する
  2. 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 こういう手順は、正規表現をうまく使えば自動化できますが、頻繁に起こる状況ではないし、スクリプトを書くこと自体がもう手軽じゃないです。

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz