Grand Theft Autoにワイドスクリーン許可を追加する

画像

30行のjavascriptプログラミングに関する一連の投稿を見て、私も30行ではなく、楽しみのために最小限の時間を費やして何かを書きたかったのです。 Windows用の古典的なGrand Theft Autoのインストーラーがダウンロードされました。 このGTAはアスペクト比4:3の標準解像度でのみ機能します。モニターのネイティブ解像度(1920x1080)で起動するプラグインを作成することにしました。






プラグインの直接記述を開始する前に、何らかの方法でプラグインをゲームにロードする必要があります。 このために、私はユニバーサルASI Loaderを使用します。 GTA 1-ゲームは非常に古いため、 ddraw.dllを使用するのが最良のオプションですGrand Theft Auto.exeが16進エディターを介してこのライブラリーを実際に使用していることを確認できます。





アーカイブの内容をGrand Theft Auto \ WINOフォルダー(実行可能ファイルのあるフォルダー)にコピーし、 dinput8.dll (ASI Loader)の名前をddraw.dllに変更します 。 ゲームが低解像度で起動することを知って、同じフォルダーに空のwndmode.iniファイルを作成します。 なぜなら ASI Loaderにはwndmode.dllが含まれていますが 、これはすでにハブで言及されていますが、wndmode.iniファイルがある場合は、ウィンドウにGTAが表示されます。



最初の起動時に、テストプラグインはすべてが機能していることを報告します。独自に作成することもできます。

画像



次の形式でゲームメニューが開きました。





そして、最小化するとゲームがクラッシュし、ウィンドウモードを拒否する必要があることが判明したため、 wndmode.iniが削除されました。 スクリプトフォルダも不要なため削除されました。 もう一度ゲームを開始します。最小化/展開してもクラッシュしません。次のようになります。





当然、2013年の1024x768は私に合わないので、 Visual Studioで新しいWin32プロジェクト作成します。タイプはDLLであり、公開するプロパティでは:





プラグインの基礎:

#include "stdafx.h" #include "CPatch.h" DWORD WINAPI Thread(LPVOID param) { return 0; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) { if (reason == DLL_PROCESS_ATTACH) { HANDLE HndThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Thread, NULL, 0, NULL); } return TRUE; }
      
      







次に、現在の画面解像度の値を格納しているメモリアドレスを見つける必要があります。 彼らの助けを借りて、この値が記録されている関数を見つけて、この記録を自分のものに置き換えることができます。 ゲームを起動してF11キーを押すと、画面の解像度を変更できます。





デフォルトでは、 1024x768が設定されています。CheatEngineを開き 、検索パラメーターでGrand Theft Auto.exeプロセスを選択し、次の設定を設定します。





[最初のスキャン]ボタンをクリックした後、約2万のアドレスが見つかり、余分なアドレスを除外するために、ゲームの解像度を数回変更し、[次のスキャン]ボタンで新しい値を検索しました。 同じことが高さについても行われ、最終的には約20個のアドレスを取得しました。





これらのアドレスを単に変更しても、ゲームが展開された直後に現在の値で上書きされるため、結果は生成されません。

これが機能するかどうかはまったくわかりません。元の許可記録コ​​マンドを自分のものに置き換えることは価値があると判断しました。 IDAGrand Theft Auto.exeを逆アセンブルすると、最初に調べ始めたのは、これに出会うまでの標準関数CreateWindowExASetWindowPosShowWindowの呼び出しパラメーターでした。

画像



CreateWindowExA関数を呼び出す前に、ゲームはnWidthnHeightの値をスタックの 0x7873100x787314のアドレスに配置し ます 。 これらのアドレスはCheat Engineテーブルにあるため、それらから置換を開始することにしました。 これを行うには、 IDAで nWidthの [X]をクリックし、記録が発生する場所を確認します(タイプ-w):

画像



同じ場所で、 nHeightにエントリがあります

画像



スタジオに戻り、 patch_res()関数を作成し、 0x491E4Cでそれにジャンプします。

 CPatch::RedirectJump(0x491E4C, patch_res); ~~~ void __declspec(naked)patch_res() { _asm { mov eax, 1920 MOV DWORD PTR DS : [0x787310], EAX MOV DWORD PTR DS : [0x787370], EAX MOV EAX, DWORD PTR DS : [EBX + 1B4h] INC EAX TEST ECX, ECX mov eax, 1080 MOV DWORD PTR DS : [0x787314], EAX MOV DWORD PTR DS : [0x787388], EAX mov jmpAddress, 0x491E69 jmp jmpAddress } }
      
      







元のasmコードはOllyDbgからコピーされました。 Cheat EngineまたはIDAスタジオからのコードは常に正しく解釈されるとは限らないため、修正する必要があります。 コンパイルしてゲームを実行すると、おなじみの画像が表示されます。





ゲーム自体でも同じこと:





表から、 チートエンジンはアドレスの一部を書き換え、不要なアドレスを削除しました。

  CPatch::RedirectJump(0x491E4C, patch_res); CPatch::RedirectJump(0x414FF7, patch_res_x1); CPatch::RedirectJump(0x43B7CF, patch_res_x2); CPatch::RedirectJump(0x46453B, patch_res_x3); CPatch::RedirectJump(0x46452C, patch_res_x4); CPatch::RedirectJump(0x486848, patch_res_x5); CPatch::RedirectJump(0x486852, patch_res_x6); CPatch::RedirectJump(0x48C137, patch_res_x7); CPatch::RedirectJump(0x48C276, patch_res_x8); CPatch::RedirectJump(0x48C159, patch_res_x9); CPatch::RedirectJump(0x49168B, patch_res_x10); CPatch::RedirectJump(0x415008, patch_res_y1); CPatch::RedirectJump(0x43B7D8, patch_res_y2); CPatch::RedirectJump(0x464532, patch_res_y3); CPatch::RedirectJump(0x48683A, patch_res_y4); CPatch::RedirectJump(0x48C13D, patch_res_y5); CPatch::RedirectJump(0x48C2B0, patch_res_y6); //CPatch::RedirectJump(0x, patch_res_y7);
      
      







適切な関数を作成しました:

 void __declspec(naked)patch_res_x1() { _asm { mov eax, res_x MOV DWORD PTR DS : [0x504CC0], EAX mov jmpAddress, 0x414FFC jmp jmpAddress } } void __declspec(naked)patch_res_x2() { _asm { mov edx, res_x MOV DWORD PTR DS : [0x5C0C00], EDX mov jmpAddress, 0x43B7D5 jmp jmpAddress } } ~~~~~~~ void __declspec(naked)patch_res_y6() { _asm { mov eax, res_y MOV DWORD PTR DS : [0x787AF0], EAX mov jmpAddress, 0x48C2B5 jmp jmpAddress } } void __declspec(naked)patch_res_y7() { _asm { mov edx, res_y MOV DWORD PTR DS : [0x4B48C0], EDX mov jmpAddress, 0x48AE8B jmp jmpAddress } }
      
      







res_xres_y19201080に設定されていますが、結果はあまり満足していません。





戦いの半分は終わっていますが、ゲームは1920x1080で動作します。 最初に、Cheat Engineテーブルのすべての値が1920および1080に変更されたわけではないため、レンダリングが間違っていると判断しました。しかし、すべてをキャッチすることはできなかったため、一部の関数へのリダイレクトを削除しようとしました。 科学的な突く方法を使用して、 patch_res_x4、5 、および6がこの動作を引き起こし、それらを使用しないと、メニューを除くすべてが正常に機能することがわかりました。 x7-x10を無効にすると、メニューも整理されます。



その結果、私は期待していた結果を達成しました:









もちろん、副作用なしではできませんでした。2Dスプライトは少し伸びており、メニューはすべての解像度で正しく表示されませんが、これは私の計画に含まれていなかったので、そのままにします。



ソースコードはGitHubで入手でき、既製の修正があります。 ゲームのインストーラーはインターネットで見つかりました。 Windows 8の公式のものは起動せず、現在ダウンロードできません。 exeサイズは774 144バイトですが、他のプラグインでは機能しない場合があります。



All Articles