[4] けい / 2012/03/31/Sat/11:29 (No.14348) /
| |
アセンブリ命令について、ゲームの解析に最低限覚えておいたほうがいいと思うものをまとめてみた おかしいところがたくさんあると思うけれど、この程度の理解でうさみみで解析する分には問題なかった
厳密にはIntelの命令セットを参考に!
■ プログラム改造でよく弄る命令 ADD op1,op2・・・op1'=op1+op2 SUB op1,op2・・・op1'=op1-op2 INC op・・・op'=op+1 DEC op・・・op'=op-1 MOV op1,op2・・・op1'=op2 LEA op1,[op2]・・・op1'=op2 AND op1,op2・・・op1'=op1とop2のbit単位での論理積 OR op1,op2・・・op1'=op1とop2のbit単位での論理和 XOR op1,op2・・・op1'=op1とop2のbit単位での排他的論理和 JMP op・・・opの示す命令アドレスにプログラムの制御を移す CMP・・・後述
■ CMP命令 CMP op1,op2・・・op1とop2を比較し、以下に示す条件分岐に繋がる JA op3・・・op1>op2のとき(符号なし)、op3にジャンプ JG op3・・・op1>op2のとき(符号付き)、op3にジャンプ JNB op3・・・op1≧op2のとき(符号なし)、op3にジャンプ JGE op3・・・op1≧op2のとき(符号付き)、op3にジャンプ JE op3・・・op1=op2のとき、op3にジャンプ JB op3・・・op1<op2のとき(符号なし)、op3にジャンプ JL op3・・・op1<op2のとき(符号付き)、op3にジャンプ JBE op3・・・op1≦op2のとき(符号なし)、op3にジャンプ JLE op3・・・op1≦op2のとき(符号付き)、op3にジャンプ JNZ op3・・・op1≠op2のとき、op3にジャンプ
■ ESPの変動する命令でよく使うもの PUSH op・・・後述 POP op・・・後述 LEAVE・・・後述 CALL op・・・CALL命令の次の命令のアドレス(EIPの値)をPUSHし、opにジャンプ RET・・・POPして得られたアドレスにジャンプ(CALL命令の次の命令に戻る)
・PUSH命令は次の命令に置き換え可能 SUB ESP,4 MOV [ESP],op
・POP命令は次の命令に置き換え可能 MOV op,[ESP] ADD ESP,4
・LEAVE命令は次の命令に置き換え可能 MOV ESP,EBP POP EBP
■ 個人的にプログラム改造で何度か弄ったことのある命令 MOVZX op1,op2・・・op2をより大きなサイズのop1にゼロ拡張して代入する(BYTE→DWORDなど) MOVSX op1,op2・・・op2をより大きなサイズのop1に符号拡張して代入する(BYTE→DWORDなど) SHL op1,op2・・・op1'=op1*(2^op2) ※op2はCLまたは定数 SAR op1,op2・・・op1'=op1/(2^op2) ※op2はCLまたは定数 符号付き SHR op1,op2・・・op1'=op1/(2^op2) ※op2はCLまたは定数 符号なし NEG op・・・opの符号反転 TEST op1,op2・・・理解できていない点が多いため、省略
例)EAX=0x00500000、EBX=0x00020000、0x00540004のアドレスに0x00000064が格納されているとき
MOV EAX,DWORD PTR [EAX+EBX*2+4] の結果はEAX=0x00000064
これに対し、 LEA EAX,[EAX+EBX*2+4] の結果はEAX=0x00540004
※符号とは10進数に直したときの+/-のこと 0xFFをbyteで扱う場合、符号なしでは255、符号ありでは-1として計算される |
|
|