1

私はC++またはCでさえ関数をNOPする方法を学んでいますが、それについてのオンラインチュートリアルはほとんどありません。私はここ数時間グーグルをしていて、行き詰まっています。これが私のコードです。

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;

//#define NOP 0x90
byte NOP[] = {0x90};

void enableDebugPrivileges() {
    HANDLE hcurrent=GetCurrentProcess();
    HANDLE hToken;
    BOOL bret=OpenProcessToken(hcurrent,40,&hToken);
    LUID luid;
    bret=LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid);
    TOKEN_PRIVILEGES NewState,PreviousState;
    DWORD ReturnLength;
    NewState.PrivilegeCount =1;
    NewState.Privileges[0].Luid =luid;
    NewState.Privileges[0].Attributes=2;
    AdjustTokenPrivileges(hToken,FALSE,&NewState,28,&PreviousState,&ReturnLength);
}
DWORD GetProcId(char* ProcName)
{
    PROCESSENTRY32   pe32;
    HANDLE         hSnapshot = NULL;

    pe32.dwSize = sizeof( PROCESSENTRY32 );
    hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

    if( Process32First( hSnapshot, &pe32 ) )
    {
        do{
            if( strcmp( pe32.szExeFile, ProcName ) == 0 )
                break;
        }while( Process32Next( hSnapshot, &pe32 ) );
    }

    if( hSnapshot != INVALID_HANDLE_VALUE )
        CloseHandle( hSnapshot );

    return pe32.th32ProcessID;
}
void WriteMem(DWORD Address, void* Value, size_t Size) {
    DWORD Protect = NULL;
    VirtualProtect((LPVOID)Address, 3, PAGE_READWRITE, &Protect);
    memcpy((void*)Address, Value, 3);
    VirtualProtect((LPVOID)Address, 3, Protect, &Protect);
}
void nop_(PVOID address, int bytes){ 
    DWORD d, ds; 
    VirtualProtect(address, bytes, PAGE_EXECUTE_READWRITE, &d); 
    memset(address, 144, bytes);
    VirtualProtect(address,bytes,d,&ds); 
}  

void MemCopy(HANDLE pHandle, void* Dest, const void* Src, int Len)
{
 DWORD OldProtect;
 DWORD OldProtect2; 
 VirtualProtect(Dest, Len, PAGE_EXECUTE_READWRITE, &OldProtect);
 memcpy(Dest, Src, Len);
 VirtualProtect(Dest, Len, OldProtect, &OldProtect2);
 FlushInstructionCache(pHandle, Dest, Len);
}

int main()
{
   enableDebugPrivileges();

   DWORD pid;
   HANDLE phandle;

   // Obtain the process ID
   pid = GetProcId("gr.exe");
    if(GetLastError())
   {
      cout << "Error_PID_: " << GetLastError() << endl;
      system("pause");
      return -1;
   }

   // Obtain the process handle
   phandle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
   if(GetLastError())
   {
      cout << "Error_HANDLE_: " << GetLastError() << endl;
      system("pause");
      return -1;
   }

   // Debug info, 0 = bad
   cout <<"pid   : " << pid << endl;
   cout <<"HANDLE: " << phandle << endl << endl;
   system("pause");


   // Change value to
   short iValue   =   -1;
   int choice   =   0;

   BYTE * bGodMode  = (BYTE *) (0x409A7E); // Lives Address


   bool hack = true;
   while(hack)
   {
      system("cls");
      cout << "What hack?\n0. Exit\n1. Lives\n\n!> ";
      cin >> choice;
      switch(choice)
      {
      case 0:
         {
            hack=false;
            break;
         }
      case 1:
         // Modify Time
         cout << "God Mode On\n!> ";
//  cin >> iValue;
//  nop_((PVOID)(0x409A7E), 3);
//   MemCopy(phandle, (PVOID)0x409A7E, &NOP, 1);
   WriteMem((DWORD)(0x00409A7E), (void*)NOP, sizeof NOP);
         if(GetLastError())
         {
            cout << "Error: " << GetLastError() << endl;
            system("pause");
         }
         break;
      default:
         cout << "ERROR!\n";
         break;
      }
      Sleep(100);
   }

   system("pause");
   return 0;
}

これは、私が命を失うのを防ぐ3バイトの長さのDEC関数をNOPすることを想定しています。ただし、試してみるたびに、ハックがクラッシュし、アクセス違反があったと表示されます。私は理由を調べようとしました、そしてそれらのほとんどは私が書いている場所のサイズと私がコピーしているものを扱っていました。そうでなければ、私にはまったくわかりません。どんな助けでもいいでしょう。ゲームはGunRoarで、ベースアドレス「0x409A7E」はDEC関数がある場所です。

4

4 に答える 4

1

いくつかの簡単なポイント:

「VirtualProtect」は現在のプロセスでのみ機能します。'VirtualProtectEx'を使用して、ターゲットプロセスの権限を変更します。そして、パーミッション'PAGE_EXECUTE_READWRITE'を設定することをお勧めします-書き込み可能ですが、実行可能です。

前述のように、これらのNOPを書き込むには「WriteProcessMemory」を使用する必要があります。memsetでは不十分です。

ここで説明するタイプのハッキングを適切に実行するには、コードをいじくり回す前に、ターゲットプロセスのスレッドを実際に一時停止し、完了したら再開する必要があります。しかし、この特定の例では、そのような注意はおそらく問題ではありません。

于 2010-05-16T06:46:59.700 に答える
1

私はWindowsのデバッグにあまり精通していません(それがここで悪用しようとしている場合)が、あなたがしていると思うことをしているとは思いません:)

各プロセスには独自の仮想メモリがあります(これが仮想である理由です)。0x00409A7Eハッキングしようとしているゲームプロセスではなく、現在のプロセスの仮想アドレス空間に書き込みを試みています。別のプロセスへのハンドルを取得しても、そのアドレスが魔法のように自分のアドレスにマップされるわけではありません。追加のWinAPI呼び出しを介して取得する必要があります。

編集:

被害者のプロセスにデバッガーとしてアタッチする必要があると思いますDebugActiveProcess。それ以外の場合、ゲームのテキストセグメント(手順が記載されている場所)は、プロセスで書き込みできません。

于 2010-05-16T03:55:25.490 に答える
0

書き込もうとしているページに実際に書き込み権限があることを確認しますか?

于 2010-05-16T05:04:21.780 に答える
0

私が間違っている場合は訂正してください。ただし、ABA GamesのGunRoarをプレイしているだけですか?その場合、コードは明らかにオープンソースであり、実際にはzipファイルで出荷されます。非常に簡単に見てみると、InGameStateのshipDestroyed()メソッドの「左」メンバーで遊ぶ必要があるかもしれません(gamemanager.dを参照)。'godmode'したい必要な修正を行い、ビルドしてから、変更を統合するためにそれらにメールを送信します。:)

于 2010-05-16T05:14:00.783 に答える