アセンブラの処理
:
ラナルータ
:2014/11/16(日) 16:51:20関連スレ
基本的なCheatEngineの設定
初歩的なCheatEngineの使い方
基本的なCheatEngineの使い方
32bitレジスタ:
eax ecx edx ebx esp ebp esi ediとか色々あります
ただの変数だと思ってくれればOK
espとebpは特殊です...
eaxは基本的に返り値を保持します
ecxは基本的にクラスポインタやらとして
関数call前にecxにポインタをいれてcallされます
espはスタックです
リターンアドレスとかを保持します
pushやらされるごとに値が-4されます。
なので関数の最後にadd esp,xxとかやってesp値をきちんと
リターンアドレスを指すところまで持ってきて
関数を終了させるんです。
ret 0004はリターンアドレスに処理を移した後に?esp値を+4します
だいたい
[esp+xx]で参照されます
callが行われた時にesp値が-4されそこにcallの直後のアドレス
(リターンアドレス)が書き込まれます
push リターンアドレス
jmp call先って書き換えても同じ処理をしてくれます。(便利)
関数の開始位置が
push FFのものはespを多用し
push ebpから始まるものはebpを多用します!
push ebpのほうは
関数の終わりが
mov esp,ebp
pop ebp
ret xxで終わります
こちらのタイプの関数はebpがespの値を変わらずに保持しているため
どの位置でも
この処理をぶち込むことで関数を途中でやめさせれますよ...ウホ
[eax]とか[アドレス]とかについて
[]がつくとeaxの値ではなくeaxの値のアドレスが保持しているメモリを指します
cmp dword [eax],XXXXXXXXだとeaxのメモリとXXXXXXXXを比較します
wordなら2bytesの比較
byteなら1byteの比較というようになっております
ここで重要なのが
メモリ同士の比較はできないってこと...
cmp [eax],[ebx]とかはできません
絶対に片方はレジスタに値を代入するか直接値として比較するしかありません(だからレジスタが必要なんですね!!)
intel CPUの仕様です。終わり
よくある
cmp命令とは...左と右の奴を比較します。終わりフラグがなんとかいったけど知らない。。。
cmp命令のすぐ近くにはだいたい
je jne jb jaとかあります
まぁMemory Viewerの下に説明でるんでさすがに説明するまでもない
test eax,eax
je xxxxxxxとかよくある処理について
test eax,eaxはeaxが0のときjeの先に処理が移ります(これだけ覚えればOK)
スタックについて
push したレジスタを順番にpopしなければならないというのは間違いです
push eax
push ebx
pop eax
pop ebx
こうなっていると
push eaxで[esp]にeaxの値を書き込み esp-4されます
push ebxで[esp]にebxを書き込みます esp-4されます
pop eaxで[esp]の値をとってきますなのでeaxに[esp] = ebxの値が代入されます esp+4されます
pop ebxで[esp]の値をとってきますなのでebxに[esp] = eaxの値が代入されます esp+4されます
まぁこんな感じです
大体理解できたよね!スタックが理解できないとこの先に進むのは難しい...
push 引数3
push 引数2
push 引数1
mov ecx,[ポインタ]
call 関数
cmp eax,値//返り値の比較処理とか...
je...
ってかんじで大体関数が呼ばれるのですよ
call先に処理が移った時点で
[esp] = リターンアドレス
[esp+4] = 引数1つ目の値
[esp+8] = 引数2つ目の値...
というようになるんです
つまりスタックさえ理解すれば
関数の中の処理で
引数の何番目をどこでつかっているなぁとか分かるんです
(関数の開始地点にBPしかけ解除し
関数の終了地点にBPをしかけ
かつesp+xxのメモリにBreakPoint設置(ACCESS)
んでF9で処理を進めると
値を使うところで処理が止まる.
便利。)
やったぜ。
関数の直後にeaxの比較処理や
mov ebx,eax
cmp ebx,xxxとかいうように一旦別のレジスタに代入して比較しているような処理がある場合
関数の返り値/戻り値を使用する処理があるということなので
注意が必要
仮に物理攻撃を食らう関数にエラーコードとかが決められていたり
チート行為を検出するために何らかの値を返す設定だった場合に
比較処理後にA/Bをするようなものを追加することは容易です
なので関数だけではなく関数を呼んだ後の処理にも注意が必要ってこと...
まぁどうでもいいけどな...
覚えてよくと良い処理
push
pop
mov
cmp
call
jmp
lea
add
sub
xor
or
and
これだけ覚えればOK
基本処理だけでどうにかなる
ググレカス
基本的なCheatEngineの設定
初歩的なCheatEngineの使い方
基本的なCheatEngineの使い方
32bitレジスタ:
eax ecx edx ebx esp ebp esi ediとか色々あります
ただの変数だと思ってくれればOK
espとebpは特殊です...
eaxは基本的に返り値を保持します
ecxは基本的にクラスポインタやらとして
関数call前にecxにポインタをいれてcallされます
espはスタックです
リターンアドレスとかを保持します
pushやらされるごとに値が-4されます。
なので関数の最後にadd esp,xxとかやってesp値をきちんと
リターンアドレスを指すところまで持ってきて
関数を終了させるんです。
ret 0004はリターンアドレスに処理を移した後に?esp値を+4します
だいたい
[esp+xx]で参照されます
callが行われた時にesp値が-4されそこにcallの直後のアドレス
(リターンアドレス)が書き込まれます
push リターンアドレス
jmp call先って書き換えても同じ処理をしてくれます。(便利)
関数の開始位置が
push FFのものはespを多用し
push ebpから始まるものはebpを多用します!
push ebpのほうは
関数の終わりが
mov esp,ebp
pop ebp
ret xxで終わります
こちらのタイプの関数はebpがespの値を変わらずに保持しているため
どの位置でも
この処理をぶち込むことで関数を途中でやめさせれますよ...ウホ
[eax]とか[アドレス]とかについて
[]がつくとeaxの値ではなくeaxの値のアドレスが保持しているメモリを指します
cmp dword [eax],XXXXXXXXだとeaxのメモリとXXXXXXXXを比較します
wordなら2bytesの比較
byteなら1byteの比較というようになっております
ここで重要なのが
メモリ同士の比較はできないってこと...
cmp [eax],[ebx]とかはできません
絶対に片方はレジスタに値を代入するか直接値として比較するしかありません(だからレジスタが必要なんですね!!)
intel CPUの仕様です。終わり
よくある
cmp命令とは...左と右の奴を比較します。終わりフラグがなんとかいったけど知らない。。。
cmp命令のすぐ近くにはだいたい
je jne jb jaとかあります
まぁMemory Viewerの下に説明でるんでさすがに説明するまでもない
test eax,eax
je xxxxxxxとかよくある処理について
test eax,eaxはeaxが0のときjeの先に処理が移ります(これだけ覚えればOK)
スタックについて
push したレジスタを順番にpopしなければならないというのは間違いです
push eax
push ebx
pop eax
pop ebx
こうなっていると
push eaxで[esp]にeaxの値を書き込み esp-4されます
push ebxで[esp]にebxを書き込みます esp-4されます
pop eaxで[esp]の値をとってきますなのでeaxに[esp] = ebxの値が代入されます esp+4されます
pop ebxで[esp]の値をとってきますなのでebxに[esp] = eaxの値が代入されます esp+4されます
まぁこんな感じです
大体理解できたよね!スタックが理解できないとこの先に進むのは難しい...
push 引数3
push 引数2
push 引数1
mov ecx,[ポインタ]
call 関数
cmp eax,値//返り値の比較処理とか...
je...
ってかんじで大体関数が呼ばれるのですよ
call先に処理が移った時点で
[esp] = リターンアドレス
[esp+4] = 引数1つ目の値
[esp+8] = 引数2つ目の値...
というようになるんです
つまりスタックさえ理解すれば
関数の中の処理で
引数の何番目をどこでつかっているなぁとか分かるんです
(関数の開始地点にBPしかけ解除し
関数の終了地点にBPをしかけ
かつesp+xxのメモリにBreakPoint設置(ACCESS)
んでF9で処理を進めると
値を使うところで処理が止まる.
便利。)
やったぜ。
関数の直後にeaxの比較処理や
mov ebx,eax
cmp ebx,xxxとかいうように一旦別のレジスタに代入して比較しているような処理がある場合
関数の返り値/戻り値を使用する処理があるということなので
注意が必要
仮に物理攻撃を食らう関数にエラーコードとかが決められていたり
チート行為を検出するために何らかの値を返す設定だった場合に
比較処理後にA/Bをするようなものを追加することは容易です
なので関数だけではなく関数を呼んだ後の処理にも注意が必要ってこと...
まぁどうでもいいけどな...
覚えてよくと良い処理
push
pop
mov
cmp
call
jmp
lea
add
sub
xor
or
and
これだけ覚えればOK
基本処理だけでどうにかなる
ググレカス
:
mahorori
:2014/11/17(月) 13:31:53:
ラナルータ
:2014/11/17(月) 18:24:53
javascript無効化してるとコメントが適用されない場合があります。
特殊タグ一覧。
画像貼り付け:[IMG]画像のURL[/IMG]
動画貼り付け:[VIDEO]YoutubeのURL[/VIDEO] Pastebin貼り付け:[CODE]PastebinのURL[/CODE]
特殊タグ一覧。
画像貼り付け:[IMG]画像のURL[/IMG]
動画貼り付け:[VIDEO]YoutubeのURL[/VIDEO] Pastebin貼り付け:[CODE]PastebinのURL[/CODE]