DLL+EXEからDLLの使い方を解析する[後編]

はじめに

イメージ・マジックの安藤です。
今年は雪が降ることはないのかなと思っていたらまさかこの時期にとは思いもしませんでした。ともあれ、平日でなくて良かったと思っています。私は地元が北海道なのですが、そちらは今年も順調に雪が積もっているようでした。
今回は前回の話の続きです。

あらすじ

前回はコンパイル時にDLL内のメソッドを暗黙的にリンクするまでの手順を説明しました。今回はメソッドの引数と戻り値の解析です。

.NETアプリケーションを逆コンパイルする

JavaやC#などコンパイル時に中間言語に翻訳されるような言語は、特殊な対策が施されていない限りかなり可読性の高い状態で逆コンパイルすることが可能です。 .NETアプリケーションを逆コンパイルするソフトはいくつかありますが、今回はILSpyというソフトを使用しました。

データのマーシャリング

逆コンパイルしたソースからDLLのメソッドの使い方がわかれば万々歳で全てが解決するかと言われるとそんなことはありません。.NET Frameworkにはマネージコードという概念があり、その外にあるコード(アンマネージコード)を呼び出すにはデータのマーシャリング(変換)が必要になります。
つまり、C++で使われると型とC#で使われる型はかなり違うということです。
大体の変換対応表はMSの公式ドキュメントに記載されています。
この中でも特にマルチバイトの文字列はC++で扱うのはだいぶ辛いです。それから、上記のドキュメントには書いていませんが、関数ポインタを渡したいときはdelegateが使われたり、参照(例えばWIN32APIにあるHANDLE型の参照はLPHANDLE)を渡したいときはrefキーワードが使われたりします。ちなみに、System.IntPtrとref System.IntPtrは別物です。

おわりに

やってみて思いましたがDLLの解析はノーヒントだとだいぶ辛いですね(探してもあまり情報が出なかったので)。なのでその軌跡をここに残すことにしました。