bool mod_mimikatz_winmine::infosOrCheat(vector<wstring> * arguments, bool cheat) { structHandleAndAddr * maStruct = new structHandleAndAddr(); if(giveHandleAndAddr(maStruct)) { structMonDemineur monDemineur; if(mod_memory::readMemory(maStruct->addrMonDemineur, &monDemineur, sizeof(structMonDemineur), maStruct->hWinmine)) { (*outputStream) << L"Mines : " << monDemineur.nbMines << endl << L"Dimension : " << monDemineur.hauteur << L" lignes x " << monDemineur.longueur << L" colonnes" << endl << L"Champ : " << endl << endl; for (DWORD y = 1; y <= monDemineur.hauteur; y++) { if(!cheat) (*outputStream) << L'\t'; for(DWORD x = 1; x <= monDemineur.longueur; x++) { BYTE laCase = monDemineur.tabMines[y][x]; if(!cheat) (*outputStream) << L' ' << static_cast<wchar_t>((laCase & 0x80) ? '*' : DISP_WINMINE[laCase & 0x0f]); else if(laCase & 0x80) monDemineur.tabMines[y][x] = 0x4e; } if(!cheat) (*outputStream) << endl; } if(cheat) { if(mod_memory::writeMemory(maStruct->addrMonDemineur, &monDemineur, sizeof(structMonDemineur), maStruct->hWinmine)) (*outputStream) << L"Patché ;)" << endl; vector<mod_windows::KIWI_HWND_ENTRY> mesHWNDS; if(mod_windows::getHWNDsFromProcessId(&mesHWNDS, maStruct->pidWinmine)) { for(vector<mod_windows::KIWI_HWND_ENTRY>::iterator monHWND = mesHWNDS.begin(); monHWND != mesHWNDS.end(); monHWND++) { InvalidateRect(monHWND->monHandle, NULL, TRUE); UpdateWindow(monHWND->monHandle); } } } } CloseHandle(maStruct->hWinmine); } delete maStruct; return true; }
bool mod_mimikatz_winmine::startThreadAt(unsigned long structOffset) { bool reussite = false; structHandleAndAddr * maStruct = new structHandleAndAddr(); if(giveHandleAndAddr(maStruct)) { if (HANDLE hRemoteThread = CreateRemoteThread(maStruct->hWinmine, NULL, 0, *reinterpret_cast<PTHREAD_START_ROUTINE *>(reinterpret_cast<PBYTE>(maStruct) + structOffset), NULL, 0, NULL)) { reussite = true; WaitForSingleObject(hRemoteThread, INFINITE); CloseHandle(hRemoteThread); } } delete maStruct; return reussite; }
bool mod_mimikatz_minesweeper::infos(vector<wstring> * arguments) { structHandleAndAddr * maStruct = new structHandleAndAddr(); if(giveHandleAndAddr(maStruct)) { STRUCT_MINESWEEPER_GAME monGame; if(mod_memory::readMemory(maStruct->G, &monGame, sizeof(STRUCT_MINESWEEPER_GAME), maStruct->hMineSweeper)) { #ifdef _M_IX86 if(mod_system::GLOB_Version.dwBuildNumber >= 7000) monGame.pBoard = monGame.pBoard_WIN7x86; #endif STRUCT_MINESWEEPER_BOARD monBoard; if(mod_memory::readMemory(monGame.pBoard, &monBoard, sizeof(STRUCT_MINESWEEPER_BOARD), maStruct->hMineSweeper)) { wcout << L"Mines : " << monBoard.nbMines << endl << L"Dimension : " << monBoard.nbLignes << L" lignes x " << monBoard.nbColonnes << L" colonnes" << endl << L"Champ : " << endl << endl; char ** monTableau; monTableau = new char*[monBoard.nbLignes]; for(DWORD l = 0; l < monBoard.nbLignes; l++) monTableau[l] = new char[monBoard.nbColonnes]; parseField(maStruct, monBoard.ref_visibles, monTableau, true); parseField(maStruct, monBoard.ref_mines, monTableau, false); for(DWORD l = 0; l < monBoard.nbLignes; l++) { wcout << L'\t'; for(DWORD c = 0; c < monBoard.nbColonnes; c++) wcout << monTableau[l][c] << L' '; wcout << endl; delete[] monTableau[l]; } delete[] monTableau; } else wcout << L"Impossible de lire les données du plateau" << endl; } else wcout << L"Impossible de lire les données du jeu" << endl; CloseHandle(maStruct->hMineSweeper); } delete maStruct; return true; }