Soru:
X86 CPU talimatları nasıl kodlanır?
Henry Heikkinen
2013-03-20 00:30:22 UTC
view on stackexchange narkive permalink

Çalışma zamanında işlevleri bağlamak için küçük bir yardımcı program kitaplığı yazıyorum. İlk birkaç talimatın uzunluğunu bulmam gerekiyor çünkü hiçbir şey varsaymak istemiyorum ya da geliştiricinin yeniden konumlandırmak ve üzerine yazmak için bayt miktarını manuel olarak girmesini istemiyorum.

Yapılacak pek çok harika kaynak var montajı öğrenin, ancak hiçbiri montaj anımsatıcılarının nasıl ham ikili komutlara dönüştüğü konusunda çok fazla ayrıntıya girmiyor gibi görünüyor.

Bunun tersine mühendislik ile nasıl bir ilgisi olduğunu anlamıyorum, ancak sizin için işi yapmak için bir sökücü kullanabilirsiniz.
Bu Blog-Girişi, Çalışma Zamanındaki Hooking Fonksiyonları ile biraz alakalı olmalıdır: http: //blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx
Ne yazık ki, deneyimlerime göre cevap "gerçekten korkunç ve keyfi bir şekilde". İyi şanslar :)
Şimdiye kadarki en sevdiğim öğretici: http://www.c-jump.com/CIS77/CPU/x86/lecture.html Her şeyi kapsamaz, ancak iyi bir başlangıçtır.
Yedi yanıtlar:
Peter Andersson
2013-03-20 01:02:18 UTC
view on stackexchange narkive permalink

Talimat kodlamalarını ayrıntılı olarak anlamak istiyorsanız, Intel® 64 ve IA-32 Mimarileri Yazılım Geliştirici Kılavuzu Cilt 2 (Yönerge Seti Referansı, A-Z) 'yi incelemeniz gerekir. Intel IA-32 ve AMD64'ün çok karmaşık komut setleri olduğunu ve özellikle bir sıçrama enjekte ederek bağlanmak üzere tasarlanmamış bir işlevi bağlamak için çok sayıda farklı talimatla karşılaşacağınızı unutmayın. İşlevin bir yığın çerçevesinin kurulduğunun bile garantisi yoktur.

Microsoft Research tarafından sunulan Detours gibi sizin için sökme ve takma işlemlerini yapabilecek kitaplıklar vardır.

Teşekkürler! Tam aradığım şey bu gibi görünüyor. Detours, yaptığımla hemen hemen aynı ama tekerleği eğitim amaçlı yeniden icat ediyorum.
Dikkatli olun, Detours EULA'sı tam olarak liberal diyeceği şey değildir. Her yerde referans verildiğini biliyorum, ancak ekli lisans onu birçok şey için diskalifiye ediyor.
Tyilo
2013-03-20 00:35:23 UTC
view on stackexchange narkive permalink

İkili işlem kodlarından montaj koduna gitmek için bir ayırıcı kullanabilirsiniz.

Örneğin ndisam komutu bunu yapabilir.

Eğer siz aşağıdaki ikili işlem kodlarına sahip olun (dosyanın onaltılık görünümü):

  31C0FFC0C3  

ndisasm ile sökerken aşağıdaki çıktıyı alacaksınız code>:

  00000000 31C0 xor ax, ax00000002 FFC0 inc ax00000004 C3 ret  

İlk sütun dosya ofseti, ikincisi ikili işlem kodlarıdır ve son satır, montaj kodudur.

Daha sonra ikinci sütunu elde edebilir ve onun dize uzunluğunu elde edip 2'ye bölebilir ve talimatın uzunluğunu bayt cinsinden elde edebilirsiniz.

Bu, komut satırında manuel olarak nasıl yapılacağını açıklasa da, çalışma zamanında isteğe bağlı kodu kancalayan bir yardımcı program kitaplığı için uygun bir yaklaşım olduğunu düşünmüyorum. Eğer ndisasm bir kütüphane olarak mevcutsa işe yarayabilir, ama o zaman bunu cevabınıza eklemelisiniz.
Temel olarak bunun için hem [udis86] (http://udis86.sourceforge.net/) hem de [opdis] (http://mkfs.github.com/content/opdis/) kitaplıklarını kullandım. Her ikisi de oldukça iyi çalışır ve (iirc), asm çıktısını ayrıştırmak yerine her komutun uzunluğunu bir yapı üyesi olarak ortaya çıkarır.
@SeanB. "udis86" ya hızlıca göz attığımda, [github] 'a (https://github.com/vmt/udis86) taşındığını görebiliyorum.
Dougall
2013-03-20 07:14:41 UTC
view on stackexchange narkive permalink

Pek çok kişi, paha biçilmez bir referans olan Intel kılavuzlarından bahsetti, ancak oldukça ağır. Talimatların daha basit bir seviyede nasıl kodlandığı hakkında bir fikir edinmek için bu OSDev wiki sayfasına bakmanızı öneririm.

Tüm pratik talimat uzunluğu bulma problemleri için, ben bir sökücü kullanmanızı tavsiye ederdi.

İşlev kancalama ilginç bir zorluktur. Bu MSDN blogu bazı zorlukları iyi açıklıyor. Gereksinimlere bağlı olarak, işleme eklemek, işlevleri "kesmek" ve kancanızı ayrı bir işlemde uygulamak için işletim sisteminin hata ayıklama işlevini kullanmak tercih edilebilir.

Bu harika bir genel bakışa benziyor. Teşekkürler!
Artelius
2015-09-23 12:00:30 UTC
view on stackexchange narkive permalink

Bu CodeProject makalesi, x86'nın talimat formatının (diyagramlarla!) mükemmel bir üst düzey görünümüdür. Bunu okuduktan sonra, daha ayrıntılı referanslar daha anlamlı hale gelecektir.

Uzun yıllar geriye dönük uyumlu evrim nedeniyle, x86 komut formatı, her tür isteğe bağlı önek ve talimata bağlı alanlarla oldukça karmaşıktır. komut uzunluğunu hesaplamak biraz zor. Sağlam bir şey istiyorsanız, kendi yazılımınızı sürmek yerine mevcut yazılımı uyarlamanızı tavsiye ederim. Ancak bu kavramları anlamak elbette çok yardımcı olacaktır.

Andrew
2013-03-20 00:56:02 UTC
view on stackexchange narkive permalink

Komut kod çözme ile ilgili temel bilgiler, yazılım geliştiricilere yönelik işlemci kılavuzunda bulunabilir. Assembler yazarlarının bunu bilmesi gerekir, bu yüzden bilgi oradadır. Intel için, Cilt 2A'nın başında (sanırım, tüm kılavuzları tek bir PDF'ye sıkıştırdıkları için izimi kaybettim). Öneklerin nasıl kodlandığını, işlem kodlarının nasıl kodlandığını ve işlenenlerin nasıl kodlandığını tanımlayan büyük bir tablo var. Okumak kolay değil ama orada ...

Hmm, bu ne zamandı? Sadece birkaç hafta önce bile hepsi ayrı PDF dosyalarına güzelce ayrıldı ...
Milhous
2015-09-21 06:25:22 UTC
view on stackexchange narkive permalink

Bakmakta olduğunuz adreste belirtilen talimatları parçalarına ayırmak için kapak taşı kitaplığını kullanabilirsiniz. Talimatın ne kadar süreyle bayt cinsinden olduğunu sizin için belirleme yeteneğine sahiptir ve sonra bunu kodunuzda kullanabilirsiniz.

http://www.capstone-engine.org/



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...