ret命令@リプレイ機能が搭載されたROのexeのコードスクランブル

2015年4月19日

これが実行出来ると色々便利という半強制的にタイトル画面に戻れるモード移行のファンクション。
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] ;

Ragnarok Online

Posted by redchat