5: 2008-12-23 (火) 23:01:36 |
6: 2008-12-23 (火) 23:01:36 |
| -こんなものです。パケットは[5 0 1 EAX]になります。同じように応用すればhelloももちろん作れます。 | | -こんなものです。パケットは[5 0 1 EAX]になります。同じように応用すればhelloももちろん作れます。 |
| -しかしこのままでは終了ファンクションと同じで大して面白くありません。面白いのはここからです。!5の後に、!6_504_0_!5_1_3_0...と続けることができます。つまりこういうことです。 | | -しかしこのままでは終了ファンクションと同じで大して面白くありません。面白いのはここからです。!5の後に、!6_504_0_!5_1_3_0...と続けることができます。つまりこういうことです。 |
- | EDI = 0; CALL([ESI]); DB(0x50, 0x56, 0xdf, 0x80, 0x51, 0x30, 0x32, 0x34, 0x36, 0x30); | + | EDI = 0; CALL([ESI]); DB(0x50, 0x56, 0xde, 0x80, 0x51, 0x30, 0x32, 0x34, 0x36, 0x30); |
- | -これは[5 0 !6 504 0 1 3 0 "246"][3]という意味になります(余計な!5は消しました)。!6_504_0_1_3というのが特別なもので、!6_504_0は「モード変更直接」、次の1が8bit配列モード、次の3が「文字数兼モード長」です。8bit配列モードになれば、数値をいちいちgh4でエンコードしなくていいのです。普通にcharで書けます。ちなみに文字数3の後の0は、ただのパディングですが、これは必ず0でなければいけません。適当な数値を入れると誤動作します。 | + | -これは[5 0 !6 488 0 1 3 0 "246"][3]という意味になります(余計な!5は消しました)。!6_488_0_1_3というのが特別なもので、!6_488_0は「モード変更直接」、次の1が8bit配列モード、次の3が「文字数兼モード長」です。8bit配列モードになれば、数値をいちいちgh4でエンコードしなくていいのです。普通にcharで書けます。ちなみに文字数3の後の0は、ただのパディングですが、これは必ず0でなければいけません。適当な数値を入れると誤動作します。 |
- | -しかし実は、機能番号5のフォーマットは、[5 slot (!6 504) mod (1) len str]となっています(mod=0の場合)。この()で囲まれた部分は、!5で打ち消さなければ自動で挿入される部分です。つまり自動挿入をあてにするなら、 | + | -しかし実は、機能番号5のフォーマットは、[5 slot (!6 488) mod (1) len str]となっています(mod=0の場合)。この()で囲まれた部分は、!5で打ち消さなければ自動で挿入される部分です。つまり自動挿入をあてにするなら、 |
| EDI = 0; CALL([ESI]); DB(0x50, 0x03, 0x32, 0x34, 0x36, 0x30); | | EDI = 0; CALL([ESI]); DB(0x50, 0x03, 0x32, 0x34, 0x36, 0x30); |
| -これで十分なのです。 | | -これで十分なのです。 |
| -また文字列といえば、C言語で見られるような、'\0'で終わるタイプもあります。つまり事前に文字数が分からないけど、ターミネータがあるからたどっていけば終端は分かる、というやつです。そういうのは、mod=1を使うと簡単に扱えます。 | | -また文字列といえば、C言語で見られるような、'\0'で終わるタイプもあります。つまり事前に文字数が分からないけど、ターミネータがあるからたどっていけば終端は分かる、というやつです。そういうのは、mod=1を使うと簡単に扱えます。 |
- | -mod=1のときの機能番号5のフォーマットは、[5 slot (!6 504) mod (1) (term) str]になります。ここでtermはデフォルトでは自動挿入ですが、自動挿入任せにすると0が入ります。まさに'\0'がターミネータですね。 | + | -mod=1のときの機能番号5のフォーマットは、[5 slot (!6 488) mod (1) (term) str]になります。ここでtermはデフォルトでは自動挿入ですが、自動挿入任せにすると0が入ります。まさに'\0'がターミネータですね。 |
| EDI = 0; CALL([ESI]); DB(0x50, 0x10, 0x32, 0x34, 0x36, 0x00, 0x30); | | EDI = 0; CALL([ESI]); DB(0x50, 0x10, 0x32, 0x34, 0x36, 0x00, 0x30); |
| -まだあります。mod=2/3にすると、strの部分が (!6 0) r に化けます(それ以外はmod=0/1と同じ)。これはどういうことかというと、パケットの中に文字列をおかずに、レジスタで指定したところに文字列を置けるのです。これが「モード変更間接」です。 | | -まだあります。mod=2/3にすると、strの部分が (!6 0) r に化けます(それ以外はmod=0/1と同じ)。これはどういうことかというと、パケットの中に文字列をおかずに、レジスタで指定したところに文字列を置けるのです。これが「モード変更間接」です。 |
- | -なんかもう疲れてきたので説明は適当になってきていますが(すみません)、このような(!6 504)の自動挿入は文字列を指定するような場所にはすべて設定されていて、たとえばfopenでファイル名指定するときなんかも、パケットの中にファイル名を埋め込むもよし、ポインタで指定するもよしの、何でもござれです。 | + | -なんかもう疲れてきたので説明は適当になってきていますが(すみません)、このような(!6 488)の自動挿入は文字列を指定するような場所にはすべて設定されていて、たとえばfopenでファイル名指定するときなんかも、パケットの中にファイル名を埋め込むもよし、ポインタで指定するもよしの、何でもござれです。 |
| | | |
| * こめんと欄 | | * こめんと欄 |