Ham ikili koddan işlemci türü tanımlansın mı?


19

Gerçekten cips ile ilgili değil, ama umarım buradan takip etmek için bazı talimatlar alırım.

Bir yığın kod aldım, ancak hangi işlemciyi amaçladığını bilmiyorum. Kod türünü tanımlamama yardımcı olabilecek araçlar var mı? Hangi istatistik yöntemleri yardımcı olabilir? Bayt dağılımı? Çift dağılımı, vb? Markov zincirleri belki?


7
Ham altıgendeki ilk 200 baytı bize verir misiniz?
14'te pingswept

Bu eğlenceli bir soru. Ne tür bir cihazı hack ediyorsunuz?
DavidEGrayson

1
birkaç farklı sökücü ile beslemeyi deneyebilir ve ne olduğunu görebilirsiniz.
JustJeff

2
Bu kodu 100 bayt olarak adlandıracağım! = P
JustJeff

Harika bir soru. Ancak StackOverflow için daha uygun olabilir.
sharptooth

Yanıtlar:


16

GNU dosyası üzerinden çalıştırmayı deneyin. Herhangi bir standart başlık varsa, onu alır.

Örneğin.

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped

Bunu denedim. GNU dosyası "veri" olduğunu söylüyor.
mentalist

3
Bazılarını gönderebilir misiniz? İçinde "dizeleri" ile ASCII aramayı denediniz mi?
Toby Jaffey

9

Bu çok ilginç bir soru. Orada milyonlarca eğitim seti var, ama sadece bir avuç yaygın olarak kullanılanlar.

Bakacağım ilk şey başlangıç ​​noktası ve kullanım amacı. ABD'de tasarlandığından şüpheleniyorsanız , öncelikle İngilizce olarak veri sayfalarına sahip işlemcileri hedeflersiniz. Asya'da tasarlandıysa, ABD mühendislerinin nadiren gördüğü seri üretilen cihazlar için kullandıkları bir dizi işlemci var. Avrupa'nın bile diğerlerinden daha yaygın olan birkaç işlemcisi var.

Daha sonra kod boyutu ve işlevselliği (kodun bir dereceye kadar ne yaptığını bildiğinizi varsayarak) bir göz atın. Birkaç megabayt kod ise, en gömülü 8 bit işlemcileri hemen hemen indirebilir ve harici belleğe sahip daha büyük cihazlara bakmaya başlayabilirsiniz. Birkaç kilobayt veya daha azsa, bunun yerine daha küçük, daha ucuz cihazlara odaklanmak istersiniz. İşlev basitse, dört bit işlemci için kod bile olabilir.

Bu noktada hafıza yapısına bakmaya değer. En azından bir program bölümü ve bir veri bölümü olması muhtemeldir. İkili bir dosyaysa (intel hex veya motorola s kaydına karşı), o zaman bellekte belirli veri parçalarının nereye yerleştirildiği hakkında çok az fikriniz vardır. Onaltılık bir düzenleyici bazı desenler gösterebilir. Onaltılık veya s kayıt biçiminde geliyorsa, amaçladığı işlemcinin bellek yapısı hakkında daha fazla bilgiye sahip olabilirsiniz. Bazı işlemciler program belleği 0 konumunda, bazıları en yüksek bellek konumunda sıfırlanır. Program EEPROM başlangıç ​​değerlerini ayrı bir bellek konumuna içerebilir. Güvenli bir işlemci (bankacılıkta kullanılan) içinse, tek bir bellek konumu için güvenlik anahtarları bile olabilir.

Programlandığı dile bağlı olarak bazı ek ipuçlarınız olabilir. C veya benzer bir yordamsal dilde programlanmışsa, işlevler neredeyse her zaman belirli kayıtları yığına (çok sayıda itme) kaydetmek için bir dizi talimatla başlar ve orijinal değerleri yığından döndürmek için çok sayıda pop döndürmeden hemen önce . Bazı desen tanıma yapabiliyorsanız, bu dizilerin çoğunu bulacaksınız ve hangi talimatların büyük olasılıkla itme / pop talimatları, geri dönüş, vb.

Kesintileri olan gömülü bir cihazsa, büyük bir blokta, muhtemelen uygun bir yerde (örneğin 0x ??? 0 adresi) farklı bellek konumlarına bir sürü sıçrama gibi görünecek bir kesme vektör tablosu olabilir. . Atlama tabloları başka yerlerde de kullanılır, ancak atlamak için adresin ne olacağı dışında özdeş görünen bir dizi talimatı bulabilirseniz, bir atlama komutunun neye benzediğini çıkarabilir ve yine dar olabilirsiniz. aşağı seçim.

Bu noktada, en yaygın işlemci mimarileriyle başlıyorum ve bir şeyin ilişkili olup olmadığını görüyordum. x86, kol, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502, vb, vb., vb.

Bu konuda yardımcı olacak herhangi bir otomatik aracın farkında değilim, ancak MAME çok sayıda işlemci mimarisine öykünüyor ve olası bir yöntem, kodu bir dizi işlemci aracılığıyla çalıştırmak ve herhangi bir şeye göre tıkladığını görmek için kayıtları izlemek. tasarımı biliyorsunuz.


"Avrupa'nın bile diğerlerinden daha yaygın olan birkaç işlemcisi var." Avrupa'da yaşamak, bu hiç aklıma gelmedi. Örnek verebilir misiniz?
stevenvh

@stevenvh Acorn ve Sinclair şirketleri nedeniyle 6502 ve Z80 tabanlı gömülü sistemler çok popülerdi. Ve elbette, ARM işlemci Acorn Computers'da başladı.
Adam Davis

5

Fikir: Kaynak kodun yaşını biliyor musunuz , yani hangi zaman / yıl içinde yaratıldı?

Yeterince eski olsaydı, hangi işlemci için yazıldığına dair bir ipucu verebilir. Yazıldığı yaş / yılı alabilir ve o zaman diliminde hangi işlemcilerin popüler olduğunu belirleyebilir ve bunlara onaltılık dosyayı yüklemeyi / yürütmeyi deneyebilirsiniz.

İkinci düşüncede, sadece son 20 yılda işlemcilerin kitlesel çoğalması göz önüne alındığında, bu samanlıkta iğne tekniği olabilir ve çok verimli olmayabilir.


4

Birçok ay önce, etrafta çok fazla işlemci çekirdeği olmadığında, Z80 kodunu frekans analizi ile birkaç kez tanımladım . Z80 için CDmakine kodu call subroutineve C9bir return from subroutine(asla unutmayacağım) ve bu genellikle en çok meydana gelen kodlardır. Ancak bu, makine kodu düzeyinde ayarlanan talimatları bilmenizi gerektirir. Elle montaj konusunda deneyim sahibi olmak yardımcı olur (bunu çok yaptı ve hala ofsetleri hesaplamak için altıgende geriye doğru sayabilirim).


3

Dosya 12 bit veya 14 bit PIC içinse, her bayt çifti, genellikle ilk önce LSB olarak depolanan 12 veya 14 bitlik bir kelime olacaktır ve en önemli iki veya dört bit biti açık olacaktır.


1

C veya Pascal gibi bir dilden derlenmiş olsaydı, arayabileceğiniz bazı standart ikili diziler olurdu. Örneğin C ile, neredeyse tüm işlevler yığın işaretçisini "çerçeve" veya "bağlantı" işaretçisine kaydeden bir şeyle başlar. Herhangi bir işlemci için genellikle bunu yapmanın sadece birkaç yolu vardır. Yani bu diziler için X'in ikilisini arayarak "X işlemcisi için bu kod" yanıtını verebilirsiniz.

Bununla birlikte, sadece histogramları kullanarak 8088, 6502 ve 68000 ikili dosyalarını ayıran biraz şansım vardı. Herhangi bir işlemcinin belirli yasal talimat opcod'ları vardır ve bunlar ortalamadan biraz daha sık kullanılma eğilimindedir. Yeterince büyük bir ikili yığınla, belirli eğilimleri görmeye başlayabilirsiniz. Bununla birlikte, bu , bir ikili ikili parçadaki tüm işlenenlerin , verilen işlemci tipiyle ilişkili olma eğiliminde olmaması ve bu aslında histogram verilerinizde parazit oluşturmasıyla zorlaşmaktadır. Ayrıca, aynı işlemci için iki farklı programın bile belirgin şekilde farklı histogramları olabilir. Yine de size başlamak için bir yer verebilir.

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.