続 triggerで直死

CATEGORYmugen記述
COMMENT0
http://samsara01.blog.fc2.com/blog-entry-22004.html
大体言いたいことはオキ氏が言ってるけど、私の方でも説明しとくとvar(60)やfvar(40)の発展型ですね
アレって()内で指定した数値をチェックする処理が間違ってるのが原因なんですけど、そもそもチェック処理自体を消せばvar(100)やらvar(-100)やらを指定できるようになる

なので
[state ]
type=null
trigger1=var(-7):=0
とすると自分のaliveに0が書き込まれる

欠点としては、自分のvar(0)を基準にしか見れないことだけど、上手く引数に渡す値を調整してやれば一応任意のアドレスも見れる
もっと言うと0x407E8Eをmov [ebx],ediに置き換えれば引数に渡した値をそのままアドレスと見なせる
そこまでやると普通の用途には使いづらいけどね

続きで実現方法について雑に解説

<追記>
任意アドレス見るならdrab氏が言ってる奴の方がいいかと
http://drabs.blog40.fc2.com/blog-entry-1670.html


まず手順について文章で書く
varの引数チェックしてる部分の処理をnop辺りに書き換えることになるんだけど、その部分のコードは書換不可能になってて通常では書き換え不可能
じゃあどうするかっていうとVirtualProtectを使用する
コイツを使うと無理やり書換可能にできるんで、VirtualProtectで権限変更→引数チェック処理削除 とすることで処理を書き換えることが可能


次、コードの解説
私が組んだコードの解説してもいいけどHecate Scarletのパクりなのでそっちを解説します
関数の用途とか引数とかに関してはここに書いてあるので省略
https://msdn.microsoft.com/ja-jp/library/cc429129.aspx
https://msdn.microsoft.com/ja-jp/library/cc429133.aspx
https://msdn.microsoft.com/ja-jp/library/cc430214.aspx

VirtualProtectの第3引数に指定するアクセス権限の値については書いてないんでそこだけ書いとく
PAGE_READONLY(0x02) :実行×、読込〇、書込×
PAGE_READWRITE(0x04) :実行×、読込〇、書込〇
PAGE_WRITECOPY(0x08) :実行×、読込〇、書込〇(書込時コピー作成)
PAGE_EXECUTE(0x10) :実行〇、読込×、書込×
PAGE_EXECUTE_READ(0x20) :実行〇、読込〇、書込×
PAGE_EXECUTE_READWRITE(0x40):実行〇、読込〇、書込〇
PAGE_EXECUTE_WRITECOPY(0x80):実行〇、読込〇、書込〇(書込時コピー作成)


以下、Hecate Scarletのコード貼る
mov dword ptr [4b4464],74726956
mov dword ptr [4b4468],506c6175
mov dword ptr [4b446c],65746f72
mov dword ptr [4b4470],7463
push 49f604
call [49f0b8]
push 4b4464
push eax
call [49f130]
push eax
push 4b4474
push 40
push 8f000
push 410000
call eax
pop eax
mov dword ptr [424ef0],909090e9
mov ecx,ebx
sub ecx,424ef0
sub ecx,5
mov dword ptr [424ef4],90909090
mov [424ef1],ecx
push 4b4474
push 20
push 8f000
push 410000
call eax


mov dword ptr [4b4464],74726956
mov dword ptr [4b4468],506c6175
mov dword ptr [4b446c],65746f72
mov dword ptr [4b4470],7463

文字列"VirtualProtect"を0x4b4464に埋め込む

push 49f604
call [49f0b8]

関数GetModuleHandleを実行し、KERNEL32のハンドルを取得する
第1引数として文字列"KERNEL32"が埋め込まれているアドレスを指定
実行後eaxにKERNEL32のハンドルのアドレスが代入される

push 4b4464
push eax
call [49f130]

関数GetProcAddressを実行し、関数VirtualProtectのアドレスを取得
第1引数としてKERNEL32のハンドルを、第2引数として文字列"VirtualProtect"が埋め込まれているアドレスを指定
実行後eaxに関数VirtualProtectのアドレスが代入される

push eax
push 4b4474
push 40
push 8f000
push 410000
call eax
pop eax

関数VirtualProtectを実行し、アクセス権限を変更する
第1引数に0x410000を、第2引数に0x8f000を、第3引数に0x40を、第4引数に0x4b4474を指定
実行後、アクセス権限の書き換えが成功した場合eaxに0以外が、失敗した場合0が代入される
ここで書き換え先の権限を書換不可→書換可能に変更してる
このコードの場合戻り値は捨ててますね

mov dword ptr [424ef0],909090e9
mov ecx,ebx
sub ecx,424ef0
sub ecx,5
mov dword ptr [424ef4],90909090
mov [424ef1],ecx

ここでmugen本体の処理を書き換えてる
よく読んでないから知らんけど、どっかをいい感じに書き換えて自作したコード読み込ませてるっぽい

push 4b4474
push 20
push 8f000
push 410000
call eax

もう一度VirtualProtectを実行
今度はアクセス権限を0x20(書き換え不可)に変更してる


以上
説明下手だったら申し訳
引数チェックしてる箇所はhttp://sinomugen.blog.fc2.com/blog-entry-186.htmlに書いたんでここを全部nopに置き換えればOK
面倒だったらコードテンプレをパクればいいんじゃないですかね

0 Comments

There are no comments yet.

Leave a comment