作成者 |
メッセージ |
|
|
ナナシ様、補足をありがとうごさいます。
以前、hira様と同様のお話をしたことがありました。
この実行権限を持つメモリ領域というのが面倒なんですよね。
ですが前に私が使っていたパソコンで、hira様の「関数を実行する」方法が動かなかったのに、この関数ポインタの方法で動いたんですよね。
実行権限を与えていないのに動くということは
私が使っていたパソコンにはセキリティが付いていないということですよね。
ますます、hira様のコードが動かない理由がわからなくなりました。
新しいパソコンではhira様のコードが動いているので単純にOSの問題かも知れませんね。
ナナシ様、補足をありがとうごさいます。
以前、hira様と同様のお話をしたことがありました。 この実行権限を持つメモリ領域というのが面倒なんですよね。
ですが前に私が使っていたパソコンで、hira様の「関数を実行する」方法が動かなかったのに、この関数ポインタの方法で動いたんですよね。 実行権限を与えていないのに動くということは 私が使っていたパソコンにはセキリティが付いていないということですよね。 ますます、hira様のコードが動かない理由がわからなくなりました。 新しいパソコンではhira様のコードが動いているので単純にOSの問題かも知れませんね。
|
|
|
投稿記事 |
Posted: 2005年9月09日(金) 12:47 |
|
|
|
|
|
・Windows XP Pro SP2 と Turion64 MT-30
・Windows XP Home SP2 と PentiumM 730
の組み合わせでデータ実行防止(DEP)が
作動することを確認しました。
(DEPの有効範囲を全プログラムに変更する必要あり)
その場合、次のようなコードに変更すると動くようになります。
コード: Dim asm[ELM(11)]=[&H55,&H8B,&HEC,&H8B,&H45,&H08,&H40,&HC9,&HC2,&H04,&H00] As Byte
Dim Inc As *Function(p1 As Long) As Long
'Inc=GlobalAlloc(GMEM_FIXED,11)
Inc=VirtualAlloc(NULL, 11, MEM_COMMIT, PAGE_EXECUTE_READWRITE) '追加
memcpy(Inc,asm,11)
Dim buf[255] As Byte
wsprintf(buf,"in=%d ret=%d",10,Inc(10))
'GlobalFree(Inc)
VirtualFree(Inc, 0, MEM_DECOMMIT or MEM_RELEASE) '追加
MessageBox(NULL,buf,"",0)
※データ実行防止
OSとCPUが両方対応している場合のみ有効です。
詳しくは http://www.google.co.jp/search?q=%E3%83 ... 2%E6%AD%A2
・Windows XP Pro SP2 と Turion64 MT-30 ・Windows XP Home SP2 と PentiumM 730 の組み合わせでデータ実行防止(DEP)が 作動することを確認しました。 (DEPの有効範囲を全プログラムに変更する必要あり) その場合、次のようなコードに変更すると動くようになります。
[code]Dim asm[ELM(11)]=[&H55,&H8B,&HEC,&H8B,&H45,&H08,&H40,&HC9,&HC2,&H04,&H00] As Byte Dim Inc As *Function(p1 As Long) As Long 'Inc=GlobalAlloc(GMEM_FIXED,11) Inc=VirtualAlloc(NULL, 11, MEM_COMMIT, PAGE_EXECUTE_READWRITE) '追加 memcpy(Inc,asm,11) Dim buf[255] As Byte wsprintf(buf,"in=%d ret=%d",10,Inc(10)) 'GlobalFree(Inc) VirtualFree(Inc, 0, MEM_DECOMMIT or MEM_RELEASE) '追加 MessageBox(NULL,buf,"",0) [/code]
※データ実行防止 OSとCPUが両方対応している場合のみ有効です。 詳しくは[url]http://www.google.co.jp/search?q=%E3%83%87%E3%83%BC%E3%82%BF%E5%AE%9F%E8%A1%8C%E9%98%B2%E6%AD%A2[/url]
|
|
|
投稿記事 |
Posted: 2005年9月05日(月) 00:04 |
|
|
|
|
|
プログラムにマシン語を埋め込んでみます。
ただし、マシン語とは言っても、
いわゆるプロシージャのみとなりますが。。。
まず、MASM32なんかでプロシージャ形式のマシン語の羅列を作成します。
※拡張子がBINのヤツに変換、リンカは16bit版でないとダメなようですが。。。
コード:
Dim asm[ELM(11)]=[&H55,&H8B,&HEC,&H8B,&H45,&H08,&H40,&HC9,&HC2,&H04,&H00] As Byte
続いて関数ポインタを作成します。
パラメータの個数や型はアセンブラで定義したものを指定。
このサンプルではパラメータに指定した値に+1(インクリメント)する関数です。
コード:
Dim Inc As *Function(p1 As Long) As Long
Inc=GlobalAlloc(GMEM_FIXED,11)
memcpy(Inc,asm,11)
Dim buf[255] As Byte
wsprintf(buf,"in=%d ret=%d",10,Inc(10))
GlobalFree(Inc)
MessageBox(NULL,buf,"",0)
P.S.
関数ポインタが導入されたのでお試し程度に作ってみたら
上手く動きました。
アセンブラをつついてみてコンパイラを作成することが如何に大変か
身にしみて分かりました。
そういう意味でも、ActiveBasicに感謝です。
プログラムにマシン語を埋め込んでみます。
ただし、マシン語とは言っても、 いわゆるプロシージャのみとなりますが。。。
まず、MASM32なんかでプロシージャ形式のマシン語の羅列を作成します。 ※拡張子がBINのヤツに変換、リンカは16bit版でないとダメなようですが。。。 [code] Dim asm[ELM(11)]=[&H55,&H8B,&HEC,&H8B,&H45,&H08,&H40,&HC9,&HC2,&H04,&H00] As Byte [/code]
続いて関数ポインタを作成します。 パラメータの個数や型はアセンブラで定義したものを指定。 このサンプルではパラメータに指定した値に+1(インクリメント)する関数です。
[code] Dim Inc As *Function(p1 As Long) As Long Inc=GlobalAlloc(GMEM_FIXED,11) memcpy(Inc,asm,11) Dim buf[255] As Byte wsprintf(buf,"in=%d ret=%d",10,Inc(10)) GlobalFree(Inc) MessageBox(NULL,buf,"",0) [/code]
P.S. 関数ポインタが導入されたのでお試し程度に作ってみたら 上手く動きました。
アセンブラをつついてみてコンパイラを作成することが如何に大変か 身にしみて分かりました。
そういう意味でも、ActiveBasicに感謝です。
|
|
|
投稿記事 |
Posted: 2005年9月04日(日) 14:28 |
|
|
|
|