2017-09-06 55 views
8

jeśli przypadkowo zapomnę przełączyć się na konfigurację wydania przed zwolnieniem mojego programu, czy ma to znaczenie pod względem łatwiejszego dekompilacji lub inżynierii wstecznej mojego kodu?Czy jest łatwiejsze do inżynierii wstecznej lub złamać program Delphi, jeśli plik exe został skompilowany z ustawieniami kompilatora debugowania?

Na przykład, jeśli przypadkowo użyć następujących opcji debugowania kompilatora:

1. Compiling: 
    - StackFrames = True 

2. Debugging 
    - Debug information = Debug information 
    - Local Symbols = True 
    - Symbol Reference info = Reference Info 

3. Linking 
    - Map File = Detailed 

Przeczytałem pomocy iz tego co mogę powiedzieć, to nie robi dużej różnicy, chyba że plik mapy jest również jakoś zwolniony z plik binarny, więc zastanawiam się, jak duża jest różnica, jeśli ktoś ma plik mapy?

+2

W przypadku pliku mapy użytkownik ma rzeczywiste nazwy funkcji i przesunięcia pamięci. Bez tego użytkownik musi nadawać nazwy wszystkim funkcjom, które wybiera dezasembler. –

+1

Zawsze kompiluję do wydania z pełnymi informacjami debugowania, szczegółowym plikiem mapy itp. Jest to potrzebne do tworzenia śladów stosu dla raportów o błędach. Ale nie wysyłam pliku mapy do klienta ani żadnych informacji debugowania. –

+0

Jakiej wersji Delphi używasz? – Vasek

Odpowiedz

10

Rozjaśnijmy jeden po drugim opcje Pan wspomniał:

  • Compiling > Stack frames: ramki stosu są potrzebne tylko do debugowania (a może generować ślady stosu dla raportowania błędów, jak wspomniano przez @DavidHeffernan w komentarze). Nawet jeśli włączysz to w kompilacjach wersji, nie będzie to zbyt pomocne w inżynierii wstecznej.
  • : Przy tej opcji zestaw informacji debugowania jest kompilowany wewnątrz jednostek DCU, aby pomóc w debugowaniu wewnątrz IDE. Nie jest podłączony do exe, więc jest oczywiste, że nie pomoże to w inżynierii wstecznej.
  • Debugging > Local symbols: Z tego zestawu opcji, kompilator zawiera podstawowe informacje na symbol w informacji debugowania, ale znowu, to tylko pomaga podczas debugowania na IDE i nie jest powiązana w końcowy exe.
  • Debugging > Symbol reference info > Reference info: Dodatkowo do poprzedniej opcji, ten zawiera szczegółowe informacje o jednostkowych lokalnego symboli (zmienne, stałe klas i tak dalej) do pomocy w debugowanie. Nie są również powiązani z ostatecznym exe.
  • Linking > Map file > Detailed: Z tego zestawu opcji, łącznik stworzą szczegółowy .map plik zawierający wszystkie informacje (typ, nazwa, adres, wielkość itd) o symbolach programu, tak, oczywiście byłoby pomocne dla odwrocie inżynieria IF rozpowszechniasz ten plik wraz ze swoim exe (zgodnie z @RemyLebeau w komentarzach).

Istnieje również możliwość generowania zdalnych symbole debugowania, jak wskazano przez @dummzeuch:

  • Linker > Include remote debug symbols: Ta opcja mówi łącznik, aby wygenerować plik .rsm, to odpowiednik Delphi Microsoft .pdbProgram Database Files. Jeśli rozpowszechnisz ten plik, możesz mieć poważne kłopoty, ponieważ można łatwo debugować aplikację, wizualizować symbole, funkcje i procedury, jeden krok kodu i tak dalej.

Ponadto uważam, że ważne jest, aby stwierdzić, że pliki .map nie są równoważne plikom .pdb. Dla Delphi Win32, odpowiednikiem jest .rsm. Nie pracowałem z Delphi od lat, ale o ile pamiętam, żadna wersja Delphi Win32 nie może generować plików .pdb. Tylko Delphi dla .NET może.

Powiedział, wróćmy do pytania:

zastanawiam ile różnica to sprawia, że ​​jeśli ktoś ma plik mapy?

Inżynieria odwrotna byłaby znacznie łatwiejsza dzięki plikowi .map. W przeszłości widziałem niektóre narzędzia, które mogą nawet przekonwertować plik .map na plik .dbg do użytku z debugerem.

Czy łatwiej inżynierii wstecznej lub przerwać program Delphi, jeśli plik exe został skompilowany z ustawieniami debugowania kompilatora?

Cóż, jedną ważną (i być może najbardziej zauważalną) cechą kompilacji debugowania jest większy rozmiar exe. Dzieje się tak głównie dlatego, że w konfiguracji debugowania kompilator wyłącza szereg optymalizacji kodu w celu ułatwienia debugowania kodu. Istnieje również wiele kodowania debug-warunkowego (np .: w dyrektywach {$IFDEF DEBUG}), który zostaje połączony z plikiem EXE.

Jako efekt uboczny, kod generowany przez kompilację debugowania jest o wiele łatwiejszy do inżynierii wstecznej, ponieważ jest prostszy do zrozumienia.

+2

Istnieje również możliwość umieszczenia symboli zdalnego debugowania w pliku wykonywalnym (na stronie opcji Linker). To może pomóc w inżynierii wstecznej. – dummzeuch

+0

@dummzeuch Zapomniałem o tym. Jest teraz dołączony. Dzięki. – karliwson

+0

Ups, wspomniałem złą opcję: faktycznie miałem na myśli "Uwzględnij informacje debugowania TD32" w Delphi 2007 (bez pomysłu, czy jest on nadal dostępny w późniejszych wersjach), który jest faktycznie dodany do pliku exe. – dummzeuch