Maison >développement back-end >Tutoriel C#.Net >Bases du plug-in C/C Win98 pour le dragueur de mines
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 à
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
4. Après avoir suivi, nous sommes ici Les données de l'échiquier peuvent être trouvées sur
Les données pour extraire la position actuelle sont les suivantes :
On 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
.
Ce 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; }