XREA.COM Logo XREA.COM Ad

管理人の雑記

44管理人 ★:2007/03/27(火) 19:43:20
動的に生成した機械語コードをDllCallで実行

マシン語コードを作成してみる(http://yokohama.cool.ne.jp/chokuto/urawaza/mcn/index.html)というページで、HSPのスクリプト内に機械語コードを埋め込んでAPIのコールバックに渡すという技が紹介されていた。
VisualC などにある関数のダンプ文字列を出力する機能を使うといいらしい。
AutoHotkeyでも何かに使いそうなので、試してみることに。

とりあえず、埋め込んだ関数をDllCallで呼び出してみる。
バイナリデータをスクリプト内に埋め込むために、ダンプした文字列をバッファに逆ダンプしてアドレスを返す関数を作る。

unDump(data){
ptr:=buf:=DllCall("kernel32.dll\VirtualAlloc",UInt,0,Int,Ceil(StrLen(data)/3),UInt,0x1000,UInt,0x40,UInt)
Loop,Parse,data,%A_Space%`n,`r
if A_LoopField is xdigit
DllCall("kernel32.dll\RtlMoveMemory", "UInt",ptr , "UCharP","0x" . A_LoopField, "Int",1)
return buf
}

テスト用に引数二つを足して返す関数を作る。
int WINAPI add(int p1,int p2){
return p1 p2;
}

ダンプ文字列は以下のようになった。
func:=unDump("55 8b ec 83 ec 40 53 56 57 8d 7d c0 b9 10 00 00 00 b8 cc cc cc cc f3 ab 8b 45 08 03 45 0c 5f 5e 5b 8b e5 5d c2 08 00")

関数として実行してみる
MsgBox,% DllCall(func,Int,100,Int,200,Int)

とりあえず動作した。
これだけでも、速度を要する処理を実行したいときに役立つかも知れない。
101KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08