解析の参考スレまとめ

解析の参考スレまとめ
[1] けい / 2012/03/30/Fri/22:29 (No.14336) /

  定期的にあげられているようなので、解析の参考になるスレをまとめてみた
問題があればすぐに削除します

■ プログラム改造のSSGの作り方
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=7227
簡単なアセンブリ言語の解説があります

■ 変動アドレスのSSGの作り方
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=4831
[13]で添付ファイルにある方法を覚えると、殆どのゲームで変動アドレスの基点にたどり着くことが出来るようになります

■ 自家用SSG
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=3237
[103]で多重ポインタの解析例があります

■ 【改造依頼】Arcanum Knights
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=13521
[6]で多重ポインタの解析例があります

■ 【改造依頼】 みらくる☆パーティ
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=13191
[34]〜[42]、[46]で多重ポインタの解析例、ASLRの有効なゲームでのSSGの作り方、ASLRの無効化方法の解説があります

■ 質問 ssgの書き方
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=272
多重ポインタに対応したSSGの書き方などが解説されています
実際のSSGの書き方はHow To SSGや既存のSSGを参考に自分で作ってみたほうがわかりやすいです

■その他に参考になるもの
DANAさんのHP(DANAの部屋)
響 舞名さんのHP(響 舞名のgdgd解析ページ)
うさぴょんさんのHP(Digital Travesia)と改造初心者向け練習用プログラム No1〜3


※最近の書き込みのみ参考にしているため、古いものは情報なし
 他にも良い情報が埋もれているはず
 

[2] けい / 2012/03/31/Sat/00:03 (No.14338) /

  以下、アセンブリの知識0の状態で自分なりに整理したもの
厳密には違うかもしれないけど、簡単な解析程度では問題なかった

■ オペランドについて
演算の対象となるもののこと
MOV EAX,EBXではEAXが第1オペランド、EBXが第2オペランドと呼ばれる
オペランドにはレジスタ、定数、メモリアドレスが使用される
※レジスタ・・・EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP、EIP、EFLAGSのこと

■ メモリアドレスの表記
[レジスタ]
[定数A]
[レジスタ+定数A]
[レジスタ+レジスタ]
[レジスタ+レジスタ*定数B]
[レジスタ+レジスタ*定数B+定数A]
など、[]で括って表記される
※定数Aは4byte(8桁)の任意の16進数
 定数Bは2、4、8のいずれか
 

[3] 素人A / 2012/03/31/Sat/00:55 (No.14339) /

  有難う御座います。  

[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として計算される
 

[5] けい / 添付 / 2012/03/31/Sat/12:19 (No.14352) /

  SSGのテンプレート  

[6] エロサイズ / 2012/04/01/Sun/06:01 (No.14378) /

  >>5
GJ
 

/ 戻る


- Web Topics ver 1.26 -