2010/08/13

ネイティブコード関数のスクリプトへの埋め込み

ネイティブコード関数呼び出し機能では、DLL内の関数だけでなく、任意のアドレスを関数として呼び出すことも可能です。16進数列を元にバイト配列を生成してポインタオブジェクトを返す「Hex.decode()」と共に使用すれば、スクリプト中に任意のネイティブコード関数を埋め込んで使用できます。
このテクニックは、バイト列の操作などの速度を要する低レベルな処理を自前で実装したい時に役立ちます。

埋め込むネイティブコード関数を脳内アセンブルで作るのは大変なので、C言語などのコンパイラが生成する中間ファイルを使用するといいでしょう。
VisualStudioでは、「.cod」という拡張子の中間ファイルとして、アセンブラや16進数列の機械語コードが出力されます。

下記は、Base.ng中で定義されているネイティブコード関数埋め込みの例です。
memIndexOf=(new CFunction(
 Hex.decode('55 8B EC (中略) E5 5D C3')
)).toFunction([Pointer,Int,Pointer,Int],Int)
ライブラリオブジェクトの「proc()」の代わりに、「(new CFunction(Hex.decode("機械語の16進数文字列"))).toFunction([引数の型],返り値の型)」のようにして、16進数文字列をバイト配列→関数ポインタオブジェクト→ラッパー関数と変換しています。

0 件のコメント:

コメントを投稿