マインスイーパー解析
方針。
まずマインスイーパの爆弾位置を保存しているメモリアドレスを探す。地味にこれが大変。0x1005360に展開されてることが分かった。
その次にこの領域のメモリを他のプログラムから取得してもうちょっと見やすくしたかった。
参考にしたサイト。
http://www.mpcforum.com/showthread.php?251308-Tutorial-Basic-C-Game-Hacking-(Memory-Editing)
http://d.hatena.ne.jp/peryaudo/20100516/1273998518
以下ソースはほぼ上のサイトの丸パクリ
#include <windows.h> #include <stdio.h> int main() { HWND hWnd = FindWindow(0, "マインスイーパ"); if(hWnd == 0) { MessageBox(0, "Error cannot find window.", "Error", MB_OK|MB_ICONERROR); } else { DWORD proccess_ID; GetWindowThreadProcessId(hWnd, &proccess_ID); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID); if(!hProcess) { MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR); } else { unsigned char data[24*32]; DWORD datasize = sizeof(data); if(ReadProcessMemory(hProcess, (LPVOID)0x1005360, data, datasize, NULL)) { int counter = 0; for(int i=0; i<24*32; i++){ if(data[i] == 0x10){ counter++; if(counter%2) printf("\n"); } if(counter%2){ if(data[i] == 0x8F) printf("B "); else if(data[i] == 0x0F) printf("%0X ", data[i]); } } MessageBox(NULL, "ReadProcessMemory worked.", "Success", MB_OK + MB_ICONINFORMATION); } else { MessageBox(NULL, "Error cannot ReadProcessMemory!", "Error", MB_OK + MB_ICONERROR); } CloseHandle(hProcess); } } return 0; }
こんな感じにカンニングしながら解ける