ret命令@リプレイ機能が搭載されたROのexeのコードスクランブル
これが実行出来ると色々便利という半強制的にタイトル画面に戻れるモード移行のファンクション。
CGameModeのインスタンスはグローバルにあるので容易に実行することが出来る。
が、このコードもコードスクランブルの煽りを受けてスパゲッティ状態である。
アセンブリコードを記事に載せる手軽で居まい方法が思いつかないので取りあえずハイライターで…
2011-12-01aRagexe.exe
CGameMode__Zc_Restart_Ack: F006d1d20: 006d1d20 8b442404 mov eax,dword [esp+004h] 006d1d24 80780201 cmp byte [eax+002h],byte 001h 006d1d28 7527 jnz C006d1d51 006d1d2a e8a1b7f8ff call near F0065d4d0 ; CRagConnection__instanceR 006d1d2f 8bc8 mov ecx,eax 006d1d31 e85aaef8ff call near F0065cb90 ; CConnection__Disconnect 006d1d36 689c517e00 push dword S007e519c ; "login.rsw" 006d1d3b 6a00 push byte +000h 006d1d3d b9f8718300 mov ecx,dword L008371f8 ; CModeMgr__g_modeMgr 006d1d42 c705b44d840005000000 mov dword [L00844db4],dword 000000005h ; g_loginStartMode 006d1d4c e89f8be7ff call near F0054a8f0 ; CModeMgr__Switch C006d1d51: 006d1d51 c20400 ret word 00004h
セミコロン以降のコメントを見れば理解可能かと思います。 上記のコードがスクランブルされると以下のように変更され、これも恐らくビルド毎にランダムで形状が決定します。
2012-8-21data_gm_r_Ragexe.exe
CGameMode__Zc_Restart_Ack: C0098ec4b: 0098ec4b 8b442404 mov eax,dword [esp+004h] 0098ec4f 80780201 cmp byte [eax+002h],byte 001h 0098ec53 0f85b8a7d6ff jnz near C006f9411 0098ec59 e900000000 jmp near C0098ec5e ;; goto C0098ec5e: 0098ec5e 68ef936f00 push dword C006f93ef ; return __address@warp0; 0098ec63 e978eaceff jmp near F0067d6e0 ; CRagConnection__instanceR ;; goto C0098ec68: 0098ec68 8d642408 lea esp,[esp+008h] ; same to ret code. 0098ec6c ff6424f8 jmp dword [esp-008h] ; C0098ec70: 0098ec70 8bc8 mov ecx,eax ; cex = CRagConnection Instance; 0098ec72 68f6936f00 push dword L006f93f6 0098ec77 e914e1ceff jmp near F0067cd90 ;CConnection__Disconnect ;; goto C0098ec7c: 0098ec7c 68c0378200 push dword S008237c0 ; 'login.rsw' 0098ec81 6a00 push byte +000h 0098ec83 b9f8a28700 mov ecx,dword L0087a2f8 ; CModeMgr__g_modeMgr 0098ec88 e9463c0600 jmp near C009f28d3 ;; goto C009f28d3: 009f28d3 c705388a880005000000 mov dword [L00888a38],dword 000000005h ; g_loginStartMode = 05h 009f28dd 6811946f00 push dword C006f9411 ; return address@warp 009f28e2 e9f90eb7ff jmp near C005637e0 ; CModeMgr__Switch ;; overfunc C006f9411: 006f9411 eb80 jmp short C006f9393 ;; goto C006f9393: 006f9393 e9d0582900 jmp near C0098ec68 ;; goto
前回の記事と合わせれば読み解くのは大して難しくはない代わりに、コードを追わずに上から読み流すと色々填まります。
lea esp,[esp+008h] ; same to ret code. jmp dword [esp-008h] ;
ディスカッション
コメント一覧
まだ、コメントがありません