Top 10 narzędzi do reversingu

Moja lista ulubionych i najczęściej wykorzystywanych narzędzi w reverse engineeringu.

1. HIEW

Bezapelacyjnie pierwsze miejsce. Narzędzie (w tym wypadku nie można mówić o nim jak o zwykłym hexedytorze), z którego najczęściej korzystam do edycji plików, kodu, do szybkiego odnajdywania tego co potrzeba.

Mimo konsolowego GUI jest to prawdziwy kombajn, bez którego nie wyobrażam sobie pracy w reversingu.

HIEW

http://www.hiew.ru/

2. OllyDbg

Kiedyś wpisałbym tutaj SoftICE, jednak jego lata panowania już minęły. OllyDbg mimo pewnych niedogodności względem SoftICE, godnie go zastąpił, głównie ze względu na system wtyczek, które bez wątpienia stanowią dzisiaj o sile tego debuggera (np. ODBScript, dzięki któremu można robić cuda i dzięki któremu na nowo odnalazłem radochę z pracy).

Również duża liczba zmodyfikowanych wersji OllyDbg świadczy o ogromnej rzeszy fanów tego debuggera.

OllyDbg

http://www.ollydbg.de/

3. IDA

Najlepszy deasembler na świecie, bez niego nie ma mowy o analizie plików binarnych ani prowadzenia projektu, który wymaga kilku miesięcy pracy przy modyfikacji jakiegoś oprogramowania.

Posiada wbudowany system wtyczek, język skryptowy, rozpoznawanie znanych funkcji z całej rzeszy kompilatorów i ich bibliotek oraz masę zaawansowanych funkcji ułatwiających analizę statyczną oraz dynamiczną.

IDA Pro

https://www.hex-rays.com/idapro/

4. FileMon i RegMon

Ex aequo na tym samym miejscu. Narzędzia, dzięki którym zaoszczedziłem kupę pracy przy śledzeniu działania aplikacji. Wystarczy odpalić, ustawić filtry i mamy wszystko co potrzeba, potem wystarczy znaleźć odpowiedni ciąg znaków w aplikacji, xref (you know the drill) itd.

Przy okazji nie wiem jak wy, ale do mnie zupełnie nie przemówiło zintegrowane narzędzie ProcMon.

RegMon

Linki — FileMon RegMon ProcMon

5. Hex Workshop

To czego nie ma HIEW ma Hex Workshop, główną zaletą Hex Workshop jest praca na wielu plikach, co znacznie ułatwia kopiowanie danych z jednego pliku do drugiego, porównywanie binarne plików.

Dodatkowe funkcje umilające życie to m.in. wbudowane hashowanie, przeglądanie zdefiniowanych struktur danych. Bardziej rozbudowanym hexedytorem, który mógłby zastąpić Hex Workshop w mojej bazie narzędzi jest WinHex, jednak zawsze był dla mnie zbyt toporny, aby stał się narzędziem, które klikam w pierwszej kolejności.

Hex Workshop

http://www.hexworkshop.com/

6. LordPE

Process viewer i dumper, który mimo już swojego zaawansowanego wieku, nadal jest przydatnym narzędziem, które umożliwia szybki zrzut pamięci wybranego procesu (oraz jego pamięci wirtualnej), odbudowę uszkodzonych struktur plików PE czy też szybką edycję flag sekcji exeków.

LordPE

LordPE

7. Universal Extractor i MultiExtractor

Czasami zdarza się, że trzeba rozpakować pliki instalatora, albo z binarki wyciągnąć wszystkie jego zasoby, te 2 narzędzia pozwalają sprawnie i szybko rozpakować wszystkie rodzaje instalatorów stosowane w dystrybucji oprogramowania oraz wyciągnąć chyba wszystkie multimedialne formaty plików ukryte w innych plikach binarnych.

Universal Extractor

Universal Extractor — http://legroom.net/software/uniextract

MultiExtractor v2.80a

MultiExtractor — http://www.multiextractor.com

8. .NET Reflector i JAD

Rozwój techniki sprawił, że nie da się już przejść obojętnie obok aplikacji .NET oraz tych w Javie, dlatego te 2 narzędzia prędzej czy później wylądują u każdego, kto zajmuje się reversingiem.

.NET Reflector

.NET Reflector — http://www.red-gate.com/products/reflector/
JAD — http://www.varaneckas.com/jad

9. eXeScope

Prosty i szybki viewer zasobów plików wykonywalnych, mimo, że są już zdecydowanie lepsze narzędzia (jak np. te wbudowane w Visual Studio), eXeScope przydaje się gdy trzeba szybko znaleźć coś w zasobach.

eXeScope

eXeScope

10. ImpREC

Narzędzie, bez którego nie obejdzie się żaden unpacking, w pewnym momencie i tak się przyda 🙂

ImpREC

ImpREC

Gdzie szukać innych narzędzi?

Jeśli szukasz narzędzi, odwiedź te strony:

Wykop wpis Zagłosuj na ten wpis na Wykopie

j00ru//vx tech blog

infoNie wiem w sumie czemu, ale jakiś czas temu j00ru otworzył swojego bloga i mimo, że jako pierwszy wpisałem się do komentarzy (sorry Gyn :P) zapomniałem jakoś o nim wspomnieć tutaj na Security News.

Blog jest po angielsku, ale to raczej nie powinno być dla nikogo problemem, artykułów jest na razie mało, ale za to są bardzo techniczne i myślę, że warto zajrzeć i zachęcić autora do kolejnych wpisów. Obecnie dostępne artykuły:

Strona bloga — https://j00ru.wordpress.com/

HASP Envelope

Sklonowany klucz HASPJakiś czas temu znajomy poprosił mnie o usunięcie zabezpieczenia HASP Envelope z aplikacji. HASP Envelope to rodzaj exe-protectora, który powoduje, że nie moża uruchomić aplikacji bez włożonego klucza sprzętowego (tzw. dongle) lub tak jak na obrazku, jego klona.

Opcje zabezpieczające systemu HASP Envelope może nie należą do najbardziej zaawansowanych, jakie obecnie są używane na rynku (chociaż jeśli chcemy śledzić kod z OllyDbg, musimy wesprzeć się pluginem ukrywającym jego obecność, najlepiej PhantOm Plugin), jednak utknąłem w pewnym momencie na zabezpieczeniu tabeli importów, które wykorzystuje technikę API redirectingu.

API redirecting w wydaniu firmy Alladin jest jednym z najbardziej uciążliwych w śledzeniu jakie widziałem, większość procedur wypełniających tabelę importów jest zmutowana albo poddana obfuskacji, co sprawia, że codeflow jest nielinearny i ciężki do śledzenia.

Piszę o procedurach wypełniających tabelę importów, bo jest to jedna z moich ulubionych metod uzyskiwania oryginalej tabeli importów, poprzez zpatchowanie procedur wypełniających importy (udało mi się tą metodą otworzyć zaledwie garstkę funkcji).

Na pewno ktoś pomyślał „Dlaczego nie skorzystałeś z ImpRec-a?”, programiści Alladina byli na tyle sprytni, że kod przekierowanych funkcji przechodzi przez masę równie zagmatwanych funkcji oraz wykorzystuje ciekawe mechanizmy jak kopiowanie stanu stosu przed bezpośrednim wywołaniem danej funkcji (czytaj protector musiał znać każdą API i ilość jej parametrów), co skutecznie blokuje wszystkie metody śledzenia wykorzystywane przez rebuilder ImpRec.

Trochę podłamany nieskutecznością standardowych metod, zacząłem kombinować jak do tego podejść. Po wielu próbach postanowiłem wykorzystać proste fakty:

  • znajomość położenia tabeli importów w pliku wykonywalnym
  • każde wywołanie funkcji API w końcu do niej doprowadzi

Tracing z wykorzystaniem ImpRec-a nie dał rezultatów, co nie znaczy, że ta metoda była nieskuteczna, jedynie jej implementacja.

Postanowiłem zbudować własnego tracera w oparciu o język skryptowy ODbgScript przeznaczony oczywiście dla debuggera OllyDbg. Idea jego działania jest następująca:

  • pobierane są kolejne adresy funkcji z tabeli importów
  • zachowywany jest stan rejestrów wejściowych
  • uruchamiane jest śledzenie warunkowe
  • sprawdzane są warunki
  • jeśli warunki się zgadzają, jesteśmy w kodzie funkcji API
  • jej adres jest umieszczany w tabeli importów
  • skok do początku

W trakcie pisania skryptu wyszło kilka faktów zabezpieczenia, wyżej wspomniane kopiowanie parametrów stosu w inne miejsce pamięci, co spowodowało, że tracer nie był w stanie rozpoznać, że jest w kodzie funkcji API, gdyż stan rejestru ESP przed wywołaniem funkcji i w jej kodzie był inny (takie warunki początkowo ustaliłem).

Metoda z kopiowaniem stanu stosu skutecznie uniemożliwia sprawdzanie adresu ESP, jednak stan stosu musi być zachowany dla poprawności wywoływanych funkcji, stąd nowym warunkiem było wprowadzenie na stos 2 fałszywych parametrów, można powiedzieć markerów,  które każdorazowo były sprawdzane, gdy wskaźnik kodu po śledzeniu warunkowym znajdował się poza przestrzenią adresową aplikacji (czyli w kodzie innej biblioteki).

;
; odbudowa tabeli IAT w aplikacjach
; zabezpieczonych HASP Envelope
;
  var     safe_eax
  var     safe_ecx
  var     safe_edx
  var     safe_esi
  var     safe_edi
  var     safe_ebx
  var     safe_esp
  var     safe_ebp

  var     iat_entry
  var     iat_entry_ptr
  var     iat_dword
  var     x
  var     y

  bphwcall                                ; usun bp na hardware id
  bc                                      ; i wszystkie normalne bp

  bphws   06688AF,"x"                     ; hw bp na OEP

  run

; tu jestesmy w OEP

; zachowaj stan rejestrow do call-a
  mov     safe_eax,eax
  mov     safe_ecx,ecx
  mov     safe_edx,edx
  mov     safe_esi,esi
  mov     safe_edi,edi
  mov     safe_ebx,ebx
  mov     safe_esp,esp
  mov     safe_ebp,ebp

; poczatek tabeli importow
  mov     iat_entry,0685000

resolve_next_api:

; kilka funkcji WinAPI musi być pominietych
  cmp     iat_entry,0685108               ; DecodePointer?
  je      resolve_api_skip
  cmp     iat_entry,06851AC
  je      resolve_api_skip

  mov     iat_entry_ptr,[iat_entry]
  cmp     iat_entry_ptr,0
  je      resolve_api_skip

  cmp     iat_entry_ptr,50000000
  je      resolve_api_skip

; czy to instrukcja CALL (1 instrukcja api redirectingu)?
  mov     iat_dword,[iat_entry_ptr]
  and     iat_dword,0FF
  cmp     iat_dword,0E8
  jne     resolve_api_skip

; zachowaj na stosie fałszywe markery
  exec
          push    0AAAAAABB
          push    066AA9F
  ende

  mov     eip,iat_entry_ptr

; run trace into

trace_again:
  ticnd   "eip > 50000000"                ; przerwij śledzenie
                                          ; jesli EIP > 50000000

  cmp     eip,07C80929C                   ; GetTickCount
  je      trace_skip
  cmp     eip,07C813093                   ; IsDebuggerPresent
  je      trace_skip

; sprawdz czy na stosie znajduje sie markery
  mov     y,esp
  add     y,4
  cmp     [y],0AAAAAABB
  je      trace_hit

trace_skip:

  rtu
  jmp     trace_again

trace_hit:

; pause
  bphwcall

  log     eip

; wstaw oryginalny adres funkcji API
  mov     [iat_entry],eip

; przywroc stan rejestrow
  mov     eax,safe_eax
  mov     ecx,safe_ecx
  mov     edx,safe_edx
  mov     esi,safe_esi
  mov     edi,safe_edi
  mov     ebx,safe_ebx
  mov     esp,safe_esp
  mov     ebp,safe_ebp

  jmp     resolve_api_next

resolve_api_skip:

; pause

resolve_api_next:

  add     iat_entry,4
  cmp     iat_entry,685340
  jb      resolve_next_api

resolve_api_exit

  ret

Skrypt nie jest idealny, gdyż kilka funkcji API śledzonych tą metodą powoduje zawieszenie debuggera (należy je ręcznie dodać do omijanych pozycji z tabeli IAT), dodane także musiały być metody sprawdzające czy wskaźnik kodu nie znajduje się w funkcjach WinAPI wykorzystywanych w kodzie API redirectingu (wskutek czego ich adresów nie ma w odbudowanej tabeli IAT i trzeba ręcznie je skorygować).

To by było na tyle, jeśli ktoś zna jakąś ciekawszą metodę na odbudowę tabeli importów w plikach zabezpieczonych HASP Envelope chętnie wysłucham waszych komentarzy.

ReverseCraft ruszył – videokurs dla Reverserów!

Redakcja UW-Team.org znana z publikacji w internecie darmowych kursów poruszających tematykę bezpieczeństwa webowego, programowania w językach PHP i JavaScript, opublikowała wczorajszego dnia (22.04.2009) na swoim portalu, nową serie Videoartów poświeconą Reverse Engineeringowi.

Kurs pod nazwą ’ReverseCraft’ prowadzony jest przez programistę i reversera – Gynvaela Coldwinda. Autor w swych filmach prezentuje, w jaki sposób, krok po kroku, przeanalizować nieznaną dla nas na początku aplikację i jak zmodyfikować jej kod.

Seria tutoriali podzielona jest na sezony – każdy z nich dotyczy innej
aplikacji i tematyki. Obecnie do pobrania na stronie znajduje się pilotażowy (trwający blisko 40 minut) odcinek pierwszego sezonu. Kolejne odcinki z tej serii, publikowane będą w 4-5 dniowych odstępach.

http://www.uw-team.org/video_reverse.html

gynvael.coldwind//vx.log

W natłoku spraw pozaserwisowych umknął mi gdzieś nowo otwarty blog techniczny autorstwa Gynvaela Coldwinda, tak więc serdecznie polecam, ciekawe artykuły techniczne (m.in. o metodach hookowania zastosowanych w przeglądarce Google Chrome), relacje ze spotkań traktujących o bezpieczeństwie systemów informatycznych, a nawet techniczne aspekty tworzenia gier komputerowych.

http://gynvael.coldwind.pl/

Praca w Xenocode

Firma Xenocode produkująca obfuscatory .NET oraz narzędzia wirtualizujące dla aplikacji poszukuje ludzi na stanowisko Software Engineer, wymagana znajomość reverse engineeringu oraz C#

Więcej na:
http://www.xenocode.com/Company/Jobs.aspx

PS.
Taka ciekawostka, spójrzcie na ich produkt Virtual Application Studio i porównajcie do Thinstall :), ktoś tu chyba kupił licencję, nawet opis mają prawie kropka w kropkę 🙂