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.