winmine 학습 노트

게임의 콜
  • MessageBoxA call 함수
  • OD winmine을 엽니다.exe 프로그램 후crl+g에서MessageBoxA를 찾으면MessageBoxA 콜 주소에 도착할 수 있습니다. 저희는 코드 주입 도구로 테스트합니다(<주입 도구 학습 노트> 참조). 틀림없습니다.
    //  (    ),    (         ),  (         ),    (error/warning/ok)
    int MessageBox{
        __in HWND hWnd,
        __in LPSTSTR lpText,
        __in LPCTSTR lpCaption,
        __in UNIT uType
    }
    
  • 윈도우즈 창 클래스 함수
  • //  (    ),    ,      ,      
    LRESULT CALLBACK WindowProc{
        __in HWND hwnd,
        __in UINT uMsg,
        __in WPARAM wParam,
        __in LPARAM lParam
    }
    //      ,WindowProc      ,uMsg=WM_COMMAND,wParam       ID(    )
    
  • 시작: OD winmine 열기.exe 프로그램, 실행, 위 w 단추를 누르고 리셋, 루트 창을 우클릭하고ClassProc를 따라가면 윈도 Proc 주소를 찾을 수 있습니다. 이 테스트에서 얻은 주소는 01001BD2
  • 입니다.
  • 희망: 우리는 WindowProc 함수에서 조건 단점을 달성하기를 희망한다: uMsg==WM불필요한 메시지를 필터링하기 위한 COMMAND
  • 관찰:exe 프로그램이 uMsg를 모르기 때문에 관찰반집성에는 movedx, dword ptr ss:[ebp+0xC]가 있다. 그리고 오른쪽 위 레지스터 구역의 edx의 값은 00000111
  • 이다.
  • 가점: 다음 줄에서 mov ecx, dword ptr ss: [ebp+0x14]우클릭, 인터럽트, 조건 인터럽트, edx=WMCOMMAND
  • 테스트: 뇌상자에 따라 단점을 터치하지 않으며, 메뉴에 따라 초/중/고급으로 전환하면 단점을 터치하여 조건 중단을 실현
  • mov edx, [arg, 2]를 두 번 클릭하면 mov edx, dword ptr ss 보기: [ebp+0xC]
  • 오른쪽 아래 스택 주소를 오른쪽으로 클릭하고 주소를 입력하면 EBP에 비해 EBP+C의 값이 00000111
  • 인 것을 알 수 있다.
  • EBP+8, +C, +10, +14 각각local.1,2,3,4, 여기local은 순서 조정입니다. 함수 호출 전 압축창고가 거꾸로 압축된 것을 알고 있기 때문에 본 테스트에서 얻은 정보는 다음과 같습니다. EBP+8>|00230A22 EBP+C>|000000111 EBP+10>|000000209 EBP+14>|00000000
  • EBP+10의 값을 읽으면 현재 메뉴 항목의 ID입니다. 여러 번의 테스트를 통해 알 수 있습니다. 시작: 0x1FE 초급: 0x209 중급: 0x20A 고급: 0x20B

  • 게임의 기본 주소
    기본 주소 개념: 전역 변수, 문자 상수 등 주소, 매번 열기
  • 지뢰 제거 인터페이스 왼쪽 위에 남은 지뢰의 값의 메모리 주소를 찾습니다. OE에서 winmine을 엽니다.exe 실행, CE 재연결 winmine.exe
  • CE 검색 10, 그리고 지뢰밭에서 우클릭, CE 검색 9, 값을 받은 메모리 주소 0x01005194
  • OD 왼쪽 아래에서db 0x01005194로 데이터 위치 찾기, 우클릭, 인터럽트, 메모리 쓰기
  • 한 번 더 우클릭하면 0100346E에서 중단됩니다. 명령은 add dword ptr ds: [0x1005194], eax입니다. OD 오른쪽 위에 있는 EAX의 값을 보십시오. FFFFF입니다. Add를 결합하면 1을 줄이고 틀림없습니다
  • .
  • 명령에서 0x1005194 즉시 주소 찾기가 절대 주소인 것을 보았습니다. ebp±나local 같은 것이 아니라 기본 주소가 확실합니다.

  • MFC 조종 메뉴
    /*  VS  ctrl+f1    VS    ,      SendMessage FindWindow      API  
     SendMessage  :
    LRESULT WINAPI SendMessage(
    	_In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam
    );
    */
    
    //  MFC     4   ,         
    void CwinmineDlg::OnBnClickedButton1(){
    	HWND hWnd = ::FindWindow(NULL, _T("  "));
    	if (NULL == hWnd) {
    		::MessageBox(NULL, _T("       "),_T("  "),MB_OK);
    		return ;
    	}
    	::SendMessage(hWnd, WM_COMMAND, 0x209, 0);
    }
    void CwinmineDlg::OnBnClickedButton2(){
    	HWND hWnd = ::FindWindow(NULL, _T("  "));
    	if (NULL == hWnd) {
    		::MessageBox(NULL, _T("       "),_T("  "), MB_OK);
    		return;
    	}
    	::SendMessage(hWnd, WM_COMMAND, 0x20A, 0);
    }
    void CwinmineDlg::OnBnClickedButton3(){
    	HWND hWnd = ::FindWindow(NULL, _T("  "));
    	if (NULL == hWnd) {
    		::MessageBox(NULL, _T("       "), _T("  "), MB_OK);
    		return;
    	}
    	::SendMessage(hWnd, WM_COMMAND, 0x20B, 0);
    }
    void CwinmineDlg::OnBnClickedButton4(){
    	for (int i = 0; i < 3; i++) {
    		OnBnClickedButton1();
    		Sleep(1000);
    		OnBnClickedButton2();
    		Sleep(1000);
    		OnBnClickedButton3();
    		Sleep(1000);
    	}
    }
    //                
    

    MFC 기본 주소 읽기
    //          ,       ,    ,   int,   m_num_mine
    //         ,        ,    VS       
    void CwinmineDlg::OnBnClickedButton5(){
    	DWORD pid;
    	HWND hWnd = ::FindWindow(NULL, _T("  "));
    	if (NULL == hWnd) {
    		::MessageBox(NULL, _T("       "), _T("  "), MB_OK);
    		return;
    	}
    	GetWindowThreadProcessId(hWnd, &pid);
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    	if (NULL == hProcess) {
    		::MessageBox(NULL, _T("        "), _T("  "), MB_OK);
    		return;
    	}
    	ReadProcessMemory(hProcess, (LPCVOID)0x1005194, &m_num_mine, sizeof(m_num_mine), &pid);
    	UpdateData(FALSE);
    }
    

    CE 지뢰밭 정보 찾기
  • 지뢰 제거 게임을 열고 CE를 열고 지뢰 제거 게임을 가져옵니다. 현재 목표는 가장 왼쪽 상단에 있는 칸의 메모리 주소를 찾는 것
  • 첫 번째 칸을 누르면 알 수 없는 초기값
  • 그리고 웃는 얼굴을 누르고 첫 번째 칸을 누르면 두 번째 칸의 숫자가 같으면 변동하지 않은 수치를 다시 찾고, 같지 않으면 변동된 수치를 다시 찾는다
  • 후보 주소가 하나만 남을 때까지 한 걸음 뒤로 돌아갑니다. 이 노트 테스트 주소는 01005361
  • 입니다.
  • CE에 후보 주소 01005361을 아래에 추가하고 설명을 지뢰밭 기반 주소로 변경하여 다음에 읽을 수 있도록 CT표를 저장합니다
  • 아래 후보 주소를 우클릭하고 관련 메모리 구역을 훑어보고 뇌구 칸과의 관계를 관찰하면 어렵지 않다.
  • 0F 비뇌+미조작
  • 0E 비뇌+깃발꽂기
  • 0D는 비뇌+물음표
  • 8F는 뇌+미조작
  • 8E는 레이+깃발꽂기
  • 8D는 레이+물음표
  • CC는 벼락치기
  • 40은 0
  • 41은 1
  • 42는 2
  • 43은 3
  • 44는 4
  • 45는 5
  • 46은 6
  • 47은 7
  • 48은 8(맞춤형 행렬뢰는 999로 테스트할 수 있지만 최대 24,30667)
  • 10은 무효 영역 표시
  • 보충: 첫 번째 천둥을 누르면 천둥의 위치를 재배치하고, 첫 번째 천둥을 누르지 않으면 재배치하지 않는다
  • 보충: 01005361부터 32바이트를 1조로 하고 첫 줄을 대표하는 천둥은 최대 30바이트까지 유효하다. 즉, 천둥 제거 창구에는 최대 30열의 천둥
  • 이 있다.
  • 보충: 30열 뇌구 시 마지막 두 바이트는 10이고 한 줄이 30열이 부족하면 두 10 사이에 0F
  • 를 보충한다.
  • 보충: 01005381부터 32바이트가 2조로 2행을 대표하는 천둥을 이렇게 유추하면 최대 24조, 즉 천둥 제거 창문에 최대 24행
    char a[24][32];//                 
    
  • 사용자 정의를 이용하여 끊임없이 다른 줄 수와 열 수를 설정하고 CE로 행렬 값을 선별하는 주소는 본 게임 보조가 서로 다른 단계에 적용되어야 하기 때문이다.
  • winmine.exe+5338과 winmine.exe+56A8은 뇌구 높이
  • winmine.exe+5334와 winmine.exe+56AC는 지뢰밭 넓이
  • winmine.exe의 기본 주소는 010000000입니다. 주의: 여러 개의 지뢰를 동시에 쳐도 모든 지뢰는 이 기본 주소입니다. 각 지뢰 간의 주소는 서로 독립됩니다!즉 4GB 메모리
  • (그리고 00000000에서 FFFFFFFFFFFF까지 4G의 주소로 바이트 단위로 설명할 수 있음)

  • Spy++ 메시지 찾기
  • microsoftspy++를 열고 메시지 버튼을 누르고 하트 아이콘을 지뢰 제거 창으로 드래그하여 식별하고 메시지 모니터링 WMLBUTTONDOWN 및 WMLBUTTONUP
  • 마우스로 지뢰밭의 네 개의 각을 차례로 클릭하여 클릭한 좌표를 얻은 다음에 행렬의 지뢰수를 제외하고 각 칸의 넓이를 얻는다. 여기는 16으로 계산되고 가장 왼쪽 위의 지뢰밭 중심 좌표는(20,60)
  • 이다.
  • VS 도움말 문서에서 WM 보기LBUTTONDOWN 및 WMLBUTTONUP에 대한 도움말 설명
  • MFC 게임 지원
    편집 상자 만들기, 속성 비헤이비어 True 설정, 읽기 전용, 바인딩 변수 생성, 변수 이름 mstrshowdata, 범주value
    창설 버튼, 설명 텍스트: 자동 지뢰 제거, 두 번 클릭 사실 현대 코드
    BOOL PostMessage(
    	__in HWND hWnd,
        __in UINT Msg,
        __in WPARAM wParam,
        __in LPARAM lParam,
    )//  ,SendMessage     
    
    void CwinmineDlg::OnBnClickedButton6(){
    	DWORD pid;
    	HWND hWnd = ::FindWindow(NULL, _T("  "));
    	if (NULL == hWnd) {
    		::MessageBox(NULL, _T("       "), _T("  "), MB_OK);
    		return;
    	}
    	GetWindowThreadProcessId(hWnd, &pid);
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    	if (NULL == hProcess) {
    		::MessageBox(NULL, _T("        "), _T("  "), MB_OK);
    		return;
    	}
    	/*
    		0x01005361    ,0x8F  
    		0x01005338   ,    16
    		0x01005334   ,    16
    	*/
    	unsigned char gamedata[24][32] = { 0 };
    	if (!ReadProcessMemory(hProcess, (LPCVOID)0x01005361, &gamedata, 24 * 32, &pid)) {
    		::MessageBox(NULL, _T("      "), _T("  "), MB_OK);
    		return;
    	}
    	DWORD rows;
    	if (!ReadProcessMemory(hProcess, (LPCVOID)0x01005338, &rows, sizeof(rows), &pid)) {
    		::MessageBox(NULL, _T("      "), _T("  "), MB_OK);
    		return;
    	}
    	DWORD columns;
    	if (!ReadProcessMemory(hProcess, (LPCVOID)0x01005334, &columns, sizeof(columns), &pid)) {
    		::MessageBox(NULL, _T("      "), _T("  "), MB_OK);
    		return;
    	}
    	m_strshowdata.Empty();
    	CString strTemp = _T("");
    	short gamex = 20;
    	short gamey = 60;
    	unsigned short xypos[2] = { 0 };
    	for (int i = 0; i < rows; i++) {
    		for (int j = 0; j < 32; j++) {
    			if (0x10 == gamedata[i][j]) {
    				break;
    			}
    			xypos[0] = gamex + j * 16;
    			xypos[1] = gamey + i * 16;
    			if (0x8F != gamedata[i][j]) {
    				::PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, *(int*)xypos);
    				::PostMessage(hWnd, WM_LBUTTONUP, 0, *(int*)xypos);
    			}
    			strTemp.Format(_T("%02x "), gamedata[i][j]);
    			m_strshowdata += strTemp;
    		}
    		m_strshowdata += _T("\r
    "); } UpdateData(FALSE); }

    넓히다
  • 자동소뇌는 위의 방법 외에 이미지를 식별한 다음에 사람의 사고를 모의하여 해독하는 방법도 있다. 이 방법은CE로 뇌구 데이터를 구할 필요가 없고 뇌구의 높이와 넓이
  • 좋은 웹페이지 즐겨찾기