GTAサンアンドレアスのチートを書く

各ゲーマーは、遅かれ早かれ、ゲームの特定レベルの通過、不正行為の可能性などを単純化することを考えます。このため、彼らはArtMoneyなどの特別なプログラムに頼りますが、これは常に可能とは限らず、時には目標を達成するためにメモリ内のデータを定期的に修正するのは面倒です。 さまざまなチートトレーナーがこのプロセスを自動化するのに役立ちます。 チートの作成については、後で説明します。



ゲームGTA San Andreasがテスト対象として選択されました。これを拷問します。 必要に応じてゲーム画像を「ねじる」には、メモリの一部の領域を変更するだけで十分です。 どうやってやるの? 実際、Windowsでは、プロセスは互いに分離されており、別のプロセスのメモリには入りません。 もちろん、WinAPI関数WriteProcessMemory()を使用することもできますが、ゲームプロセスにコードを追加することで異なる方法を実行します。 これを行うには、必要なプロセスへのインジェクションなど、いくつかの方法がありますが、アンチウイルスはこの方法を好まず、アラームを発生させることができます。 したがって、Windowsプロパティを使用して、最初にプログラムが実行されているフォルダーでライブラリを探し、次に他の場所で探します。 原則として、この方法はアンチウイルスにとって疑わしいものではありません。

プログラムによってインポートされるライブラリーの機能を調べ、インポートされる機能が最も少ないライブラリーを見つけて、DLLフィルターを作成する必要があります。 GTA San Andreasの場合、Dinput8.dllはこのようなライブラリであることが判明し、そこから1つの関数だけがインポートされました-DirectInput8Create()

次に、独自のDLLを作成する必要があります。このDLLでは、特に、呼び出されたときにDirectInput8Create()関数をエクスポートする必要があり、同じ名前のWWindowsシステムライブラリから呼び出す必要があります。 そうしないと、ゲームが中断されます!

ほとんどすべてのプログラミング言語でDLLを作成できます。 PureBasicを選びました。



チートコード
;   GTA San Andreas. Prototype pDirectInput8Create(hinst, dwVersion.l, riidltf, *ppvOut, *punkOuter) ;  . Procedure.s GetSysDir() Protected Result.s="", len, *Mem *Mem=AllocateMemory(#MAX_PATH) If *Mem Len=GetSystemDirectory_(*Mem, #MAX_PATH) Result=PeekS(*Mem, Len)+"\" FreeMemory(*Mem) EndIf ProcedureReturn Result EndProcedure Procedure.b TestMemory(*Pointer, Size) ;       . Protected mbi.MEMORY_BASIC_INFORMATION Protected Result.b = #False, dwWrote If Size dwWrote = VirtualQuery_(*Pointer, @mbi, SizeOf(MEMORY_BASIC_INFORMATION)) If dwWrote If mbi\BaseAddress+mbi\RegionSize >= *Pointer+Size If mbi\Protect & (#PAGE_READONLY | #PAGE_READWRITE | #PAGE_EXECUTE_READ | #PAGE_EXECUTE_READWRITE) Result = #True EndIf EndIf EndIf EndIf ProcedureReturn Result EndProcedure Procedure WriteMemF(*Address, Infa.f) ;    Float . If TestMemory(*Address, 4) PokeF(*Address, Infa) EndIf EndProcedure Procedure WriteMemL(*Address, Infa.l) ;    Long . If TestMemory(*Address, 4) PokeL(*Address, Infa) EndIf EndProcedure Procedure.l ReadMemL(*Address) ;    Long . If TestMemory(*Address, 4) ProcedureReturn PeekL(*Address) Else ProcedureReturn -1 EndIf EndProcedure Procedure WinTimer() Protected *Point Static Count ;  (  1000000,  ). Maney = ReadMemL($00B7CE50) If Maney>=0 And Maney<1000000 WriteMemL($00B7CE50, 1000000) EndIf ;   . If TestMemory($00B6F5F0, SizeOf(Integer)) *Point = PeekI($00B6F5F0) If TestMemory(*Point, 4) ; . WriteMemF(*Point+1344, 100) ; . WriteMemF(*Point+1352, 100) ; ,   . WriteMemL(*Point+1504, 1000) WriteMemL(*Point+1508, 1000) ; ,   . WriteMemL(*Point+1532, 1000) WriteMemL(*Point+1536, 1000) ; SMG,   . WriteMemL(*Point+1560, 1000) WriteMemL(*Point+1564, 1000) ; ,   . WriteMemL(*Point+1588, 1000) WriteMemL(*Point+1592, 1000) ; ,   . WriteMemL(*Point+1616, 1000) WriteMemL(*Point+1620, 1000) ; ,   . WriteMemL(*Point+1644, 1000) WriteMemL(*Point+1648, 1000) ; ,   . WriteMemL(*Point+1672, 1000) WriteMemL(*Point+1676, 1000) ; /,   . WriteMemL(*Point+1700, 1000) WriteMemL(*Point+1704, 1000) EndIf EndIf ; . If TestMemory($00BA18FC, SizeOf(Integer)) *Point = PeekI($00BA18FC) If TestMemory(*Point, 4) ;   . WriteMemF(*Point+1216, 1000) EndIf EndIf If Count>10 Count=0 ;  -   ( 1000). WriteMemL($00B791B4, 1000) ;  -   ( 1000). WriteMemL($00B791B8, 1000) ;  -   ( 1000). WriteMemL($00B790A0, 1000) ;  -   ( 1000). WriteMemL($00B7919C, 1000) ;  -  ( 1000). WriteMemL($00B791C4, 1000) ;  -   ( 1000). WriteMemL($00B791A4, 1000) ;  -  ( 1000). WriteMemF($00B793DC, 1000) ;  -  ( 1000). ;WriteMemF($00B79480, 1000) ;  -  ( 1000). WriteMemF($00B793D8, 1000) ;  -  AK47 ( 1000). WriteMemF($00B794B4, 1000) ;  -    ( 1000). WriteMemF($00B794A8, 1000) ;  -  Desert Eagle ( 1000). WriteMemF($00B7949C, 1000) ;  -  M4 ( 1000). WriteMemF($00B794B8, 1000) ;  -  - ( 1000). WriteMemF($00B794AC, 1000) ;  -   ( 1000). WriteMemF($00B79494, 1000) ;  -  SMG ( 1000). WriteMemF($00B794B0, 1000) ;  -   ( 1000). WriteMemF($00B794A4, 1000) ;  -   ( 1000). WriteMemF($00B794A0, 1000) ;  -     ( 1000). WriteMemF($00B79498, 1000) Else Count+1 EndIf EndProcedure ;      . Procedure Thread(*Void) Shared hWnd_SanAndreas Protected Count Delay(4000) Count=0 Repeat ;   . hWnd_SanAndreas=FindWindow_(0, "GTA: San Andreas") If hWnd_SanAndreas<>0 ;    SetTimer_(hWnd_SanAndreas, 10, 800, @WinTimer()) ;    Break ;   . EndIf Delay(100) Count+1 If Count>20 ;   . Beep_(1000,200) Break EndIf ForEver EndProcedure ;      DLL. ProcedureDLL AttachProcess(Instance) Global WinAPI_DirectInput8Create=0, hLib_Dinput8, ThreadID ;   Dinput8.dll hLib_Dinput8 = LoadLibrary_(GetSysDir()+"Dinput8.dll") If hLib_Dinput8 WinAPI_DirectInput8Create.pDirectInput8Create = GetProcAddress_(hLib_Dinput8, "DirectInput8Create") EndIf If WinAPI_DirectInput8Create=0 MessageRequester("", "   ."+Chr(10)+" .") EndIf ;   . ThreadID=CreateThread(@Thread(), 0) EndProcedure ;      DLL. ProcedureDLL DetachProcess(Instance) Shared hWnd_SanAndreas If hLib_Dinput8 FreeLibrary_(hLib_Dinput8) hLib_Dinput8 = 0 EndIf If ThreadID And IsThread(ThreadID) KillThread(ThreadID) ThreadID=0 EndIf If hWnd_SanAndreas<>0 And IsWindow_(hWnd_SanAndreas) KillTimer_(hWnd_SanAndreas, 10) hWnd_SanAndreas=0 EndIf EndProcedure ;     WinAPI DirectInput8Create. ProcedureDLL DirectInput8Create(hinst, dwVersion.l, riidltf, *ppvOut, *punkOuter) If WinAPI_DirectInput8Create ProcedureReturn WinAPI_DirectInput8Create(hinst, dwVersion, riidltf, *ppvOut, *punkOuter) EndIf EndProcedure
      
      





AttachProcess()プロシージャは、DLLがロードされるときにシステムによって呼び出されます。 Dinput8.dllシステムライブラリをロードします。 この場合、絶対読み込みパスが明確に示されます。そうでない場合、ライブラリはそれ自体を読み込みますが、それは必要ありません! ライブラリのロードが成功すると、DirectInput8Create()関数へのポインターを取得します。 失敗した場合、ユーザーに失敗を知らせるメッセージが表示されます。 その後、並列スレッドが開始され、操作が終了します。 プログラムを「ハングアップ」させないためにストリームが必要です。 スレッド(スレッド()プロシージャ)では、ゲームウィンドウは「GTA:San Andreas」というタイトルで検索されます。 ウィンドウが見つかるとすぐに、タイマーが「ハング」し、フローはこれで動作を停止します。 もちろん、タイマーなしでストリーム内のすべてのアクションを実行することもできますが、セキュリティ上の理由から、ゲームのメインストリームからメモリを変更することが決定されました。

WinTimer()プロシージャは、800ミリ秒ごとにタイマーで呼び出されます。 必要な変数の値を変更します。 ただし、変更前に、このアドレスがプロセスにアクセス可能かどうかを確認する必要があります。

チートは、適切なレベルのアーマー、プレイヤーと車両のヘルス、プレイヤーのスキル、およびラウンド数を維持します。 さらに、プレーヤーにはレモンのドルが与えられ、彼がそれらを費やすと、彼らは薄い空気から再び現れます。

このチートは、警官との戦争ゲームを解き放つことを好む人にアピールします。 彼らがプレイヤーを一瞬で撃ったとしても、プレイヤーを破壊することは非常に難しいでしょう。



このコードから、Dinput8.dllという名前のDLLを作成し、ゲームと同じフォルダーに配置する必要があります。

DLLを正確に取得するには、コードがIDEに読み込まれたときに、「実行可能ファイル形式」リストのコンパイラのプロパティで「共有DLL」を選択する必要があります。



画像







All Articles