2009-06-11 20 views
9

Son zamanlarda, bir programın montaj düzeyinde hata ayıklaması gerekiyordu. Çok fazla montajcı deneyimim yok, bu yüzden bazı basit C programlarını yazıp, diğer insanların kodlarını ayıklamaya başlamadan önce dil için bir his uyandırmak için tek adım atmayı düşündüm. Ancak, gerçekten (-ggdb O0 ile derlenmiş) Ya bu iki hat yapılmış gcc alamadım:Bu montaj parçası nasıl çalışır?

MAX_SIZE 5 olmak # tanımlanmış ve ben 0x8 saklanan yerel bir değişken (olan
items[tail] = i; 
tail = (tail+1) % MAX_SIZE; 

(% ebp), sanırım). gdb göre, bu olur: 0x804963c öğelerin adresidir

0x08048394 <queue+17>: mov 0x8049634,%edx 
0x0804839a <queue+23>: mov 0x8(%ebp),%eax 
0x0804839d <queue+26>: mov %eax,0x804963c(,%edx,4) 
0x080483a4 <queue+33>: mov 0x8049634,%eax 
0x080483a9 <queue+38>: lea 0x1(%eax),%ecx 
0x080483ac <queue+41>: movl $0x66666667,-0xc(%ebp) 
0x080483b3 <queue+48>: mov -0xc(%ebp),%eax 
0x080483b6 <queue+51>: imul %ecx 
0x080483b8 <queue+53>: sar %edx 
0x080483ba <queue+55>: mov %ecx,%eax 
0x080483bc <queue+57>: sar $0x1f,%eax 
0x080483bf <queue+60>: mov %edx,%ebx 
0x080483c1 <queue+62>: sub %eax,%ebx 
0x080483c3 <queue+64>: mov %ebx,-0x8(%ebp) 
0x080483c6 <queue+67>: mov -0x8(%ebp),%eax 
0x080483c9 <queue+70>: shl $0x2,%eax 
0x080483cc <queue+73>: add -0x8(%ebp),%eax 
0x080483cf <queue+76>: mov %ecx,%edx 
0x080483d1 <queue+78>: sub %eax,%edx 
0x080483d3 <queue+80>: mov %edx,-0x8(%ebp) 
0x080483d6 <queue+83>: mov -0x8(%ebp),%ebx 
0x080483d9 <queue+86>: mov %ebx,0x804963 

beri ı C kodunun ilk satırı nasıl çalıştığını görebilirsiniz. Ayrıca, 0x8049634 kuyruğun adresidir, bu yüzden kuyruk + 33 ve kuyruk + 38% ecx = kuyruk + 1'e eşdeğerdir ... ama sonradan ne olduğuna dair hiçbir fikrim yok. Basit bir modülo bunun karmaşık olabileceğini kim düşünebilirdi?

cevap

14

Daha pahalı bir bölümleme talimatı yapmaktan kaçınmanın bir yolu. Ben de ilk defa karşılaştığımda oldukça şaşırdım. Eğlenceli olan şey, bu numara için kullanılan sihirli sayıların aranması (bu durumda 0x66666667) bu numarayı açıklayan sonuçlar verir. (Ben, kaynaklara sahip olmadığım için devam etmem gereken tek somut şey olduğuna inanıyorum.)

Hızlı arama, şu blog gönderisini verdi: http://blog.dkbza.org/2007/09/reverse-engineering-compiler-produced.html Altta bazı yararlı bağlantılar var. Bu hile üzerindeki bir kağıda dolaylı bağlantı da dahil olmak üzere).