ab.com コミュニティ
https://www.activebasic.com/forum/

マシン語を走らせる
https://www.activebasic.com/forum/viewtopic.php?t=308
ページ 11

作成者:  NoWest [ 2005年9月04日(日) 14:28 ]
記事の件名:  マシン語を走らせる

プログラムにマシン語を埋め込んでみます。

ただし、マシン語とは言っても、
いわゆるプロシージャのみとなりますが。。。

まず、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に感謝です。

作成者:  ナナシ [ 2005年9月05日(月) 00:04 ]
記事の件名: 

・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

作成者:  NoWest [ 2005年9月09日(金) 12:47 ]
記事の件名: 

ナナシ様、補足をありがとうごさいます。

以前、hira様と同様のお話をしたことがありました。
この実行権限を持つメモリ領域というのが面倒なんですよね。

ですが前に私が使っていたパソコンで、hira様の「関数を実行する」方法が動かなかったのに、この関数ポインタの方法で動いたんですよね。
実行権限を与えていないのに動くということは
私が使っていたパソコンにはセキリティが付いていないということですよね。
ますます、hira様のコードが動かない理由がわからなくなりました。
新しいパソコンではhira様のコードが動いているので単純にOSの問題かも知れませんね。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/