Mój cel to:
- Biorąc pod uwagę zawieszony wątek w skompilowanym Delphi 32 lub 64-bitowym programie Windows, aby przejść stos (wykonalne)
- Biorąc pod uwagę wpisy stosu, aby wyliczyć zmienne lokalne w każdej metodzie i ich wartości. Oznacza to, że przynajmniej znajdź ich adres i typ (integer32 / 64 / signed / unsigned, string, float, record, class ...), których kombinację można wykorzystać do znalezienia ich wartości.
Pierwsza jest w porządku, a druga, o którą chodzi w tym pytaniu. Na wysokim poziomie, jak wyliczyć zmienne lokalne, biorąc pod uwagę wpis stosu w Delphi?
Na niskim poziomie badałem to:
RTTI: nie wymienia tego rodzaju informacji o metodach. To nie było coś, co właściwie kiedykolwiek myślałem, że jest realistyczną opcją, ale i tak wymieniam tutaj.
Informacje debugowania: ładowanie informacji debugowania utworzonych dla kompilacji debugowania.
- Pliki map: nawet szczegółowy plik mapy (plik w formacie tekstowym! Otwórz jeden i zobacz) nie zawiera informacji o zmiennych lokalnych. Jest to po prostu lista adresów i numerów linii pliku źródłowego. Doskonały do korelacji adresu do pliku i linii, np. Niebieskie kropki w rynnie; niezbyt dobre dla bardziej szczegółowych informacji
- Informacje o zdalnym debugowaniu (plik RSM) - brak znanych informacji o jego zawartości lub formacie.
- Pliki TD32 / TDS: moja obecna linia badań. Zawierają symbole globalne i lokalne wśród wielu innych informacji.
Problemy, które tu napotykam, to:
- Nie ma dokumentacji formatu pliku TD32 (którą mogę znaleźć).
- Większość mojej wiedzy na ich temat pochodzi z kodu JCL Jedi, który ich używa (JclTD32.pas) i nie jestem pewien, jak używać tego kodu, ani czy struktury tam są wystarczająco rozbudowane, aby pokazać lokalne zmienne. Jestem prawie pewien, że poradzi sobie z globalnymi symbolami, ale jestem bardzo niepewny co do lokalnych. Istnieje wiele różnych zdefiniowanych stałych i bez dokumentacji formatu, aby przeczytać, co one oznaczają, zgaduję. Jednak te stałe i ich nazwy muszą skądś pochodzić.
- Źródło, które mogę znaleźć za pomocą informacji TDS , nie ładuje ani nie obsługuje symboli lokalnych.
Jeśli jest to właściwe podejście, wówczas pytanie brzmi: „Czy istnieje dokumentacja dotycząca formatu pliku TDS / TD32 i czy są jakieś próbki kodu, które ładują zmienne lokalne?”.
Przykładowy kod nie jest niezbędny, ale może być bardzo przydatny, nawet jeśli jest bardzo minimalny.
Odpowiedzi:
Sprawdź, czy jakiekolwiek symbole debugowania nie były w formacie binarnym. Możliwe jest również użycie GDB (w systemie Windows jego port). Byłoby wspaniale, gdybyś znalazł plik .dbg lub .dSYM. Zawierają kod źródłowy, np.
Jeśli nie masz żadnych plików do debugowania, możesz spróbować pobrać MinGW lub Cygwin i użyć nm (1) ( strona podręcznika ). Odczyta nazwy symboli z plików binarnych. Mogą zawierać pewne typy, na przykład te w C ++:
Nie zapomnij
--demangle
wtedy dodać opcji, bo otrzymasz coś takiego:zamiast:
źródło
strings
. Wyodrębni ciągi z dowolnego pliku binarnego. Zobacz stronę podręcznika . Spowoduje to wydrukowanie napisów, które mogą, ale nie muszą być pomocneZapoznaj się z http://download.xskernel.org/docs/file%20formats/omf/borland.txt Podręcznik otwartej architektury. Jest stary, ale może znajdziesz jakieś istotne informacje na temat formatu pliku.
źródło