Warcraft III / Dota

こんにちは チートを作成する原理に関する以前の記事は、多くの人に興味を持っています。 これに導かれて、私は誰かがそのようなプログラムを作成する別の方法で面白いと思うかもしれないと提案しました。 始める前に、次のように言います。「以下に説明するすべてを適用することに決めた場合、自分の責任とリスクで使用してください。 ここで説明するものはすべて、一般的な開発のためにのみ提供れています。

たとえば、このようなプログラム/トレーナーには標準の「魚」を使用します。 作業の原則は、プログラムメモリで必要なアドレス/オフセットを見つけ、それらの値を独自の値に変更することです。



したがって、まず最初に必要なものは次のとおりです。

ArtMoney / TSearch-値を検索します。

ollydbg-アドレスを見つけるためのデバッガー。

ビデオを見る:







私が説明する:

1)最初に、ユニットの表示/非表示を担当するフラグが格納されているゲームのメモリ内のアドレスを見つけます。

2)次に、デバッガーでこのアドレスを見つけ、その呼び出しにブレークポイントを設定します。 私たちはそれが起こったところからそこへ行きます。 マイクロクラッシュを作成します。 値をコピーします(赤で強調表示)-これは、チートがアクティブになったときにプログラムメモリに書き込む必要があるものです-6F3A1563 66:B9 0F00。

66:B9 0F00これはマジックバイトです。0x660xB9 0x0F 0x00として書き込みます 。 そして、1のオフセットで6F3A1563に書き込みます。



ウィンドウハンドルを見つけて、マーカーの特権を設定します。



LPSTR gameWindowTitle = "Warcraft III"; HWND hWnd=::FindWindow(NULL, gameWindowTitle); if (hWnd != NULL) { HANDLE currentProccess = GetCurrentProcess(); HANDLE token; BOOL retValue = OpenProcessToken(currentProccess, 40, &token); LUID luid; LPSTR debugPrivilege = "SeDebugPrivilege"; retValue = LookupPrivilegeValue(NULL, debugPrivilege, &luid); TOKEN_PRIVILEGES newState, preState; DWORD returnLength; newState.PrivilegeCount = 1; newState.Privileges[0].Luid = luid; newState.Privileges[0].Attributes = 2; retValue = AdjustTokenPrivileges(token, FALSE, &newState, 28, &preState, &returnLength); DWORD PID; DWORD TID = ::GetWindowThreadProcessId(hWnd, &PID); openedProccess = OpenProcess( PROCESS_ALL_ACCESS | PROCESS_TERMINATE | PROCESS_VM_OPERATION | PROCESS_VM_READ| PROCESS_VM_WRITE, FALSE, PID); ... }
      
      







次に、メモリを変更できます



 DWORD data = 0x66; WriteProcessMemory(openedProccess, (LPVOID)(6F3A1563), &data, 1, 0); data = 0xB9; WriteProcessMemory(openedProccess, (LPVOID)(6F3A1564), &data, 1, 0); data = 0x0F; WriteProcessMemory(openedProccess, (LPVOID)(6F3A1565), &data, 1, 0); data = 0x00; WriteProcessMemory(openedProccess, (LPVOID)(6F3A1566), &data, 1, 0);
      
      







便宜上、 Game.dllライブラリに関連するアドレスを転送できます。これにより、ゲーム内で他のライブラリが更新された場合に、再構築せずにプログラムの寿命を延ばすことができます。 これを行うには、彼女の住所を知る必要があります



 DWORD GetModuleBase(HANDLE hProc, LPSTR sModuleName) { HMODULE hMods[8]; DWORD cbNeeded; unsigned int i; if(EnumProcessModules(hProc, hMods, sizeof(hMods), &cbNeeded)) { for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ) { TCHAR szModName[MAX_PATH]; if ( GetModuleBaseName(hProc, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) { if(strstr(szModName, sModuleName)) { return (DWORD)hMods[i]; } _tprintf( TEXT("\t%s (0x%08X)\n"), szModName, hMods[i] ); } } } return 0x00; } bool WriteData(DWORD address, DWORD data) { return WriteProcessMemory(openedProccess, (LPVOID)(gameOffset + address), &data, 1, 0); } ... LPSTR gameLibraryName = "Game.dll"; gameOffset = GetModuleBase(openedProccess, gameLibraryName); ...
      
      







それは基本的にそれです。



All Articles