マインスイーパー解析Part2

爆弾の位置を変更したりしたかった。

#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);
		unsigned char data[24*32];
		bool flag; //flagがtrueなら書き換えする
		
		printf("爆弾の位置のみを表示するなら0、位置の変更をしたいならそれ以外を入力---");
		scanf("%d", &flag);
     	
		//爆弾の数諸々の取得
		int bomb_num, w, h;
		ReadProcessMemory(hProcess, (void *)0x1005330, &bomb_num, sizeof(int), NULL);
		ReadProcessMemory(hProcess, (void *)0x1005334, &w, sizeof(int), NULL);
		ReadProcessMemory(hProcess, (void *)0x1005338, &h, sizeof(int), NULL);

		printf("Wideth:%d \nHeigh:%d \nBomb:%d\n", w, h, bomb_num);

    	if(!hProcess){
      		MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR);
    	}else{
			if(ReadProcessMemory(hProcess, (LPVOID)0x1005360, data, sizeof(data), NULL)){
				
				//爆弾読み込み兼爆弾除去				
				for(int i=0; i<h; i++){
					for(int j=0; j<w; j++){
					//爆弾だったら何もない状態に書き換える
						int offset = i*32 + j+1;
						if(data[offset] == 0x8F){
							char hoge = 0x0F;
							printf("B");
							if(flag){
							if(!WriteProcessMemory(hProcess, (void *)(0x1005360+offset), &hoge, sizeof(hoge), NULL))
								MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error", MB_OK + MB_ICONERROR);
							}
						}else if(data[offset] == 0x0F){
							printf("0");
						}
					}
					printf("\n");
				}
				MessageBox(NULL, "ReadProcessMemory worked.", "Success", MB_OK + MB_ICONINFORMATION);

				//全て上に爆弾を移動させる
				if(flag){
				int set_bomb = 0;
				for(int i=0; i<h; i++){
					for(int j=0; j<w; j++){
						int offset = i*32 + j + 1;
						if(set_bomb < bomb_num){
							char hoge = 0x8F;
							if(!WriteProcessMemory(hProcess, (void *)(0x1005360 + offset), &hoge, sizeof(hoge), NULL))
							MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error", MB_OK + MB_ICONERROR);
							set_bomb++;
						}
					}
				}
				MessageBox(NULL, "WriteProcessMemory worked.", "Success", MB_OK + MB_ICONINFORMATION);
				}
      		}else{
        		MessageBox(NULL, "Error cannot ReadProcessMemory!", "Error", MB_OK + MB_ICONERROR);
      		}
      		CloseHandle(hProcess);
    	}	
  	}
  	return 0;
}

前回のソースを継承して色々付け足したりした。コメントつけたから見やすいね!!

こんな感じになる

爆弾位置を変えなければもちろんそのままの位置でカンニングしながら解ける。