ホームページ  >  記事  >  バックエンド開発  >  C/C++ win98 マインスイーパー プラグインの基本

C/C++ win98 マインスイーパー プラグインの基本

黄舟
黄舟オリジナル
2017-01-22 14:16:552350ブラウズ

今回は、基本コードの例として win98 マインスイーパの「アドバンス」フィールドを使用します。後ほど、全フィールドに共通の章を書きます

「アドバンス」マインスイーパのフィールドとは、以下を指します

C/C++ win98 マインスイーパー プラグインの基本

OD と win98 マインスイーパーのダウンロード リンク

: http://pan.baidu.com/s/1gfA10K7 パスワード: eiqp


この実験のデモンストレーションを開始しましょう:

1. OD を開いた後、ドラッグします。 winmine.exe を OD

に追加します 2. WM_LBUTTONUP にブレークポイントを設定します

3. 次に、この場所にステップ実行し、メッセージ処理に注釈を付けます (アドレスは 01001FE1) 。チェス盤のデータはここにあります

C/C++ win98 マインスイーパー プラグインの基本

次のように現在位置のデータを抽出します:

C/C++ win98 マインスイーパー プラグインの基本 アドレス 010055330 の最初のダブルワードが 0x63 (10 進数で 99) であり、雷の番号を表すことがわかっています。次のダブルワードはそれぞれ幅と高さで、0x10 はチェス盤の側面を表し、0x8F は雷を示します

したがって、メモリのこのセグメント 0x8F を取得して、それを 0x8E (赤フラグとしてマーク) に変更するだけで成功します。

以下に示すようにC/C++ win98 マインスイーパー プラグインの基本

以下は C/C++ コードです

​​
#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;  
      
}

上記は C /C++ Win98 マインスイーパ プラグインの基礎です。関連コンテンツの詳細については、PHP 中国語 Web サイト (www. php.cn)!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。