反射が晒されましたね

ついに反射が!

2ちゃんねるしか見てないんで他の状況は知りませんが盛り上がっていますね。
みなさん口が硬いようで、ここまでよく誰も晒さなかったなーって感じです。
ちょうどミラーマンも使えなくなりそうなのでグッドタイミングなのでしょうか?
これにより解析はじめた人たちにとってはきっと今がとても楽しいのではないかと思います。
コツを掴めばそれほど難しくないので是非この機会にいろいろ身に付けることをおすすめします。
そうすれば他のゲームでもどんどん応用して楽しめるはずです。
反射が晒されたということは、他のチートもこれからどんどん出てくると思いますよ。

少しだけ説明してみる

454 :ネトゲ廃人@名無し:2010/10/03(日) 12:48:32 ID:???
>>427
結構まともなところに着眼する人もいるんだね
空振りする理由は非常に簡単

このスレに晒されてる反射は
元の
PUSH ECX
PUSH EDX
PUSH 2  /*敵の攻撃

PUSH EDX
PUSH ECX
PUSH 1 /*自分の攻撃
にして、敵が実行するはずの攻撃処理を
自分の攻撃処理に置き換えてるわけだから、
当然敵の攻撃速度>自分の攻撃速度 の場合は
連続で反射出来ないと思うよ
攻撃間隔は蔵管だけどステータスは鯖管だから
SPD低いと反射がうまく成功しないのはガチ

上の文章は2ちゃんねるからの引用です。
わかってる人には「あたりまえの事言ってんじゃねーよ」って感じかもしれませんが簡単に説明します。
まず、ECXやEDXってのはレジスタの名前です。レジスタが何かkwsk知りたい人はggrksです。
単純に言うとCPUの中にあるメモリーです。ふつうのメモリーは仮想的に考えれば、ほぼ無制限に扱えますがレジスタは容量と個数があるので無制限とはいきません。しかし、CPUに近いので高速にアクセスできます。
また、CPUが扱える命令にはレジスタを使わなければ行えない命令が多く存在します。
この場合は単純にECXなどのレジスタに何かデータ(数値)が入っていると思えばいいです。
PUSH命令は上の例だとECX中のデータや2とか1とかそういうのをスタック領域に保存している命令です。
スタックがなんなのかはggrばすぐ出ると思います。CPUが扱うスタック領域は単なるスタック用に確保されたメモリー空間です。


なぜ、保存するのか?これがポイントです。
おそらくこの命令のすぐ後にCALL命令があると思います。
CALL命令はプログラミング言語において関数やサブルーチンなどで決まって出てくる命令です。(例外としてCALL命令に置き換わらない場合もあります。インライン化された場合など)
CALL命令は他の処理に移動する命令であり、通常その処理が終わればCALL命令の後に戻ってきます。
つまり、CALL命令で何か処理を行っているということです。


CALL命令の前のPUSH命令でスタック領域に何か保存しましたね。
保存した理由はCALL先の処理でそのデータを扱う必要があるためです。
また、スタック領域に保存する代わりに使っていないレジスタに保存する場合もあるので注意してみる必要があります。
CALL命令の前にある「MOV EAX, 1」などの命令も見落とさないようにしましょう。このとき、EAXやEDXが使われることが多いですが、どのレジスタを使うかは特に決まっているものではありません。
デバッガー等使ってればそれほど気にする必要はないかもしれませんが。。
これらがC言語などでいうところの「関数に引数を渡した」という箇所にあたります。
引数以外に戻り先のアドレスもPUSHしていると思います。これは単にCALL先から戻ってくるために必要なので保存しているだけです。


CALL先の処理で何をしているのかは上の改造でどう変わったかでなんとなくわかると思います。ここが一番重要なわけですね。
上の例のEDX、ECXには「攻撃対象」と「だれが攻撃した」かの識別するための数値(単純に0とか5とか)が入っています。
改造後にそれを逆にしている理由もうなずけます。
それを考えるとPKも簡単そうだって?まさかねーーww


とまぁ、やっていることはとても単純ですが、結果としてゲーム内では通常は起きないことを起こせるわけです。
おもしろいものですね。
簡単な改造のポイントは小さな命令の単位で見るのではなく、大きな一つの処理に注目することです。
複雑な処理はブラックボックスになっていると考え、そのインターフェイスをちょっと弄ればいいだけです。
もっと複雑な事をする場合も、これとほとんど変わりません。必要な箇所だけを的確に弄ってやればいいのだから。
おっと、ちょっといろいろ言い過ぎましたかね?