Dekompilacja programow napisanych w vc++

0

Ostatnio zainteresowalem sie zagadnieniem dekompilacji exe-ków do asm ... i w zwiazku z tym mam takie pytanie: jakiego disassemblera najlepiej uzyc? Najlepszy jaki ja znalazlem to PEDasm, uzywjac go udalo mi sie nawet skompilowac z powrotem zrodlo do exe (dll). Tylko ze w wiekszosci przypadkow to albo skompilowana powtornie wersja nie dziala albo nie da sie tego wcale skompilowac.
Wiec moze ktos zna jakiegos lepszego disassemblera? Czy raczej nie ma lepszego i w w wiekszosci przypadkow nie da sie tego zrobic?

0

W32Dasm for Windows

BTW to dekompilacja czy deasemblacja?

0

BTW to dekompilacja czy deasemblacja?
Jak zwal tak zwal....
Teraz pewnie sie zblaznie no ale coz ... w asm ekspertem nie jestem. Wiec zapytam: jak ten kod skompilowac z powrotem do exe-ka? To jest tylko listing :| Mam to skopiowac do pliku asm i skompilowac w MASM ?? W PEDasm wiedzialem jak to zrobic, bo tworzyl gotowy plik asm do kompilacji MASM. Wiec moze jakies wskazowki ??

0

nie probowałbym tego w żaden sposób kompilować z powrotem. Temat był juz zreszta poruszany i fajnie gdybys raczył odpalić wyszukiwarke. Wszystko zostało juz powiedziane i wayjasnione dośc dokładnie.

0
othello napisał(a)

BTW to dekompilacja czy deasemblacja?
Jak zwal tak zwal....
Złe podejście - te dwa terminy różnią się od siebie znacznie.

Dekompilacja to powrót do kodu w natywnym języku - możliwe np. w programach pisannych w Assemblerze, Javie, środowisku .NET

Disassemblacja to zamiana kodu maszynowego na kod Assemblera zrozumiały dla człowieka.

0

No wlasnie: dla mnie chodzi o to zeby to skompilowac z powrotem! Szukalem w wyszukiwarce ale na temat dekompilacji i ponownej kompilacji nic nie znalazlem.

Uzywajac PEDasm uzyskuje wszystko co jest potrzebne do ponownej kompilacji do pliku wykonywalnego, czyli:

  • plik zrodlowy z rozszerzeniem .asm
  • pliki .def z definicjami importowanych funkcji, sluzace do utworzenia plikow .lib

....teraz wystarczy odpalic microsoftowego masm i mozna kod z powrotem skompilowac do postaci wykonywalnej.

Problem jest tylko tego typu, ze to nie zawsze dziala, tzn albo uzyskany w ten sposob plik exe czy dll nie dziala tak jak trzeba, albo plik zrodlowy asm nie daje sie skompilowac i niestety dzieje sie tak w 9 przypadkach na 10.

Pytanie po co to? Ja tego uzywalem zeby calkowicie przetlumaczyc na polski niektore programy (chodzilo o przetlumaczenie tych tekstow ktore nie sa w zasobach programu).

Wiec moje pytanie bylo takie: czy nie istnieja jakies lepsze narzedzia do tego? Nie chce mi sie wierzyc ze nie, przeciez crackowanie programow chyba mniej wiecej na tym polega, ze zamienia sie program na .asm, zmienia sie go i ponownie kompiluje? Czy myle sie?

A jezeli ten temat juz byl wyjasniony na forum to chyba ja zle szukam :| Gdybym znalazl odpowiedz gdzie indziej to chyba bym nie pytal tutaj?

Maroneed: moze i masz racje ze zle sie wyrazilem, ale to nie to jest tu najwazniejsze...

0
Marooned napisał(a)

Disassemblacja to zamiana kodu maszynowego na kod Assemblera zrozumiały dla człowieka.

zależy dla jakiego człowieka - niektórzy może rozumią kod maszynowy i można napisać że jest zrozumiały dla człowieka ;P

0
othello napisał(a)

Najlepszy jaki ja znalazlem to PEDasm

To licho szukasz - najlepsza jest IDA - kilka razy zdisasemblowałem skompilowałem dosyc duże execi napisane w vc++ . Poszukaj - naprawdę warto.

othello napisał(a)

Nie chce mi sie wierzyc ze nie, przeciez crackowanie programow chyba mniej wiecej na tym polega, ze zamienia sie program na .asm, zmienia sie go i ponownie kompiluje? Czy myle sie?

Tak, mylisz się. Cracker modyfikuje zwykle tylko pojedyńcze bajtyw kodzie programu np. mamy taki kod:

0x00401000    cmp [trigger], 1
              jnz   _nie_zarejestrowany

to możemy załatwić na 2 sposoby: zamiast skoku warunkowego umieścić 2 nop'y; ciekawsza metoda: pierwszy bajt tego skoku to bodajże 0x75 /albo 0x74 - piszę z pamięci/ natomiast następny bajt zawiera odległość skoku liczoną od następnej instrukcji - czyli jeżeli damy 0x00 to obojętne czy skok się wykona czy nie przejdzie do tej samej następnej instrukcji.
next: chcemy aby w okienku 'About...' było coś innego niż 'unregistered':

przykład:
push _UNREGISTERED
push eax
call   [SetWindowTextA]

... 
_UNREGISTERED db 'UNREGISTERED', 0

jak to przerobić? szukany odpowiedniej ilości bajtów zerowych na końcu którejkolwiek sekcji i wpisujeby tam hexedytorem np:
0x501234 'Cracked by Deus', 0

a w poprzednim kodzie zamiast adresu UNREGISTERED w pushu wstawiamy 0x501234 czyli

push _0x501234 ; Cracked by Deus
push eax
call   [SetWindowTextA]

Tak mniej/więcej [raczej mniej bo to temat-rzeka] wygląda łamanie najprostszych zabezpieczeń

takie pytania zadawaj najlepiej na http://woodmann.com/bart/forum/

0

Deus: dzieki za wyczerpujaca odpowiedz.

Jaka wersje IDA masz? Ja mam IDAPro demo 4.8. Nie moge utworzyc z powrotem pliku exe, bo wyswietla ze ten typ pliku nie jest obslugiwany.

Cytat z pomocy:

IDA produces executable files only for: - MS DOS .exe - MS DOS .com - MS DOS .drv - MS DOS .sys - general binary - Intel Hex Object Format - MOS Technology Hex Object Format

Wyglada na to ze mozna tworzyc tylko pliki dla Dos-a :| A wczytywac tylko windows PE :| O co tu chodzi?

//
Podsumowujac, jezeli dobrze rozumiem, to wcale nie potrzebuje disassemblacji i ponownej kompilacji zeby pozamieniac stringi w exe-ku? Wystarczy ze umiesze takiego stringa pod innym adresem i pozniej zmienie odwolanie do niego ?
Na przyklad moge umiescic pod adresem 0x501234 tekst 'Cracked by Deus' .

Tylko jednego nie rozumiem:

w poprzednim kodzie zamiast adresu UNREGISTERED w pushu wstawiamy 0x501234

Przeciez mam edytowac exe-ka w edytorze binarnym, wiec w jaki sposob "w pushu wstawic 0x501234" ? Innymi slowy, jakie bajty i w jaki sposob trzeba zmienic zeby odwolanie do poprzedniego adresu stringa zmienic na odwolanie do adresu przykladowo 0x501234 ????

0

tak tak hiew to swietne narzedzie, oprocz mozliwosci wstawiania po prostu kodu asm od razu przerabianego na MCL to pokazuje rozne bajery typu naglowki pliku EXE itd i tlumaczy adresy CALLi do API na ich nazwy, bardzo przydatne narzedzie :]

0
Deus napisał(a)

Najlepiej zaopatrzyć się w tzw. 'Świętą trójcę' czyli SoftICE+IDA+HIEW
Ja zamiast IDA używam Win32DAsm - reszta bez zmian :>

0

OK wiec chyba juz wiem mniej wiecej jak to dziala - Deus wirtualne [browar] dla ciebie sam bym do tego nie doszedl ;)

BTW: ten link do ida ktory mi podales....no spoko tylko mam transder 500 b/s :| moze sprobuje pozniej to zassac ... no a ten link do hiew nieaktualny, sciagnalem z innej strony, tyle ze to wersja demo ech

0
Deus napisał(a)

szukamy odpowiedniej ilości bajtów zerowych na końcu którejkolwiek sekcji i wpisujemy tam...
Deus - czy byłbyś w stanie wyjaśnić to nieco jak szukać tych miejsc? Albo podać jakiś miły arcik o tym. Wszelkie zmiany w kodzie to raczej potrafię ;) ale że ja wychowany na ASMie w DOSie to nigdy nie zgłębiłem tajników sekcji PE ;)

Kiedyś miałem nawet arta jak dodać własną sekcję, tam wrzucić swój kod i podpiąć go pod program. Przykładem było chyba wysyłanie treści notepada na maila z menu. Ale gość założył, że wiemy jak obsługiwać się z sekcjami. Próbowałem to powtórzyć ale coś mie nie wyszło (zmiany w sekcjach ProcDumpem).

Z góry dzięx

0

Jakies dziwne pytanie, jak to jak szukac?? Chyba widac gdzie sa same zera?? Pod koniec sekcji text na przyklad. Ja bym raczej zapytal co zrobic wtedy, jak nie mozna znalezc odpowiedniej liczby zer ... dodac swoja sekcje?
Zreszta jak zauwazyle to wszystkie stringi sa w sekcji text i przewaznie jeszcze sporo wolnych zer zostaje.

0

To jednak nie zawsze daje sie tak prosto zrobic, w odwolaniu do stringa nie zawsze jest po prostu push i adres :| Chcialem zmienic tekst wyswietlany w zakladkach w ustawieniach wtyczki in_midi.dll winampa, zakladka Display.
Wiec w hiewie znalazlem stringa Display, wcisnalem F6 i widze cos takiego:

mov    [ecx][01],ds

A z tym to juz nie mam pojecia co zrobic :|

Ale naglowek okna czy teksty w ComboBox mozna spokojnie pozmieniac i to rzeczywiscie dziala.

0

Odwolań do stringa szukaj pod IDą - przechodzisz do zakładki strings, klikasz 2x, potem nazwę stringa i naciskasz [x] . Masz wszystkie odwołania. Przechodzisz do pierwszego, ustawiasz na nim kursor, i w czwartym panelu statusbara widzisz raw offset w pliku. Odpalasz hiew'a, F4->Decode, F5, wpisujesz raw offset z idy. zawsze masz push'a albo mov lub lea /no, prawie zawsze/ potem F3 i F2. Masz w okienku instrukcję i modyfikujesz co w niej trzeba np. 'mov eax, 0412345' na 'mov eax, adres_naszego_stringa' a 'lea esi, [598765]' na 'lea esi, [adres_naszego_stringa']'. Jeżeli mamy adres string'a zapisany w dword'zie to postępujemy podobnie: tak jak poprzednio - zaznaczasz dworda wskazujęcedo na string, do Hiewa, F4->Hex, F5->raw offset, F3 i wpisujemy adres naszego stringa w notacji odwrotnej czyli zaniast 01234567 /01, 23, 45, 67/ wstawiamy 67452301 /67, 45, 23, 01/.
...i tak dalej z kolejnymi odwołaniami do kolejnych stringów.
Czasem jest problem w programach, które mają kilka wersji językowych, a chcemy aby niezależnie od języka był ten sam text np.w CloneCD jest call do procedury, która zwraca text 'niezarejestrowany' - ale 'call addr' ma tyle samo bajtów co 'mov eax, addr /naszego textu/' - zmieniamy i po kłopocie :). Tylko, że takie miejsca jeżeli nie są widoczne pod disasmem trzeba wyśledzić debuggerem.

0

Wiec tak: w IDA ten string nazywa sie aDisplay_0, klikam na ta nazwe i wciskam x (chodzi tu o xrefs?). W czwartym panelu statusbara mam 00014384, jak wpisze to w hiewie to przekieruje mnie do:

jb    .0100143EA

..tyle ze to raczej nie jest chyba to, bo jak przelacze na hex to pod tym adresem jest litera "e" z innego stringa :| (przyznaje sie ze nie wiem co oznacz instrukcja jb) .

Wcisnalem OK w tym okienku, czyli przenioslem sie do adresu xref i mam cos takiego:

100158C4     dd offset aDisplay_0 ;"Display"

Czyli wyglada ze to tu jest odwolanie do stringa "Display". Sprobowalem w hiewie skoczyc pod adres 100158C4 i mam teraz cos takiego:

add     [eax][84000000],al

... a z tym znowu nie bardzo wiem co mam zrobic

Ta sama instrukcje pokazuje mi po znalezieniu stringa Display w hex-edytorze i wcisnieciu F6 :|

Sory ten poprzedni post dotyczyl stringa "Device" a nie "Display", ale w kazdym razie czegos tu nie rozumiem...

Wiem ze marudny jestem ale moze moglbys mi wyjasnic o co tu chodzi....

0

Nie jestem fanem WinAmp'a ale... dobra, ściągnąłem tego plug-in'a z http://support.xmplay.com/Plugins_Files/in_midi.exe. polecam ściągnięcie tego samego, będę tłumaczył na przykładzie wspomnianego stringa 'Display'.

-przechodzisz na zakładkę [Strings]
-klikasz 2x na 'Display'
-przenosi cię to do wspomnianego stringa nazwanego przez IDę 'aDisplay_0'
-klikasz na 'aDisplay' i wciskasz x /czyli xref/
-pojawia się okno z listą odwołań /a dokładniej z jednym/- wybierasz odwołanie i [ok]
-lądujesz tu /adres może być inny jeśli masz inną wersję pliku/:

_data:100158C4                 dd offset aDisplay_0    ; "Display"

-patrzysz na raw offset /4 panel statusbara/ - u mnie jest tam 000142C4hh
-masz adres stringa zapisany w zmiennej, nie zaś w kodzie, więc musisz zmienić wartość tej zmiennej...
-odpalasz hiewa, ładujesz pliczek i F4->Hex - widok w hexach poniewaz chcemy edytować dane, nie kod
-F5 i wpisujesz wspomniany raw offset czyli u mnie 000142C4hh [enter]
-masz teraz kursor ustawiony na zmiennej wskazującej oryginalnego stringa - wartość 84, 59, 01, 10 /ciemniejszy kolor sugeruje, że dany dword zawiera prawidłowy offset w pliku/, więc trzeba wstawić do zmiennej adres naszego stringa.
-powiedzmy, że masz tego naszego stringa pod adresem 10018000.
-czas na edycję - F3 i wpisujemy adres naszego stringa do czterech kolejnych bajtów /dworda/ w notacji intela czyli odwrotnie - najpierw ostatni bajt nowego adresu w pierwszym bajcie zmiennej wskaźnikowej itd. czyli 00, 80, 01, 10
-F9 czyli update

już dokładniej się nie dało. Trzeba było dokładniej przeczytac co napisałem w jednym z poprzednich postów...
Polecam zapoznanie się z asmem dokładniej zanim będziesz działał dalej, najlepiej z http://www.rag.kgb.pl/aoapl.php

0

OK dzieki za odpowiedz. No wlasnie dlatego nie wiedzialem co zrobic ze adres stringa byl zapisany w zmiennej a nie w kodzie ... coz nie znam asma czas sie poduczyc...

Dzieki i pozdro

0
Deus napisał(a)

i jeszcze jedno polecam rejestrację na http://woodmann.com/bart/forum/ ...
Po rejestracji każą sobie czekać na maila aktywacyjnego - na razie od czasu rejestracji minęło ok. 14h a maila jak nie było tak nie ma...

Bardzo szczelne forum :|

0

nie moja wina - może bart za dużo wypił... swoją drogą dziwne, ostatnio przybyło tak z 20 nowych userów, a żaden nie miał problemów.
poczekamy zobaczymy... tylko, że jesteś już zarejestrowanym userem. Zadnej aktywacji być /chyba/ nie powino...

0
Deus napisał(a)

jesteś już zarejestrowanym userem. Zadnej aktywacji być /chyba/ nie powino...
ale jest - link aktywacyjny.. cóż.. 20h oczekiwań i nic - trudno się mówi ;)

W takim razie tu będę pytał niedługo, bo mam właśnie sprawę ewidentnie na tamto forum.

OK, koniec sprawy, bo w sumie to nie o tym wątek przecież :/

0

Pisz do admina na [email protected] bo dziwnie to wygląda...

//thx, pomogło... - M

1 użytkowników online, w tym zalogowanych: 0, gości: 1