#asm

wszystkie notatki oznaczone etykietą "asm"

More Boot Sector Games

Gry zakodowane w 512 bajtach, mieszczące się w boot-sectorze są fascynującym elementem sztuki programowania. Zaintrygowany fajną okładką i zdjęciem książki “More Boot Sector Games” w tweecie autora (Óscar Toledo G.) informującym o jej publikacji, nie mogłem tego nie “puścić dalej”. Nie sądziłem wtedy, że tym samym wezmę udział w konkursie, zostanę wylosowany i w rezultacie otrzymam darmowy egzemplarz w e-booku ;) Jest to sequel wydanej wcześniej książki “Programming Boot Sector Games” i jak sam autor podaje:

Czytaj dalej

Shellcode: EAT i funkcja GetProcAddress

Gdy już w swoich rękach mam adres bazowy modułu kernel32.dll (zlokalizowany na przykład sposobem opisanym w poprzednim moim wpisie) kolejnym krokiem jest poznanie adresu dowolnej funkcji znajdującej się w tym module. W wielu sytuacjach wystarczy dorwać się tylko do GetProcAddress i LoadLibrary, co ułatwi wykorzystanie dowolnej innej funkcji z Windows API lub innej biblioteki. W celu znalezienia potrzebnej funkcji w danym module, chociażby osławionego GetProcAddress, muszę sobie napisać jego prosty odpowiednik.

Czytaj dalej

x86/x64 Platform Independent Code

Znalazłem ciekawe tricki związane ze zmianami w opcodach instrukcji między x86 a x64. Odpowiednie wykorzystanie ich pozwala na łatwe wykrycie typu architektury i tworzenie wspólnej implementacji funkcji lub kodu dla obu tych platform. Co szczególnie może być użyteczne przy różnego rodzaju shellcodach i innych takich zabawkach. Nad takimi konstrukcjami w syringe zacząłem się zastanawiać, po tym, jak w minionym tygodniu zmieniłem pewien hack, związany z określeniem długości kodu wstrzykiwanego przy ładowaniu dll-ki do procesu.

Czytaj dalej

Blood2: Analiza cracka

Kolejna część dotycząca mojej starej ulubionej (ostatnio) gry, którą potraktowałem jako narzędzie analizy i zabawy w reverse enginering. Jak wspomniałem w poprzedniej (pierwszej) części, miałem problem ze znalezieniem odpowiedniego programu neutralizującego wymóg posiadania płyty CD. A wszystko na co trafiłem było jednosegmentowymi aplikacjami DOS-a. A jak wiadomo Windowsy 64-bitowe nie posiadają już subsystemu do odpalania 16-bitowych programów. Mimo, iż 64-bitowe procesory w trybie “long mode” jako tako dałyby radę z takim kodem, o ile nie wymagałyby wirtualnego trybu chronionego.

Czytaj dalej

Blood2: Crack me!

Jak zapewne niektórzy zauważyli na moim twitterze, (który staje się mini blogiem), ostatnio - tweet - uruchamiałem taką starą, wspaniałą grę z przełomu milenium, jaką jest Blood2: The Chosen. W młodości trochę w nią grywałem, jakiś sentyment pozostał. A że chciałem się trochę zrelaksować w weekend, a przy okazji spróbować skonteneryzować i uruchomić tą gierkę spod windowsowego kontenera przez spoon.net, nie pozostało mi nic innego jak po prostu sobie zagrać.

Czytaj dalej

Odwracanie kolejności w SSE/AVX

W ostatniej notce, o możliwościach zmiany kolejności uporządkowania bajtów i bibliotece ByteOrder, wspomniałem, że w wolnej chwili postaram pobawić się SSE i spróbować, w prosty i w miarę wydajny sposób, zaimplementować operację bswap znaną z 32/64-bitowych rejestrów na rejestrach 128-bitowych, a nawet 256-bitowych. Poniekąd udało mi się to zrobić ;) SSE2 Druga wersja strumieniowych rozszerzeń SMID dodała 144 nowych instrukcji do SSE. Kilka z nowych instrukcji całkowitoliczbowych, potrafiących zmieniać kolejność 16- i 32-bitowych elementów w 128-bitowym wektorze oraz instrukcji logicznych, będących w rzeczywistości rozszerzeniami instrukcji MMX dla wektorów XMM, mogą nam posłużyć do implementacji funkcji bswap128.

Czytaj dalej

ByteOrder - kolejność bajtów

Architektury współczesnych mikroprocesorów powszechnie używają dwóch różnych metod i konwencji przechowywania danych w pamięci, zwane “kolejnością bajtów” (byte order). Niektóre komputery umieszczają najbardziej znaczący bajt w słowie jako pierwszy (big-endian), a inne jako ostatni (little-endian). Przez większość czasu, kolejność bajtów może być ignorowana, programista nie musi się martwić o to, jaki format jest używany, ale w niektórych sytuacjach staje się to ważne. Kiedy implementujemy binarny format pliku, bibliotekę sieciową lub protokół, lub po prostu przesyłamy dane binarne miedzy innymi komputerami, musimy wziąć pod uwagę kwestie związane z uporządkowaniem bajtów.

Czytaj dalej

Proste haszowanie stringa

Haszowanie stringów z wykorzystaniem prostego algorytmu Roberta Sedgwicksa z książki “Algorithms in C”. Według testów różnych prostych algorytmów opublikowanych na stronie Hash Function Efficiency, można zauważyć, że to właśnie RS jest prostym i mało kolizyjnym algorytmem. Dlatego wybrałem go do użycia w swoim projekcie, do haszowania nazw funkcji serwisowych, eventów, hooków. Jego najprostsza implementacja w C++: unsigned int RSHash(char* str) { unsigned int a = 63689; unsigned int b = 378551; unsigned int hash = 0; while (*str) { hash = hash * a + static_cast<unsigned char>(*str); a = a * b; str++; } return hash; } W źródłach mirandy, użyty przez nią algorytm znalazłem w wersji C i Asemblera, więc naszła mnie mała ochota, aby mój algorytm również nieco zoptymalizować i przy okazji przypomnieć sobie bebechy asemblera ;)

Czytaj dalej