Minesweeper Consultant & Solitaire Expert

Minesweeper Consultant & Solitaire Expert

  • Comments 2
  • Likes

Opisaną poniżej sztuczkę pokazywałem ostatnio w ramach demo podczas sesji na spotkaniu WiT i na prośbe uczestniczek opisuję ją jeszcze raz i powoli.

Na początek, należy zaopatrzyć się w Debugging Tools for Windows i grę Minesweeper z Windows XP. System, na którym przeprowadzamy doświadczenie nie ma znaczenia. Chodzi o to, żeby w uruchomionym procesie winmine.exe odpowiedzialnym za grę Minesweeper, tak zmodyfikować kod, aby funkcja wyświetlająca planszę była przekonana, że ma wyświetlić wszystkie miny. W efekcie robi to, a gra staje się szybka i przyjemna, choć nieco nudnawa.

Aby osiągnąć zamierzony cel, należy kolejno:

  1. Uruchomić program winmine.exe. Posłużyłem się angielską wersją 5.1.2600.0 i ostrzegam, że w innych może być nieco inaczej.
  2. Uruchomić debugger. Sugeruję użycie WinDBG, choć twardzieli nie powinien przerażać również CDB lub NTSD. Wszystkie trzy programy pochodzą z Debugging Tools i choć praktycznie nie różnią się funkcjonalnością w przypadku debugowania winmine.exe, to WinDBG ma najbardziej przyjazny interfejs. Ponieważ mój program winmine.exe jest programem 32 bitowym, powinniśmy użyć narzędzi w wersji x86. Należy pamiętać, że zależy to od programu, w który ingerujemy a nie od systemu, na którym wszystko instalujemy i uruchamiamy.
  3. Jeżeli działa i proces i debuger – można się do procesu przypiąć: należy nacisnąć F6 i wybrać, który proces mamy na myśli. Należy pamiętać, że bez praw administratora lista procesów będzie mocno tajemnicza, jednak winmine.exe się na niej znajdzie i będziemy mogli się podłączyć.
    image 

    Warto zwrócić uwagę, że proces winmine.exe ulegnie zatrzymaniu. Teraz rządzimy nim my! Opcja noninvasive może się przydać, jeżeli  później będziemy chcieli zamknąć debugger, pozostawiając działający proces.
  4. Kolejnym krokiem jest sprawdzenie gdzie w pamięci znajduje się kod wykonywalny programu. Każdy proces w systemie Windows ma swoją strukturę zwaną PEB czyli Process Environment Block. Struktura ta jest dokładnie udokumentowana na przykład w MSDN, a w debuggerze można ją wyświetlić poleceniem !peb Wśród wielu ciekawych informacji, dla naszych potrzeb najważniejsze jest pole zaczynające się od offsetu 8 czyli ImageBaseAddress. Jego wartość wskazuje na adres pod którym zaczyna się kod wykonywalny programu.
     image
  5. Interesuje nas liczba 14047 czyli szesnastkowo 36FA Przemilczę (z kilku różnych powodów) metodę pozyskania tej liczby, jednak ważna jest dla tego, że pod tym adresem znajduje się prosta instrukcja OR sprawdzająca czy już pora na wyświetlenie min. Naciskając Alt+7 można wyświetlić kod wykonywalny programu.  Nas interesuje kod pod adresem 010036fa (szesnastkowo), który opisać można jako (wskazywany polu ImageBaseAddress w strukturze PEB)+14047. Adres ten należy wpisać w pole offset.
    image

  6. Zamiast wyliczać nową wartość zmiennej przy pomocy OR, wpiszemy tam gotową wartość równą 138, czyli każemy programowi wykonać operację MOV BYTE PTR [EAX], 8Ah. W tym celu potrzebujemy tą instrukcję przełożyć na bajty (C6 00 8A) które wpiszemy pod zadany adres. W debuggerze, robi się to poleceniem eb (enter bytes). W efekcie, instrukcja, którą należy wprowadzić ma postać: eb poi(@$peb+8)+36FA C6 00 8A
  7. Po wydaniu polecenia, w oknie "disassembly" powinien pojawić się stosowny kod opisany powyżej. Jeżeli tak jest – można nakazać procesowi dalszą pracę poleceniem G jak GO!
  8. Minesweeper powinien zacząć pracę, obsługując najpierw hurtem wszystkie komunikaty systemowe, które dostał, gdy był zatrzymany.
  9. Gdy każemy aplikacji namalować nową planszę – podmieniona przez nas funkcja wyświetli wszystkie miny.

image


Miłej zabawy!

Warto przy tym pamiętać, że od Windows 2000, programiści mają możliwość oznaczania (przy pomocy funkcji VirtualProtect) fragmentów swojego kodu jako niemodyfikowalny. Gdyby twórcy naszego Minesweepera tak zrobili – cała zabawa zakończyłaby się niepowodzeniem. Nie zadbano o to jednak (istnieje wiele możliwych powodów), dzięki czemu proste demo kończy się całkiem interesującym efektem.

Autor: Grzegorz Tworek [MVP]

Comments
  • Czy możliwe jest otwarcie kart zakrytych w grze Solitaire?

  • Nic mi o tym nie wiadomo. Ale za głęboko nigdy nie szukałem... Może kiedyś, w wolnej chwili.... Bo teoretycznie, to czemu nie? ;)

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment