Heim  >  Artikel  >  Backend-Entwicklung  >  Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

黄舟
黄舟Original
2017-01-22 14:16:552346Durchsuche

Dieses Mal verwenden wir das Feld „Erweitert“ von Win98 Minesweeper als Beispiel für den Basiscode. Später werden wir einen gemeinsamen Code für alle Felder schreiben

Das Feld „Erweitert“ Minesweeper bezieht sich auf

Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

Das Folgende ist der OD- und Win98 Minesweeper-Download-Link

: http://pan.baidu.com/s/1gfA10K7 Passwort: eiqp


Beginnen wir mit der Demonstration dieses Experiments:

1. Ziehen Sie nach dem Öffnen von OD winmine.exe in OD

2 Haltepunkt auf WM_LBUTTONUP

3. Gehen Sie dann zu diesem Speicherort

Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

Der Kommentar ist Nachrichtenverarbeitung (die Adresse ist 01001FE1) und folgen Sie

4. Danach sind wir hier. Die Schachbrettdaten finden Sie unter

Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

Die Daten zum Extrahieren der aktuellen Position lauten wie folgt:

Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

Wir kennen die ersten beiden Wörter der Adresse 010055330. Es ist 0x63 (99 in Dezimalzahl), was die Anzahl der Donner darstellt. Die folgenden Doppelwörter sind Breite und Höhe bzw. 0x10 . 0x8F steht für Donner

Wir müssen also nur diesen Speicher 0x8F abrufen und in 0x8E ändern (markiert als rote Flagge), es ist erfolgreich

wie unten gezeigt

Grundlagen des C/C++ Win98 Minesweeper-Plug-Ins

Das Folgende ist der C/C++-Code

#include <windows.h>  
#include <stdio.h>  
  
int main()  
{  
    HWND hWinmine = FindWindow(NULL, L"扫雷");  
    DWORD dwPID = 0;  
    GetWindowThreadProcessId(hWinmine, &dwPID);  
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID);  
  
    //基础地址、雷数、宽度、高度  
    DWORD dwBaseAddr = 0x01005330;  
    DWORD dwNum = 0, dwWidth = 0, dwHight = 0, dwSize = 0;  
  
  
    //读取内存信息  
    //读进程的内存空间数据  
    //参数:第1个参数:    HANDLE hProcess进程句柄。  
    //第2个参数:    LPCVOID lpBaseAddress基址指针。  
    //第3个参数:    LPVOID lpBuffer接收数据缓冲区指针。  
    //第4个参数:    DWORD nSize接收数据缓冲区缓冲区大小。  
    //第5个参数:    LPDWORD lpNumberOfBytesRead读入数据量大小指针。  
  
        返回值:       成功:TRUE  
        失败:FALSE  
    ReadProcessMemory(hProcess, (LPVOID)dwBaseAddr, &dwNum, sizeof(DWORD), &dwSize);  
    ReadProcessMemory(hProcess, (LPVOID)(dwBaseAddr +0x4), &dwWidth, sizeof(DWORD), &dwSize);  
    ReadProcessMemory(hProcess, (LPVOID)(dwBaseAddr + 0x8), &dwHight, sizeof(DWORD), &dwSize);  
  
    //棋盘总大小=棋盘+空白边+4角  
    DWORD dwReadsize = dwWidth*dwHight + dwHight * 2 + dwWidth * 2 + 4;  
    PBYTE pByte = new BYTE[dwReadsize];  
      
    ReadProcessMemory(hProcess, (LPVOID)(dwBaseAddr + 0x16), pByte, dwReadsize, &dwSize);  
  
    BYTE bClear = 0x8E;  
    for (size_t i = 0; i < dwReadsize; i++)  
    {  
        if (pByte[i] == 0x8F)  
        {  
            WriteProcessMemory(hProcess, (LPVOID)(dwBaseAddr + 0x16 + i), &bClear, sizeof(BYTE), &dwSize);  
        }  
    }  
    //函数功能:       得到窗体客户区的大小。  
    //第1个参数:    HWND hWnd窗体句柄。  
    //第2个参数:    LPRECT lpRect客户区RECT结构的指针。  
    RECT rt = { 0 };  
    GetClientRect(hWinmine, &rt);  
  
  
    InvalidateRect(hWinmine, &rt, true);//这个函数屏蔽一个窗口客户区的全部或部分区域。这会导致窗口在事件期间部分重画  
    delete pByte;  
    CloseHandle(hProcess);  
    getchar();  
    return 0;  
      
}

oben Dies ist der Inhalt der Grundlagen des Win98-Minesweeper-Plug-Ins in C/C++. Weitere verwandte Inhalte finden Sie hier. Bitte beachten Sie die chinesische PHP-Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn