マシン語を走らせる

オープンソース形式でコードを共有するフォーラムです。お役立ちコード、あなたも投稿してみませんか?
返信する
メッセージ
作成者
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

マシン語を走らせる

#1 投稿記事 by NoWest »

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

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

まず、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に感謝です。
ナナシ
記事: 11
登録日時: 2005年6月19日(日) 21:21
お住まい: 石川県
連絡する:

#2 投稿記事 by ナナシ »

・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
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#3 投稿記事 by NoWest »

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

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

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