XREA.COM Logo XREA.COM Ad

管理人の雑記

45管理人 ★:2007/03/27(火) 20:51:46
機械語で関数を埋め込んでマルチスレッド実行

CreateThreadというAPIでマルチスレッド処理を行えるらしい。
機械語で埋め込んだ関数を渡してマルチスレッド実行させてみることに。

とりあえず、MessageBoxAを表示する処理を別スレッド実行させてみる。
まず、C言語で関数を作る。
表示する文字列とMessageBoxAのアドレスは、適当な数値として埋め込んでおいて、実行時に書き換えなくてはならないので面倒くさい。

DWORD WINAPI ThreadFunc(LPVOID){
char *volatile m1=(char*)0x11111111;
char *volatile m2=(char*)0x22222222;
void *volatile f1=(void*)0x33333333;
((int (WINAPI *)(HWND,LPCTSTR,LPCTSTR,UINT))(f1))( NULL, m1, m2, MB_OK );
return 0;
}

ダンプしたものを埋め込んで、必要な部分を置換する。

tf:=unDump("55 8b ec 83 ec 4c 53 56 57 8d 7d b4 b9 13 00 00 00 b8 cc cc cc cc f3 ab c7 45 fc 11 11 11 11 c7 45 f8 22 22 22 22 c7 45 f4 33 33 33 33 8b f4 6a 00 8b 45 f8 50 8b 4d fc 51 6a 00 ff 55 f4 3b f4 e8 00 00 00 00 33 c0 5f 5e 5b 83 c4 4c 3b ec e8 00 00 00 00 8b e5 5d c2 04 00")

s2=Title
s1=this is test message
hUser32:=DllCall("LoadLibrary",Str,"user32.dll",UInt)
pMessageBox:=DllCall("GetProcAddress",UInt,hUser32,Str,"MessageBoxA",UInt)

sInt(pStruct,offset,val){
DllCall("kernel32.dll\RtlMoveMemory", "UInt",pStruct offset, "UIntP",val, "Int",4)
}
sInt(tf,27,&s1)
sInt(tf,34,&s2)
sInt(tf,41,pMessageBox)

実行してみる
#Persistent
th:=DllCall("kernel32.dll\CreateThread",UInt,0,UInt,0,UInt,tf,UInt,0,UInt,0,UIntP,tid,UInt)

とりあえず、それらしい動作になった。
応用すれば、COMのメソッドを別スレッドで呼び出してイベントをSendMessageでメインスレッドに通知してスクリプトで処理するというようなことも可能になるかも。かなり強引だが。
101KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08