Maison  >  Article  >  développement back-end  >  Bases du plug-in C/C Win98 pour le dragueur de mines

Bases du plug-in C/C Win98 pour le dragueur de mines

黄舟
黄舟original
2017-01-22 14:16:552340parcourir

Cette fois, nous utilisons le champ "avancé" du dragueur de mines win98 comme exemple de code de base. Plus tard, nous écrirons un code commun pour tous les champs

Le champ du dragueur de mines "avancé" fait référence à

Bases du plug-in C/C Win98 pour le dragueur de mines

Ce qui suit est le téléchargement du dragueur de mines OD et win98

lien : http://pan.baidu.com/s/1gfA10K7 Mot de passe : eiqp



Commençons la démonstration de cette expérience :

1 Après avoir ouvert OD, faites glisser winmine.exe dans OD

2. point d'arrêt sur WM_LBUTTONUP

3. Ensuite, accédez à cet emplacement

Bases du plug-in C/C Win98 pour le dragueur de mines

Le commentaire est en cours de traitement de message (l'adresse est 01001FE1) et suivez

4. Après avoir suivi, nous sommes ici Les données de l'échiquier peuvent être trouvées sur

Bases du plug-in C/C Win98 pour le dragueur de minesLes données pour extraire la position actuelle sont les suivantes :

Bases du plug-in C/C Win98 pour le dragueur de minesOn connaît les deux premiers mots de l'adresse 010055330. Il s'agit de 0x63 (99 en décimal), qui représente le nombre de tonnerre. Les doubles mots suivants sont respectivement la largeur et la hauteur 0x10 qui représentent le bord de l'échiquier. . 0x8F représente le tonnerre

Il suffit donc de récupérer cette mémoire 0x8F et de la changer en 0x8E (marquée par un drapeau rouge), c'est réussi

comme indiqué ci-dessous

.

Bases du plug-in C/C Win98 pour le dragueur de minesCe qui suit est le code C/C

ci-dessus. Ceci est le contenu des bases du plug-in Win98 Minesweeper de C/C. Pour plus de contenu connexe, veuillez faire attention. sur le site Web PHP chinois (www.php.cn) !
#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;  
      
}
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn