Article View: pl.comp.os.linux.programowanie
Article #133OGLOSZENIE: disassembler
From: Andrzej Radecki
Date: Thu, 02 Sep 1999 15:56
Date: Thu, 02 Sep 1999 15:56
72 lines
3570 bytes
3570 bytes
Witam!
Napisałem nakładkę (parser) na objdump'a. Działa to tak:
objdump -x --source <plik wykonywalny>|disasm
lub
objdump -xd <plik wykonywalny>|disasm
Parser ten konwertuje to co wypluwa objdump do postaci pliku html w ten
sposób, że każdemu skokowi odpowiada odnośnik. Przy czym można poruszać się
nie tylko w kierunku wywoływania funkcji ale i odwrotnym - przejść do
miejsca, z którego została wywołana funkcja. Myślę, że najlepiej wyjaśnić
to na przykładzie: (zrzut ekranu z Lynx'a)
int findstr(const char *dest, const char *source)
{
8048a6a 8048a7b 8048b62 8048b9e 8048e79
8048f0e 8048f88 8048fa2 8048fbc 8048fd6
8048ff0 804900a 8049024 804903e 8049058 <-*tu* są odnośniki
8049072 804908c 80490a6 80490c0 80490da do punktów, z
80490f4 804910e 8049128 8049142 804915c nastąpił skok
8049176 8049190 80491aa 80491c4 80491de do tego miejsca
80491f8 8049212 804922c 8049246 804925c
8049272 8049288 804929e 80492b4
80487f0: 55 pushl %ebp
80487f1: 89 e5 movl %esp,%ebp
80487f3: 83 ec 04 subl $0x4,%esp
80487f6: 57 pushl %edi
80487f7: 56 pushl %esi
80487f8: 53 pushl %ebx
int i,j;
int dlength=strlen(dest);
80487f9: 30 c0 xorb %al,%al
80487fb: 8b 7d 08 movl 0x8(%ebp),%edi
[...]
8048826: 39 c3 cmpl %eax,%ebx
8048828: 7f 33 jg 804885d <findstr+0x6d> <-a *tu*
804882a: 89 c7 movl %eax,%edi jest odnośnik do
for (j=0; j < slength; j++) adresu 0x804885d
Poza tym wstawia do instrukcji skoków nazwy procedur linkowanych dynamicz
nie. (nie wiem dlaczego objdump zostawiał w tych miejscach numerki)
W sumie te funkcje to żadna nowość, wcześniej spotkałem się z podobnie
działającym programem pod Win* (w32dasm). Na własnej skórze przekonałem się
jak pożyteczne to narzędzie. ;-) To rozwiązanie ma również wady. Naj
ważniejszą jest wrażliwość na funkcje wirtualne (nie sposób ustalić co
znajduje się w rejestrze bez uruchamiania programu). Drugą wadą jest
czasochłonność. Tych odnośników jest naprawdę dużo więc przy dużych
programach mogą pojawić się problemy. Właśnie dlatego napisałem to w C a
nie np. perlu - może choć trochę przyspieszy to operacje.
Program testowałem wraz z objdump'em w wersji:
GNU objdump 2.9.1
na formacie plików:
elf32-i386
Jeśli ktoś zauważy jakieś problemy, pokusi się o jakieś zmiany lub ma
jakieś pomysły to proszę o kontakt.
Program można znaleźć pod adresem:
http://www.wpk.p.lodz.pl/~radecki/disasm.tar.gz
Później skrobnę jeszcze do niego odpowiednią stronkę.
Pozdrawiam,
--
( /6/ Andrzej Radecki
==== \ radecki@wpk.p.lodz.pl
/ | http://www.wpk.p.lodz.pl/~radecki
Technical Details
Message-ID:
<slrn7st7gu.26s.radecki@radek.localdomain>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!radek.localdomain!radeckiShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!radek.localdomain!radecki From: radecki@wpk.p.lodz.pl (Andrzej Radecki) Newsgroups: pl.comp.os.linux.programowanie,pl.comp.os.linux Subject: OGLOSZENIE: disassembler Followup-To: pl.comp.os.linux.programowanie Date: 2 Sep 1999 15:56:15 GMT Organization: home Lines: 72 Message-ID: <slrn7st7gu.26s.radecki@radek.localdomain> NNTP-Posting-Host: ppp-119.lodz.tpnet.pl Mime-Version: 1.0 User-Agent: slrn/0.9.5.7 (UNIX) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit