Öğrenme derlemesi [kapalı]


102

Assembly dilini öğrenmeye karar verdim. Bunu yapmanın ana nedeni, demonte edilmiş kodu anlayabilmek ve belki kodun daha verimli kısımlarını yazabilmek (örneğin, c ++ aracılığıyla), kod mağaraları gibi şeyler yapmaktır. Zilyonlarca farklı montaj çeşidi olduğunu gördüm. yani, bahsettiğim amaçlar için nasıl başlamalıyım? Ne tür bir montaj öğrenmeliyim? Önce bazı kolay programları (yani bir hesap makinesi) yaparak öğrenmek istiyorum, ancak amacın kendisi onunla hesaplaşmak olacak, böylece örneğin IDA Pro tarafından gösterilen kodu anlayabileyim.

Windows kullanıyorum (bu herhangi bir fark yaratırsa).

düzenleme: Öyle görünüyor ki, herkes MASM'yi gösteriyor. Üst düzey yeteneklere sahip olduğunu anlasam da, hepsi montaj kodu programcısı için iyi, aradığım bu değil. Görünüşe göre popüler deassembler'larda (IDA gibi) gösterilmeyen if, invoke vb. Talimatları var. Öyleyse, mümkünse duymak istediğim şey, ASM'yi sadece "genel" montaj programcıları değil, sorduğum amaçlar için (IDA'da demonte edilmiş exe kodunu okuyan) kullanan herkesin görüşü.

düzenle: Tamam. Ben zaten montajı öğreniyorum. Benim için önemli olmayan yüksek seviyeli şeyleri kullanmayarak MASM öğreniyorum. Şu anda yaptığım şey, __asm ​​direktiflerindeki kodumu c ++ 'da denemek, böylece her şeyi MASM ile sıfırdan yapmak zorunda kaldığımdan çok daha hızlı deneyebilirim.



Evet, onu da okuyordum. Ama sorum biraz daha "odaklanmış" diyorum.
elysium yiyip

Windows'taysanız, hedef (bu işlemci ve dolayısıyla komut kümesi) x86 veya x86-64'tür. Başka bir makine veya bir MCU kartı almadığınız veya bir emülatör kullanmadığınız sürece. Peki, soru hangi assembler'ı kullanmalıyım? Yoksa gerçekten hangi mimariyi hedef alacağınızı mı soruyorsunuz? Şahsen ben m68k serisi yongalarda ayarlanan güzel ortogonal talimatlara bayılıyorum, ne yazık ki.
dmckee --- eski moderatör kedi

2
"If, invoke, vb komutları var gibi görünüyor" - Bunlar makrolardır ("MASM" deki 'M') ve assembler onları desteklese bile bunları kullanmak zorunda değilsiniz.
ChrisW

3
65. soruya olumlu oy vermek zor bir karardı, 64 çok güzel bir sayı. . .
735 Tesla

Yanıtlar:


40

MASM32 ile başlayın ve oradan FASM'ye bakın . Ancak MASM ile çok eğleneceksiniz.


MASM'den haber aldım. Yanılmıyorsam, çözülmüş koda baktığımda görmediğim birçok "yüksek seviyeli" özelliğe sahip. Mantıklı geliyorsa, çoğu sökücünün çıktı kodu gibi bir şey programlamak istiyorum.
42'de elysium yiyip

1
Bu, temelde işlem kodları yazmak gibi olurdu, ki bu gerçekten mantıklı değil. MASM32'yi öğrenmek, kodun bir hata ayıklayıcıda nasıl göründüğünü anlamanıza yardımcı olacaktır. Ayrıca OllyDbg
Noon Silk

7
Meclisi anlamıyorsun. Anlamalısın. İşlem kodu bir sayıdır. Hata ayıklayıcılar işlem kodlarını talimatlarına göre çözmeye çalışır (bazen zordur). Temel talimatları anlamanız gerekir. MASM'yi öğrenmek bunu yapmanıza yardımcı olacaktır. Daha fazla söylemeye gerek yok.
Noon Silk

5
Tüm MASM özelliklerini sadece orada oldukları için kullanmak zorunda değilsiniz; Bu şekilde daha fazlasını öğreneceğinizi düşünüyorsanız, okumayı istediğiniz kadar zorlaştırabilirsiniz.
JasonTrue

3
MASM, tuhaflıkları, hataları ve sözde üst düzey özellikleriyle, montaj programcılarını - hem yeni başlayanlar hem de uzmanlar - aklıma gelen her şeyden daha fazla karıştırdı.
IJ Kennedy

46

Bunu birçok kez yaptım ve yapmaya devam ediyorum. Öncelikli amacınızın assembler okumak ve yazmak olduğu bu durumda, bunun geçerli olduğunu düşünüyorum.

Kendi sökücünüzü yazın. Bir sonraki en büyük sökücüyü yapmak amacıyla değil, bu kesinlikle sizin için. Amaç, talimat setini öğrenmektir. Bir zamanlar tanıdığım bir platform için assembler'ı hatırlayarak, yeni bir platformda assembler öğreniyor olsam da. Yalnızca birkaç satır kodla başlayın, örneğin yazmaçlar ekleyin ve ikili çıkışın sökülmesi ile giriş tarafına gittikçe daha karmaşık talimatlar eklemek arasında ping pinging yapın:

1) belirli bir işlemci için talimat setini öğrenin

2) her komutta her opcode bitini sallayabilmeniz için söz konusu işlemci için assemble kod yazmanın nüanslarını öğrenin

3) talimat setini, geçimini sağlamak için bu talimat setini kullanan mühendislerin çoğundan daha iyi öğrenirsiniz.

Sizin durumunuzda birkaç sorun var, normalde başlamak için ARM komut setini öneriyorum, bugün diğerlerinden daha fazla ARM tabanlı ürün gönderiliyor (x86 bilgisayarlar dahil). Ancak, şu anda ARM kullanıyor olmanız ve ARM'ın yapmaya çalıştığınız şeye yardımcı olabileceğini veya olmayabileceğini bilerek başlatma kodunu veya diğer rutinleri yazması için yeterli derleyici bilmeme olasılığınız. ARM için ikinci ve daha önemli neden, komut uzunluklarının sabit boyutta ve hizalı olmasıdır. X86 gibi değişken uzunluktaki komutları sökmek, ilk projeniz gibi bir kabus olabilir ve buradaki amaç, bir araştırma projesi oluşturmamak için talimat setini öğrenmektir. Üçüncü ARM, iyi hazırlanmış bir komut setidir, kayıtlar eşit oluşturulur ve bireysel özel nüanslara sahip değildir.

Yani hangi işlemciyle başlamak istediğinizi belirlemeniz gerekecek. Önce msp430 veya ARM'yi, ardından ARM'yi önce veya ikinci olarak sonra x86'nın kaosunu öneririm. Hangi platform olursa olsun, kullanmaya değer herhangi bir platformun, talimat setini ve işlem kodlarının (makine dilinin bitleri ve baytları) kodlamasını içeren, satıcıdan bağımsız veri sayfaları veya programcı referans kılavuzları vardır. Derleyicinin ne yaptığını ve derleyicinin uğraşmak zorunda olmadığı kodun nasıl yazılacağını öğrenmek amacıyla, birkaç komut seti bilmek ve her optimizasyonda her derleyici ile her komut setinde aynı yüksek seviyeli kodun nasıl uygulandığını görmek iyidir. ayarı. Kodunuzu yalnızca bir derleyici / platform için daha iyi, ancak her biri için çok daha kötü hale getirdiğinizi bulmak için optimize etmek istemezsiniz.

Değişken uzunluktaki komut setlerini sökmek için, basitçe başlangıçta başlayıp her dört baytlık kelimeyi, ARM'de yaptığınız gibi veya msp430 gibi her iki baytta olduğu gibi bellekte doğrusal olarak sökmek yerine (msp430'un değişken uzunluklu talimatları vardır, ancak yine de kesme vektör tablosundaki giriş noktalarında başlarsanız, bellekte doğrusal olarak ilerler). Değişken uzunluk için bir vektör tablosuna dayalı bir giriş noktası bulmak veya işlemcinin nasıl önyüklendiğini ve kodu yürütme sırasına göre takip etmek istiyorsunuz. Kaç bayt kullanıldığını bilmek için her komutun kodunu tamamen çözmeniz gerekir, o zaman komut koşulsuz bir dal değilse, bu komuttan sonraki baytı başka bir komut olarak kabul edin. Tüm olası şube adreslerini de saklamanız ve bunların daha fazla talimat için başlangıç ​​bayt adresleri olduğunu varsaymanız gerekir. Başarılı olduğum bir seferde ikili dosyadan birkaç geçiş yaptım. Giriş noktasından başlayarak, bu baytı bir talimatın başlangıcı olarak işaretledim ve ardından koşulsuz bir dala ulaşana kadar bellek yoluyla doğrusal olarak kodunu çözdüm. Tüm şube hedefleri, bir talimatın başlangıç ​​adresleri olarak etiketlendi. Yeni şube hedefi bulana kadar ikili üzerinden birden çok geçiş yaptım. Herhangi bir anda 3 baytlık bir talimat söylerseniz, ancak herhangi bir nedenle ikinci baytı bir talimatın başlangıcı olarak etiketlediyseniz, bir sorununuz varsa. Kod yüksek seviyeli bir derleyici tarafından oluşturulmuşsa, derleyici kötü bir şey yapmadıkça bu gerçekleşmemelidir, Eğer kodun elle yazılmış assembler'ı varsa (örneğin eski bir arcade oyunu gibi), r0 = 0 gibi asla gerçekleşemeyen koşullu dallar ve ardından sıfır değilse de bir sıçrayış olması oldukça olasıdır. Devam etmek için bunları ikili programın dışında düzenlemeniz gerekebilir. X86'da olacağını düşündüğüm acil hedefleriniz için bir sorununuz olacağını düşünmüyorum.

Gcc araçlarını öneririm, mingw32, hedefiniz x86 ise Windows'ta gcc araçlarını kullanmanın kolay bir yoludur. Eğer mingw32 plus msys değilse, binutils ve gcc kaynaklarından çapraz derleyici oluşturmak için mükemmel bir platformdur (genellikle oldukça kolaydır). mingw32'nin cygwin'e göre çok daha hızlı programlar gibi bazı avantajları vardır ve cygwin dll cehenneminden kaçınırsınız. gcc ve binutils, C veya assembler'da yazmanıza ve kodunuzu parçalarına ayırmanıza izin verir ve üçünden birini veya tümünü nasıl yapacağınızı gösteren okuyabileceğinizden daha fazla web sayfası vardır. Bunu değişken uzunlukta bir komut seti ile yapacaksanız, bir sökücü içeren bir alet seti kullanmanızı şiddetle tavsiye ederim. Örneğin, x86 için üçüncü taraf bir parçalayıcı, doğru şekilde sökülüp sökülmediğini asla bilemeyeceğiniz için kullanımı zor olacak. Bunların bir kısmı da işletim sistemine bağlıdır, amaç, modülleri, veriden bilgi işaretleme talimatlarını içeren bir ikili formatta derlemek, böylelikle ayırıcı daha doğru bir iş yapabilir. Bu birincil hedef için diğer seçiminiz, incelemeniz için doğrudan assembler'a derleyebilen bir araca sahip olmak ve ardından ikili formatta derlendiğinde aynı talimatları oluşturmasını ummaktır.

Sorunuzun kısa (tamam, biraz daha kısa) cevabı. Bir talimat setini öğrenmek için bir sökücü yazın. RISCy ve ARM gibi öğrenmesi kolay bir şeyle başlardım. Bir komut setini öğrendikten sonra, diğerlerini almak çok daha kolay hale gelir, genellikle birkaç saat içinde, üçüncü komut setiyle, sözdizimi için veri sayfasını / referans kılavuzunu kullanarak neredeyse anında kod yazmaya başlayabilirsiniz. Kullanmaya değer tüm işlemcilerin, talimatları işlem kodlarının bit ve baytlarına kadar açıklayan bir veri sayfası veya başvuru kılavuzu vardır. ARM gibi bir RISC işlemcisini ve x86 gibi bir CISC'yi, farklılıklar konusunda bir fikir edinmeye yetecek kadar öğrenin, her şey için kayıtlardan geçmek zorunda kalmak veya daha az kayıtla veya hiç kayıt olmadan doğrudan bellek üzerinde işlem yapabilmek gibi şeyler. Üç işlenen komutuna karşı iki vb. Yüksek seviye kodunuzu ayarlarken, birden fazla işlemci için derleyin ve çıktıyı karşılaştırın. Öğreneceğiniz en önemli şey, yüksek seviyeli kod ne kadar iyi yazılırsa yazılsın derleyicinin kalitesinin ve yapılan optimizasyon seçimlerinin gerçek talimatlarda büyük bir fark yaratmasıdır. Llvm ve gcc'yi (binutils ile) öneririm, ne üretmezharika kod, ancak bunlar çok platformlu ve çok hedeflidir ve her ikisinin de optimize edicileri vardır. Ve her ikisi de ücretsizdir ve çeşitli hedef işlemciler için kaynaklardan kolayca çapraz derleyiciler oluşturabilirsiniz.


Cevap için teşekkürler. Ama bir sökücüyü nasıl yazacağımı bile bilmiyorum.
elysium yiyip

8
"Kendi sökücünüzü yazın" - Katılıyorum, onu en iyi bu şekilde öğrendim. ("Ama bir demonte ediciyi nasıl yazacağımı bile bilmiyorum" ne demek?) LOL.
slashmais

Seninle gidiyorum! Az önce bir MSP430 ve bunun üzerine bir kitap aldım ... :)
Pepe

1
Bazı msp430 örneklerim var github.com/dwelch67 artı öğrenme asm vb. Dahil olmak üzere deney yapmak için birkaç komut seti simülatörüm var
old_timer

Bu fikir gerçekten çok hoşuma gitti.
Millie Smith

34

El ile yazacağınız montaj ve bir derleyici tarafından oluşturulan montaj, yüksek seviyeden bakıldığında genellikle çok farklıdır. Elbette, programın iç kısımları çok benzer olacaktır ( a = b + csonuçta kodlamanın yalnızca pek çok farklı yolu vardır ), ancak bir şeyi tersine çevirmeye çalıştığınızda sorun olmazlar. Derleyici, basit çalıştırılabilir dosyalara bile bir ton standart kod ekleyecektir : En son karşılaştırdığımda, GCC tarafından derlenen "Merhaba Dünya" yaklaşık 4kB idi, oysa montajda elle yazılırsa yaklaşık 100 bayttır. Windows'ta daha kötü: en son karşılaştırdığımda (kuşkusuz, bu geçen yüzyıldı) elde edebileceğim en küçük "Merhaba Dünya", daha sonra oluşturmak için seçtiğim Windows derleyicimi 52kB idi! Genellikle bu şablon yalnızca bir kez çalıştırılır, bu nedenle program hızını fazla etkilemez - yukarıda da söylediğim gibi, programın çekirdeği, yürütme süresinin çoğunun harcandığı kısım, derlenmiş veya derlenmiş olsun, genellikle oldukça benzerdir. elle yazılmış.

Günün sonunda bu, uzman bir montaj programcısı ve uzman bir sökücünün iki farklı uzmanlık olduğu anlamına gelir . Genellikle aynı kişide bulunurlar, ancak gerçekten ayrıdırlar ve mükemmel bir montaj kodlayıcısı olmayı öğrenmek, tersine mühendisliği öğrenmenize o kadar yardımcı olmaz.

Yapmak istediğiniz, Intel ve AMD'den IA-32 ve AMD64 (ikisi birlikte ele alınmıştır) mimari kılavuzlarını almak ve talimatlar ve işlem kodlarıyla ilgili ilk bölümlere bakmaktır. Yalnızca assembly dilinin temellerini öğrenmek için assembly dili üzerine bir veya iki öğretici okuyabilirsiniz. Sonra küçük birİlgilendiğiniz örnek program ve onu parçalarına ayırın: kontrol akışına adım atın ve ne yaptığını anlamaya çalışın. Bak bakalım başka bir şey yapmak için yama yapabilecek misin? Sonra başka bir programla tekrar deneyin ve daha yararlı bir hedefe ulaşmak için yeterince rahat olana kadar tekrarlayın. Tersine mühendislik topluluğu tarafından üretilen ve tersine mühendislik ile ilgilenen kişilerin ellerini denemeleri ve yol boyunca bir şeyler öğrenmeleri için zorluklar oluşturan "crackmes" gibi şeyler ilginizi çekebilir. Zorluk derecesi temelden (buradan başlayın!) İmkansıza kadar değişir.

Her şeyden önce, sadece pratik yapman gerekiyor . Diğer birçok disiplinde olduğu gibi, tersine mühendislik ile pratik mükemmelleştirir ... veya en azından daha iyi .


Yüksek seviyeli bir dil ile herhangi bir şey derlediğinizde, ihtiyaç duyulmayan çok sayıda "çöp" kodu elde edeceğinizi biliyorum, bu kod doğrudan derlemede kodlanmıştır. Ayrıca, uzman bir montaj programcısı ile uzman sökücü arasında bir fark olduğunu da anlıyorum. Ancak aynı şey hemen hemen her şey için de söylenebilir.
elysium yiyip

3
Benim endişem, teoride kağıtları okuyabilir ve ne anlama geldiklerini anlayabilirken, bir şeyleri kendim yazmaya başlayana kadar gerçekten anlayacağıma inanmıyorum. Küçük kod parçalarını değiştirerek başlayabileceğimi söylüyorsunuz, ancak bunu yapmak için önce örneğin IDA pro'nun ne tür derleme "çeşidi" kullandığını bilmeliyim.
elysium yiyip

Ayrıca, MSVC ++ satır içi derleme kodu için ne kullanır? MASM?
elysium yiyip

15

Çoğu cevaba karşı çıkacağım ve Knuth'un MIPS RISC mimarisinin MMIX varyantını önereceğim . Bu, x86 veya ARM montaj dilleri kadar pratik olarak kullanışlı olmayacak (bugünlerde çoğu gerçek hayattaki işlerde çok önemli oldukları için değil ... ;-), ancak sizin için Knuth'un en son büyüsünün kilidini AÇACAKTIR. Algoritmalar ve veri yapılarının derin ve düşük düzeyde anlaşılması üzerine şimdiye kadarki en büyük şaheserin versiyonu - TAOCP , "Bilgisayar Programlama Sanatı". Alıntı yaptığım iki URL'deki bağlantılar, bu olasılığı keşfetmeye başlamak için harika bir yoldur!


12

(Seni bilmiyorum ama montajla heyecanlandım)

Montajı denemek için basit bir araç bilgisayarınızda zaten yüklüdür.

Başlat menüsü-> Çalıştır'a gidin ve yazındebug

hata ayıklama (komut)

hata ayıklama , DOS, MS-DOS, OS / 2 ve Microsoft Windows'ta (yalnızca x86 sürümleri, x64 değil), debug.exe (veya DOS'un eski sürümlerinde DEBUG.COM) programını çalıştıran bir komuttur. Hata ayıklama, kullanıcıların bellek içeriklerini etkileşimli olarak incelemesine (derleme dilinde, onaltılık veya ASCII'de), değişiklikler yapmasına ve COM, EXE ve diğer dosya türlerini seçmeli olarak yürütmesine olanak tanıyan bir derleyici, dağıtıcı veya onaltılık döküm programı olarak işlev görebilir. Ayrıca belirli disk sektörlerine, G / Ç bağlantı noktalarına ve bellek adreslerine erişmek için kullanılan birkaç alt komuta da sahiptir. MS-DOS Hata Ayıklama, 16 bitlik bir işlem düzeyinde çalışır ve bu nedenle, 16 bit bilgisayar programlarıyla sınırlıdır . FreeDOS Debug, 32 bit DPMI programlarını da destekleyen bir "DEBUGX" sürümüne sahiptir.

Öğreticiler:


IDA Pro'da (veya OllyDbg'de ) gördüğünüz kodu anlamak istiyorsanız , derlenmiş kodun nasıl yapılandırıldığını öğrenmeniz gerekir. Reversing: Secrets of Reverse Engineering kitabını tavsiye ederim.

debugMontajı öğrenmeye başladığımda birkaç hafta denedim (15 yıl önce).
Not o debugbaz makine düzeyinde eserler hiçbir üst düzey montaj komutları vardır.

Ve şimdi basit bir örnek: Montaj kodunu yazmaya başlamak için

verin a- aşağıdaki programı yazın - ve son golarak çalıştırın.

alternatif metin


( eğer kayıt olarak ayarlanmışsa , kayıtta INT 21saklanan ASCII karakterini ekranda görüntüleyin - programı sonlandırır)DLAH2INT 20


"G" girmeden önce ctrl-c'ye basmam gerekiyordu.
ericp

2
@ericp, ctrl-c'ye basmanız gerekmez. Örneğin, amontaj kodunu yazmaya başlamak için & [girin] yazarsınız. [Enter] tuşuna iki kez basarsanız montaj modundan çıkarsınız. gÇalıştırmak için & [girin] (varsayılan olarak ofset 100).
Nick Dandoulakis

aslında bir yığın taşmasına neden oluyor mu yoksa sadece ekrana mı yazıyor?
Janus Troelsen

1
@user, sadece bu sitenin adını yazıyor :-)
Nick Dandoulakis

@JanusTroelsen bu numaralar (53, 74, 61, vb.) 'S' 't' 'a' için ASCII kodları ... Her Int21 çağrısı bir seferde bir karakter yazdırıyor! Bu yüzden montaj daha hızlı DEĞİLDİR :)
doug65536

8

Bulduğum Sömürü Sanat: Hacking şimdiye kadar doğrudan bilgiyi kullanmış söyleyemeyiz ... Bu konu haline ilginç ve faydalı yol olarak, ama okumak bu yüzden gerçekten değil. Size kodunuzun derlendiği talimatların çok daha zengin bir şekilde takdir edilmesini sağlar, bu da bazen daha küçük hataları anlamada yararlı olmuştur.

Başlıktan vazgeçmeyin. Kitabın ilk bölümünün çoğu, kelimenin Eric Raymond anlamında "Hacking" dir: Zor problemleri çözmek için yaratıcı, şaşırtıcı, neredeyse sinsi yollar. Ben (ve belki de sen) güvenlik yönleriyle çok daha az ilgileniyordum.


8

En azından ilk başta, mecliste program yazmaya odaklanmam. Eğer x86 kullanıyorsanız (Windows kullandığınız için öyle olduğunuzu varsayıyorum), öğrenmenin bir nevi anlamsız olduğu tonlarca garip özel durum vardır. Örneğin, birçok talimat, açıkça adlandırmadığınız bir kayıt defteri üzerinde çalıştığınızı varsayar ve diğer talimatlar bazı kayıtlarda çalışıp diğerlerinde çalışmaz.

Temelleri anladığınız, ardından hemen derleyicinizin çıktısını anlamaya çalıştığınız, amaçladığınız mimari hakkında yeterince şey öğrenirdim. Kendinizi Intel kılavuzlarıyla donatın ve doğrudan derleyicinizin çıktılarına dalın. İlgilendiğiniz kodu küçük bir işleve ayırın, böylece her şeyi anladığınızdan emin olabilirsiniz.

Temelleri şöyle düşünürdüm:

  • kayıtlar: kaç tane var, isimleri nedir ve boyutları nedir?
  • işlenen sırası: add eax, ebx"eax'a ebx ekle ve sonucu eax'a kaydet" anlamına gelir.
  • FPU: kayan nokta yığınının temellerini ve fp'ye / fp'den nasıl dönüştürdüğünüzü öğrenin.
  • adresleme modları: [taban + ofset * çarpanı], ancak çarpan yalnızca 1, 2 veya 4 (veya belki 8?)
  • çağrı kuralları: parametreler bir işleve nasıl aktarılır?

Çoğu zaman derleyicinin ne yayınladığı şaşırtıcı olacaktır. Derleyicinin neden bunun iyi bir fikir olacağını düşündüğünü anlamanın bir bulmaca haline getirin. Size çok şey öğretecek.

Muhtemelen Agner Fog'un el kitaplarıyla , özellikle de birini listeleyen talimatlarla kendinizi donatmanıza yardımcı olacaktır . Modern işlemcilerde doğrudan ölçmek daha zor olsa da, size her bir talimatın kabaca ne kadar pahalı olduğunu söyleyecektir. Ancak, örneğin, derleyicinin neden bu kadar uzağa gittiğini açıklamaya yardımcı olacaktır.idiv talimat .

Diğer tek tavsiyem, bir seçeneğiniz olduğunda her zaman AT&T yerine Intel sözdizimini kullanmanızdır. Bu noktada oldukça tarafsızdım, bazı talimatların ikisi arasında tamamen farklı olduğunu anladığım güne kadar (örneğin, movslqAT&T sözdiziminde movsxdIntel sözdizimindedir). Kılavuzların tümü Intel sözdizimi kullanılarak yazıldığı için, buna bağlı kalın.

İyi şanslar!


4

Oldukça kompakt bir 32-bit mimari olan MIPS'i öğrenmeye başladım. İndirgenmiş bir talimat setidir, ancak yeni başlayanlar için kavramayı kolaylaştıran şey budur. Karmaşıklıkla boğulmadan montajın nasıl çalıştığını yine de anlayabileceksiniz. Hatta MIPS kodunuzu derlemenize izin verecek hoş bir küçük IDE bile indirebilirsiniz: clicky Onu bir kez anladığınızda , daha karmaşık mimarilere geçmenin çok daha kolay olacağını düşünüyorum. En azından düşündüğüm buydu :) Bu noktada bellek tahsisi ve yönetimi, mantık akışı, hata ayıklama, test etme vb. Konularda temel bilgilere sahip olacaksınız.


4

Hata ayıklamayı kullanma önerisi eğlencelidir, bununla birçok düzgün numara yapılabilir. Bununla birlikte, modern bir işletim sistemi için, 16 bitlik derlemeyi öğrenmek biraz daha az yararlı olabilir. Bunun yerine ntsd.exe kullanmayı düşünün. Windows XP'de yerleşiktir (maalesef Server 2003 ve sonrasında çekilmiştir), bu da çok yaygın olduğu için öğrenmesi kolay bir araçtır.

Bununla birlikte, XP'deki orijinal sürüm bir dizi hatadan muzdariptir. Gerçekten kullanmak istiyorsanız (veya cdb veya windbg, aynı komut sözdizimi ve hata ayıklama arka ucuna sahip esasen farklı arayüzler), ücretsiz Windows hata ayıklama araçlarını yüklemelisiniz. paketini .

Bu pakette bulunan debugger.chm dosyası, alışılmadık sözdizimini anlamaya çalışırken özellikle yararlıdır.

Ntsd ile ilgili harika olan şey, onu yakın olduğunuz herhangi bir XP makinesinde açıp montaj veya sökmek için kullanabilmenizdir. Bir / harika / X86 derleme öğrenme aracı yapar. Örneğin (dos komut isteminde satır içi olduğu için cdb kullanmak, aksi halde aynıdır):

(alakasız oldukları için sembol hataları atlandı - ayrıca, umarım bu biçimlendirme işe yarar, bu benim ilk yazım)

C:\Documents and Settings\User>cdb calc

Microsoft (R) Windows Debugger Version 6.10.0003.233 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: calc
Symbol search path is: *** Invalid ***
Executable search path is:
ModLoad: 01000000 0101f000   calc.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
(f2c.208): Break instruction exception - code 80000003 (first chance)
eax=001a1eb4 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c90120e esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000> r eax
eax=001a1eb4
0:000> r eax=0
0:000> a eip
7c90120e add eax,0x100
7c901213
0:000> u eip
ntdll!DbgBreakPoint:
7c90120e 0500010000      add     eax,100h
7c901213 c3              ret
7c901214 8bff            mov     edi,edi
7c901216 8b442404        mov     eax,dword ptr [esp+4]
7c90121a cc              int     3
7c90121b c20400          ret     4
ntdll!NtCurrentTeb:
7c90121e 64a118000000    mov     eax,dword ptr fs:[00000018h]
7c901224 c3              ret
0:000> t
eax=00000100 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c901213 esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!DbgUserBreakPoint+0x1:
7c901213 c3              ret
0:000>`

Ayrıca - IDA ile oynarken, Chris Eagle tarafından yazılan IDA Pro Book'a göz attığınızdan emin olun (StackOverflow, ilk yazım için ikiden fazla bağlantı göndermeme izin vermek istemediğinden bağlantısız). Dışarıdaki en iyi referanstır.


1
Chris Eagle'ın kitabı için +1. ); Gotta r00t ait Sk3wl için orada biraz sevgi koymak
mrduclaw

4

Yakın zamanda bir bilgisayar sistemleri dersi aldım. Konulardan biri, donanımla iletişim kurmak için bir araç olarak Assembly idi.

Benim için, bilgisayar sistemlerinin nasıl çalıştığının ayrıntıları anlaşılmadan montaj bilgisi tamamlanmış olmazdı. Bunu anlamak, bir işlemci mimarisindeki montaj talimatlarının neden harika, ancak başka bir mimaride korkunç olduğuna dair yeni bir anlayış getiriyor.

Bunu göz önünde bulundurarak, sınıf ders kitabımı tavsiye etme eğilimindeyim:

Bilgisayar Sistemleri: Bir programcının bakış açısı .

Bilgisayar Sistemleri: Bir programcının bakış açısı
(kaynak: cmu.edu )

X86 montajını kapsıyor ama kitap bundan çok daha geniş. Önbellek olarak işlemci boru hattı ve belleği, sanal bellek sistemini ve çok daha fazlasını kapsar. Tüm bunlar, montajın verilen unsurlar için nasıl optimize edilebileceğini etkileyebilir.


3

Bir sökücü tarafından çıkarılan ve bir assembler tarafından anlaşılan (bunun girdisi olarak kullanılabilen) ASCII -leştirilmiş opcode anımsatıcılarını (ve parametrelerini) öğrenmek istediğinizi düşünüyorum.

Herhangi bir derleyici (örneğin MASM) yapacaktır.

Ve / veya bunun hakkında bir kitap okumanız sizin için daha iyi olabilir (SO'da önerilen kitaplar var, hangileri olduğunu hatırlamıyorum).


3

Pencerelerde başka geliştirme çalışmaları mı yapıyorsunuz? Hangi IDE'de? VS ise, yalnızca demonte edilmiş kodu okumak için ek bir IDE'ye gerek yoktur: uygulamanızda hata ayıklayın (veya harici bir uygulamaya ekleyin), ardından sökme penceresini açın (varsayılan ayarlarda, bu Alt + 8'dir). Normal kodda yaptığınız gibi hafızayı / kayıtları adımlayın ve izleyin. Ayrıca bir kayıt penceresini açık tutmak isteyebilirsiniz (varsayılan olarak Alt + 5).

Intel, hem temel mimari (kayıtlar, işlemci birimleri vb.) Hakkında bir inceleme hem de eksiksiz bir talimat referansı veren ücretsiz kılavuzlar verir . Mimari olgunlaştıkça ve daha karmaşık hale geldikçe, 'temel mimari' kılavuzları giderek daha az okunabilir hale geliyor. Elinize eski bir sürüme geçebilirseniz, muhtemelen başlamak için daha iyi bir yeriniz olur (hatta P3 kılavuzları - aynı şeyi daha iyi açıklıyorlar) temel yürütme ortamını ).

Bir kitaba yatırım yapmak istiyorsanız, işte size güzel bir giriş metni. Amazon'da 'x86' araması yapın ve diğerlerini elde edin. Burada başka bir sorudan birkaç başka yön alabilirsiniz .

Son olarak, gelen biraz yararlanabilir okuma bazı düşük - seviyeli bloglar. Bu bayt boyutundaki bilgi bitleri, kişisel olarak benim için en iyisidir.


3

Bu, verimli kod yazmanıza mutlaka yardımcı olmayacak!

i86 işlem kodları, Windows ve Linux için çok sayıda kod ve çalıştırılabilir ikili dosyalar nedeniyle devam eden aşağı yukarı "eski" bir biçimdir.

Galileo gibi İtalyan bir konuşmacının Latince yazdığı eski bilginlere biraz benziyor ve makalesi Copernicus gibi Polonyalı bir konuşmacı tarafından anlaşılabilir. Bu, niether'in Latince'de özellikle iyi olmasına ve Latince, matematiksel fikirleri ifade etmek için saçma bir dil olmasına rağmen, iletişim kurmanın hala en etkili yoluydu.

Böylece derleyiciler varsayılan olarak x86 kodu üretir ve modern yongalar anceint İşlem kodlarını okur ve gördüklerini yeniden sıralı yürütme, spekülatif yürütme, ardışık düzen vb. İle paralel risk komutlarına dönüştürür.Ayrıca işlemcinin 32 veya 64 kayıtlarından tam olarak yararlanırlar. aslında var (x86 talimatlarında gördüğünüz zavallı 8'in aksine.)

Artık tüm optimize eden derleyiciler bunun gerçekte ne olduğunu biliyorlar, bu yüzden çipin verimli bir şekilde optimize edebileceğini bildikleri OP kodlarının dizilerini kodluyorlar - bu dizilerin bazıları yaklaşık bir 1990 .asm programcısı için etkisiz görünse bile.

Bir noktada, derleyici yazarların ortaya koyduğu on binlerce insan yıllık çabanın karşılığını aldığını kabul etmeniz ve onlara güvenmeniz gerekir.

Daha verimli bir çalışma zamanı elde etmenin en basit ve en kolay yolu Intel C / C ++ derleyicisini satın almaktır. Efficeint derleyicileri için niş bir pazarları var ve çip tasarımcılarına içeride neler olup bittiğini sorma avantajına sahipler.


Hikayeniz bir şekilde CISC işlemcilerin dahili olarak RISC işlemcileri haline geldiğini gösteriyor. Yanlış anlamış olabilirim ama bu kesinlikle doğru değil. Ve acınası 8? Modern işlemciler (örneğin, 1999'dan beri) çok daha fazlasını içerir: 10 gpr: EAX-EFLAGS, 80 bit FP0-FP7, 64-bit MMX0-MMX7, 128-bit XMM0-XMM7, segment: CS-GS, özel ürünler: CR0-CR4 , DR0-DR7, TR3-TR7, GDTR, IDTR, LDTR, MSR'ler ve x86-64'te ayrıca R8-R15. Bunların hepsine ring-3'ten erişilemez, ancak çoğu ve çoğu yeni (2006 sonrası) GCC / VC ++ derleyicileri tarafından kullanılmaktadır. "Acınası 8" den tamamen biraz daha fazla;).
Abel

3

Yapmak istediğiniz şeyi yapmak için Intel Yönerge Seti Referansını (kullandığım tam olmayabilir, ancak yeterli görünüyor) ve Visual Studio'da yazdığım bazı basit programları aldım ve bunları IDAPro / Windbg'ye atmaya başladım. . Kendi programlarımı büyüttüğümde , crackmes'teki yazılım , oldu.

Programların Windows'ta nasıl çalıştığına dair bazı temel bilgilere sahip olduğunuzu varsayıyorum. Ama gerçekten, derlemeyi okumak için, öğrenilecek sadece birkaç talimat ve bu talimatların birkaç çeşidi vardır (örneğin, bir atlama talimatı var, atlama, eşitse atlama, ecx-sıfırsa atlama gibi birkaç tada sahiptir. , vb). Temel talimatları öğrendikten sonra, programın yürütülmesinin ana fikrini almak oldukça basittir. IDA'nın grafik görünümü yardımcı olur ve programı Windbg ile izliyorsanız, emin değilseniz talimatların ne yaptığını anlamak oldukça basittir.

Biraz böyle oynadıktan sonra Hacker Disassembly Uncovered satın aldım . Genel olarak, başlığında "Hacker" kelimesi bulunan kitaplardan uzak duruyorum, ancak bunun derlenmiş kodun nasıl parçalarına ayrıldığına dair gerçekten derinlemesine gitmesini gerçekten çok beğendim. Ayrıca derleyici optimizasyonlarına ve ilginç olan bazı verimlilik konularına da giriyor.

Her şey gerçekten de programı ne kadar derinden anlamak istediğinize bağlı. Güvenlik açıkları arayan bir hedefe tersine mühendislik uyguluyorsanız, açıklardan yararlanma kodu yazıyorsanız veya paketlenmiş kötü amaçlı yazılımları yetenekler için analiz ediyorsanız, işleri gerçekten yürütmek için daha fazla hızlanma süresine ihtiyacınız olacak (özellikle daha gelişmiş kötü amaçlı yazılımlar için) ). Öte yandan, en sevdiğiniz video oyununda karakterinizin seviyesini değiştirebilmek istiyorsanız, nispeten kısa bir süre içinde iyi durumda olmalısınız.


2

Piyasadaki standart pedagojik derleme dillerinden biri MIPS'dir. MIPS simülatörleri (spim) ve bunun için çeşitli öğretim materyalleri alabilirsiniz.

Şahsen ben hayran değilim. IA32'yi seviyorum.


MIPS güzel. 68000 de öyle ve 68000'i öğrenirseniz MAME'de çalışan ikili dosyalar yazabilirsiniz. :-)
Nosredna

2

Benim kişisel favorim NASM, çünkü çoğunlukla çoklu platform ve MMX, SSE, 64-bit ...

Bazı basit C kaynak dosyalarını gcc ile derlemeye ve assembler talimatını gcc-formatından NASM-formatına "trans-kodlamaya" başladım. Ardından, küçük kod bölümlerini değiştirebilir ve bunun getirdiği performans iyileştirmesini doğrulayabilirsiniz.

NASM belgeleri gerçekten eksiksiz, kitaplardan veya diğer kaynaklardan bilgi aramaya hiç ihtiyaç duymadım.




1

Montajı bir mikrodenetleyici geliştirme kiti (Motorola HC12) ve kalın bir veri sayfasıyla öğrendik.


0

Gerçekte hedefinize ulaşmak için, içinde bulunduğunuz IDE ile başlamayı düşünebilirsiniz. Genelde bir demonte edici penceredir, böylece kodda tek adımda yapabilirsiniz. Kayıtları görmenize ve hafıza alanlarına bakmanıza izin veren bir tür görünüm genellikle vardır.

Optimize edilmemiş c / c ++ kodunun incelenmesi, derleyicinin kaynaklarınız için ürettiği kod türüne bir bağlantı oluşturmanıza yardımcı olacaktır. Bazı derleyiciler, kodunuza makine talimatları eklemenize izin veren bir tür ASM ayrılmış kelimesine sahiptir.

Benim tavsiyem, bir süre bu tür aletlerle oynayıp ayaklarınızı ıslatıp sonra yukarı çıkmak olabilir mi? aşağı? hangi platformda çalışıyor olursanız olun doğrudan derleyici koduna.

Piyasada pek çok harika araç var, ancak ilk başta dik öğrenme eğrisinden kaçınmak için bunu daha eğlenceli bulabilirsiniz.


0

Konu dışı biliyorum, ancak Windows programcısı olduğunuz için yardım edemem ama MSIL'i öğrenmek için zamanınızı daha uygun ve / veya daha iyi kullanmak olabileceğini düşünüyorum. Hayır, bu montaj değil, ancak muhtemelen bu .NET çağında daha alakalı.


0

Assembly'yi bilmek hata ayıklama için yararlı olabilir, ancak kodunuzu optimize etmek için onu kullanmak konusunda çok heyecanlanmam. Modern derleyiciler, bugünlerde bir insanı optimize etmede genellikle çok daha iyidir.


Hmm. Hala biraz fazladan kodlama derlemesini kendiniz çıkarabilirsiniz, ancak derleyiciyi yenmek eskisinden daha fazla iş gerektirir.
Nosredna

0

Xorpd x86 Assembly video kursuna göz atabilirsiniz . (Ben yazdım). Kursun kendisi ücretlidir, ancak alıştırmalar github'da açık kaynaklıdır. Biraz programlama deneyiminiz varsa, sadece alıştırmalarla çalışıp her şeyi anlayabilmeniz gerektiğini düşünüyorum.

Kodun Windows platformu için olduğunu ve Fasm assembler kullanılarak yazıldığını unutmayın . Kurs ve alıştırmalar herhangi bir yüksek seviyeli yapı içermez, ancak isterseniz çok karmaşık makrolar oluşturmak için Fasm'ı kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.