Bagaimana Anda mengekstrak informasi variabel lokal (alamat dan jenis) dari program Delphi atau informasi debug yang dihasilkan oleh kompiler?

Tujuan saya:

  • Diberikan utas yang ditangguhkan dalam program Windows 32-bit atau 64-bit yang dikompilasi dengan Delphi untuk menjalankan stack (dapat dieksekusi)
  • Entri tumpukan yang ditentukan untuk mendaftar variabel lokal di setiap metode dan nilainya. Artinya, setidaknya, temukan alamat dan jenisnya (integer32 / 64 / signed / unsigned, string, float, record, class ...), kombinasi yang dapat digunakan untuk mencari nilainya.

Yang pertama itu indah, dan yang kedua adalah pertanyaan. Pada level tinggi, bagaimana Anda menghitung variabel lokal, mengingat catatan stack dalam Delphi?


Pada level rendah, inilah yang saya pelajari:

RTTI: tidak mencantumkan informasi metode tersebut. Itu bukan sesuatu yang pernah saya anggap sebagai pilihan realistis, tetapi enumerasi di sini.

Informasi Debugging: Mengunduh informasi debug yang dibuat untuk unit debugging.

  • File peta: bahkan file peta terperinci (file teks! Buka dan lihat) tidak mengandung informasi tentang variabel lokal. Ini pada dasarnya adalah daftar alamat dan nomor baris untuk file sumber. Bagus untuk menghubungkan alamat dan file, misalnya. titik biru di selokan; tidak cocok untuk detail lebih lanjut
  • Informasi tentang informasi debug jarak jauh (file RSM) - informasi yang tidak diketahui tentang konten atau formatnya.
  • File TD32 / TDS: seri penelitian saya saat ini. Mereka mengandung simbol global dan lokal di antara banyak detail lainnya.

Masalah yang saya temui adalah sebagai berikut:

  • Tidak ada dokumentasi untuk format file TD32 (yang dapat saya temukan.)
  • Sebagian besar pengetahuan saya tentang mereka berasal dari kode Jedi JED, menggunakannya (JclTD32.pas), dan saya tidak yakin bagaimana menggunakan kode ini, atau struktur di sana cukup luas untuk menunjukkan nilai lokal. Saya cukup yakin bahwa itu akan menangani karakter global, tetapi saya tidak yakin tentang yang lokal. Ada banyak konstanta yang berbeda dan tanpa dokumentasi untuk formatnya, untuk memahami apa artinya, kurasa. Namun, konstanta ini dan namanya harus berasal dari suatu tempat.
  • Sumber yang dapat saya temukan menggunakan informasi TDS tidak memuat atau memproses karakter lokal.

Jika ini adalah pendekatan yang tepat, maka muncul pertanyaan: "Apakah ada dokumentasi untuk format file TDS / TD32 dan apakah ada sampel kode yang memuat variabel lokal?"

Kode sampel tidak penting, tetapi bisa sangat berguna, meskipun sangat minim.

105
01 мая '15 в 19:17 2015-05-01 19:17 David M diatur pada 01 Mei, '15 pukul 19:17 2015-05-01 19:17
ответ 1 balasan

Periksa apakah ada simbol debug dalam format biner. Dimungkinkan juga untuk menggunakan GDB (di Windows - port It). Akan lebih bagus jika Anda menemukan file .dbg atau .dSYM. Mereka mengandung kode sumber, misalnya.

 gdb> list foo 56 void foo() 57 { 58 bar(); 59 sighandler_t fnc = signal(SIGHUP, SIG_IGN); 60 raise(SIGHUP); 61 signal(SIGHUP, fnc); 62 baz(fnc); 63 } 

Jika Anda tidak memiliki file debug, Anda bisa mencoba mendapatkan MinGW atau Cygwin dan menggunakan nm (1) ( halaman manual ). Ini akan membaca nama karakter dari kode biner. Mereka mungkin mengandung beberapa jenis, seperti C ++:

 int abc::def::Ghi::jkl(const std::string, int, const void*) 

Jangan lupa menambahkan parameter --demangle , atau Anda akan mendapatkan sesuatu seperti:

 __ZN11MRasterFont21getRasterForCharacterEh 

bukannya:

 MRasterFont::getRasterForCharacter(unsigned char) 
2
04 нояб. Jawabannya diberikan Top Sekret 04 Nov. 2015-11-04 04:51 '15 pada 4:51 2015-11-04 04:51