- rev.ng, decompiler backend’i revng-c’yi yayımlayarak decompilation motorunu açık kaynağa dönüştürdü; bununla birlikte kapalı beta UI, yeni web sitesi, rev.ng Hub ve dokümantasyonu da sundu
- Yerelde, kurulum betiğiyle CLI yapılandırıldıktan sonra
revng artifact ve revng ptml kullanılarak geçerli C kodu biçimindeki decompilation çıktısı görülebiliyor
- İnteraktif UI, VSCode tabanlı olarak tarayıcı ve bağımsız uygulamayı hedefliyor; bülten abonelerinin FIFO yöntemiyle davet edildiği kapalı betada sunuluyor
- Otomatik veri yapısı kurtarma, işbirlikçi reverse engineering, çeşitli mimari desteği ve genişletilebilirlik temel hedefler; ancak mevcut QA en çok Linux x86-64 binary’lerine odaklanıyor
- Framework ve CLI açık kaynak; bulut UI herkese açık projeler için ücretsiz sunulurken, özel projeler ve çevrimdışı bağımsız UI ücretli modelle ayrılıyor
Açık kaynağa geçiş ve kapalı beta
- rev.ng, decompiler backend’i
revng-c’yi açık kaynak olarak yayımladı
- Bu yayınla birlikte tüm decompilation motoru açık kaynak olmuş oldu
- İlk dokümantasyon da birlikte sunuldu
- UI için bülten abonelerine yönelik kapalı beta davetleri başlaması planlanıyor
- Davetler FIFO yöntemiyle ilerleyecek
- Betaya katılmak için bültene kayıt gerekiyor
- Yeni web sitesi ve rev.ng Hub da birlikte açıldı
- rev.ng Hub, bulut sürümüne giriş noktası
- Beta kullanıcıları proje oluşturabiliyor, UI’ı tarayıcıda çalıştırabiliyor ve diğer kullanıcılarla işbirliği yapabiliyor
- Kapalı beta kapsamında olmasanız da herkese açık projelere göz atabilirsiniz
- rev.ng özelliklerini doğrudan görmek isteyen kullanıcılar için özel demo da sunuluyor
CLI ile rev.ng’yi denemek
revng, root yetkisi olmadan tek bir dizine kurulabiliyor ve o dizin silindiğinde kaldırılmış oluyor
curl -L -s https://rev.ng/downloads/revng-distributable/master/install.sh | bash
cd revng
source ./environment
- Örnek
example.c, argc * 3 döndüren basit bir program
int main(int argc, char *argv[]) {
return argc * 3;
}
gcc ile derledikten sonra revng artifact çalıştırılırsa tek dosya biçiminde bir decompilation çıktısı alınabiliyor
gcc example.c -o example -O2
revng artifact \
--analyze \
--progress \
decompile-to-single-file \
example \
| revng ptml --color \
| grep -A2 -B1 '[^_]main\b' \
> decompiled.c
Beta kapsamı ve test hedefleri
- UI’ı kullanmak için bültene kayıt olmak gerekiyor ve davetler küçük gruplar halinde gönderiliyor
- Bu sürüm, bazı binary’lerde UI ve decompilation sonuçlarını demo etmeye, ayrıca gerçek binary çalışmaları için geri bildirim ve hata raporu toplamaya odaklanıyor
- Testte kullanılan basit olmayan binary’ler ve
.text boyutları şöyle
- rev.ng birden çok ABI ve platformu destekliyor, ancak bu aşamadaki ilk QA özellikle Linux x86-64 binary’lerine odaklanıyor
- Sorun yaşanırsa Discourse üzerinden yardım alınabiliyor
rev.ng’nin hedeflediği decompilation deneyimi
- rev.ng’nin başlıca odağı otomatik veri yapısı kurtarma, modern UX, işbirlikçi reverse engineering, geniş platform desteği ve genişletilebilirlik
-
Otomatik veri yapısı kurtarma
- Data Layout Analysis ile
struct düzeni prosedürler arası analiz yoluyla otomatik olarak kurtarılabiliyor
- Bağlı liste düğümü örneği,
int64_t data[5] dizisi ve sonraki düğüme işaretçi içeren bir yapıyı ele alıyor
- rev.ng çıktısı, dizi boyutu 5’i ve sonraki öğe işaretçisine erişimi otomatik algılayan struct ve fonksiyon kodu üretiyor
- Decompiler çıktısı sözdizimsel olarak geçerli C kodu
- Bu özellik şu anda kullanılabiliyor
-
VSCode tabanlı interaktif UI
- UI VSCode tabanlı olduğundan, VSCode kullanıcıları buna alışık bir şekilde yaklaşabiliyor
- Hem tarayıcı sekmesinde hem de bağımsız uygulama olarak çalışabiliyor
- Başlıca kısayollar şöyle
Ctrl + Click: İmlecin altındaki fonksiyon veya tür tanımına git
N: Yeniden adlandır
Y: Tür düzenle
X: Referansları göster
- rev.ng, değişiklik olduğunda yalnızca etkilenen bölümleri yeniden hesaplayan interaktif bir decompiler
- UI şu anda kapalı beta katılımcılarına sunuluyor
-
İşbirlikçi reverse engineering
- rev.ng UI, istemci-sunucu mimarisi kullanıyor
- Birden fazla kullanıcı aynı daemon örneğine bağlanıp aynı proje üzerinde eşzamanlı çalışabiliyor
- Bulut sürümünde, proje yönetimi için GitHub benzeri bir uygulama olan rev.ng Hub kullanılabiliyor
- İşbirliği özellikleri çalışıyor, ancak kullanıcı deneyiminde iyileştirmeye ihtiyaç var; bu durum yol haritası maddesi #797 altında izleniyor
Mimari ve platform desteği yaklaşımı
- rev.ng, QEMU pipeline’ının ön kısmını kullanarak yürütülebilir kodu tiny code’a kaldırıyor, bunu LLVM IR’ye dönüştürüyor ve ardından decompilation yapıyor
- Bu yapı sayesinde QEMU’nun desteklediği mimariler görece kolay şekilde desteklenebiliyor
- Mimari desteği kadar platform, özellikle de ABI desteği de önemli
- rev.ng, ABI özelliklerini bildirimsel olarak tanımlamak için ABI description format kullanıyor
- Bu format, yeni ABI desteğini kolaylaştıracak kadar genel tasarlanmış
- Mevcut destek durumu şöyle
- Mimariler: x86, x86-64, ARM, AArch64, MIPS, s390x farklı olgunluk seviyelerinde destekleniyor
- Binary formatları: ELF, PE/COFF, Mach-O destekleniyor
- İçe aktarma:
.idb, DWARF debug bilgisi ve PDB debug bilgisi destekleniyor
- QA’nin büyük kısmı Linux x86-64 binary’leri üzerinde yapıldı; kalan kısımlar için ek QA gerekiyor
- Daha fazla platform QA çalışması yol haritası maddesi #58 altında izleniyor
Genişletilebilirlik ve betikleme
- rev.ng, reverse engineering araçları için bir framework olmayı hedefliyor ve interaktif UI hariç tüm proje açık kaynak
- Proje dosyası olan model bir YAML belgesi olduğundan, JSON veya YAML parse edebilen herkes rev.ng’yi betikleyebiliyor
- Model, decompile edilecek binary’nin mimarisi, varsayılan ABI’si, segmentleri, fonksiyon listesi, tür listesi gibi bilgileri içeriyor
- Model, Python ve TypeScript sarmalayıcılarıyla değiştirilebiliyor
- Şu anda model işleme sarmalayıcıları var, ancak analiz çalıştırmayı ve artifact almayı kolaylaştıran bir yöntem henüz yok
- Tam teşekküllü Python istemcisi yol haritası maddesi #17 altında izleniyor
- İç temsilde yoğun biçimde LLVM IR kullanıldığı için LLVM ekosistemi araçlarından yararlanılabiliyor
Açık kaynak CLI ile ücretli UI arasındaki ayrım
- rev.ng framework’ü tamamen açık kaynak ve CLI üzerinden istediğiniz hedefi decompile edebiliyorsunuz
- UI sunum modeli üçe ayrılıyor
- Herkese açık projeler için bulut UI ücretsiz kullanılabiliyor
- Özel projeler için bulut UI abonelik gerektiriyor
- Tam bağımsız ve tamamen çevrimdışı UI ücretli sunuluyor
- Bulut kullanım modeli şöyle
- rev.ng Hub üzerinden proje oluşturuluyor ve işbirlikçiler davet ediliyor
- UI tarayıcıda çalışıyor
- Backend rev.ng bulutunda çalışıyor
- Proje dosyalarını herkese açmanızda sakınca yoksa, UI dahil bulut rev.ng sürümünü ücretsiz kullanabiliyorsunuz
- Kubernetes kullanan şirket içi özel bulut hizmeti kurulumu da görüşülebiliyor
1.0 yol haritası ve iletişim kanalları
- 1.0’a kadar olan yol haritası 4 katmana ayrılıyor
- Tier 1: Alfa sürüm, tanıdıklara demo, tamamlandı
- Tier 2: Beta sürüm, bülten abonelerine bulut sürüm erişimi sağlanması, şu anda başladı
- Tier 3: Açık beta, planlanıyor
- Tier 4: 1.0 sürümü, planlanıyor
- Ayrıntılı ilerleme durumu yol haritası sayfasından takip edilebiliyor
- Proje haberleri ve destek kanalları şöyle
1 yorum
Hacker News görüşleri
Fiyatlandırma modeli, rev.ng framework'ünün tamamen açık kaynak olması ve CLI üzerinden her şeyin decompile edilebilmesi üzerine kurulu
UI; açık projeler için bulutta ücretsiz, özel projeler için bulut aboneliği, tamamen bağımsız çevrimdışı uygulama için ise ücretli olarak sunulacak
Karşılaştırma yapmak gerekirse Hopper, 1 yıllık güncellemeler dahil 100 dolar https://www.hopperapp.com/index.html; Ghidra ve Radare2 özgür ve açık kaynak oldukları için tamamen ücretsiz; IDA Pro ise çok pahalı
Kullandığım kadarıyla IDA'ya oldukça benziyor ama daha kullanıcı dostu ve üretkenliği artıran, iyi tasarlanmış birçok özelliği var
Hopper'ı kullanmadım, ancak Ghidra ve Radare2'de geliştirme deneyimi pek iyi değildi; üretilen C kodu da kolay okunmuyordu. Gerçi ikisini de birkaç yıl önce kullanmıştım
Binja 300 dolar, ticari sürüm 1500 dolar ve öğrenci indirimi de var: https://binary.ninja/features
Yine de iyi C decompiler'lar her zaman az bulunuyor, bu yüzden yeni denemeler her zaman sevindirici
Ancak uygulama internet erişimini zorunlu kılmadan bunu nasıl uygulatıyor, merak ediyorum
Ekip sayfasına https://rev.ng/about ve kod katkılarına https://github.com/revng/revng/graphs/contributors bakınca, CEO'nun (aleclearmind) CTO'dan (pfez) çok daha fazla commit'e sahip olması biraz sıra dışı görünüyor
Diğer CEO'lar sık sık kod yazmaya neredeyse hiç vakit bulamadıklarını söylüyor; CTO'lar da genellikle daha çok yönetim tarafında oluyor ve fiili kodlama daha az yapıyor
Yine de bu yöntem iyi işliyorsa ekip açısından oldukça ilginç olsa gerek. Düzenleme: Zaman çizelgesini kontrol etmemiştim
Sonunda iki depoyu birleştireceğiz
Ayrıca ben her gün geliştirme yapıyorum ama nedense GitHub kullanıcımı düzgün yakalayamıyor
Gerçekten de eğlenceli
Aksine bu tablo hoşuma gitmişti ve başka yerlerde gördüklerimden farklı olduğu için ilginç bulmuştum
İlginç ya da sıra dışı olmadığı için mi downvote edildi?
Mevcut en iyi programlama dili teorisi kitaplarından birinden güç alan harika bir şirket gibi görünüyor: https://link.springer.com/book/10.1007/978-3-662-03811-6
“Ayrıca suç ortağı olacak Pietro ile de tanıştı. Oldukça romantik biçimde, şirketin temelini oluşturacak kitap sayesinde tanıştı.”
https://rev.ng/about
Sonra yoğun ama anlaşılır görünen bu kitabı buldum; danışmanıma satın alıp alamayacağımı sordum, o da “Önce üniversite kütüphanesine bak” dedi
Kütüphanede bir kopyası vardı ama zaten ödünç alınmıştı; compiler araştırması yapan tek grupta olduğum için “Bizim grubun dışında kim compiler yapmaya cüret eder?” diye düşündüm
Kütüphaneye gidip kimin ödünç aldığını sordum ama kişisel veri olduğu için söyleyemeyeceklerini söylediler; sadece soyadının üçüncü harfini ve adının ikinci harfini sorarak Z ve I harflerini aldım
Buradan buldum: https://www.deib.polimi.it/ita/personale-lista-alfabetica
Zamanla arkadaş olduk ve birlikte şirket kurduk
Lansmana kadar gerçekten çok fazla iş gerekti
Kodun değişkenleri ve struct üyelerini nasıl kullandığına bakarak değişken adları ve struct üyesi adlarını otomatik vermesi güzel olurdu
Örneğin bağlı listedeki sonraki işaretçinin
nextolarak tanımlanması kolay olmalıTüm GitHub'ı indirip kodda yerleşimi ve etkileşimi en çok benzeyen değişkenleri bulmak, güven yeterince yüksekse de o adı kullanmak mümkün görünüyor
Örneğin indüksiyon değişkeni tespit edilirse adını
iyapmak gibiAma bugün bunun doğru yolunun LLM kullanmak olduğu oldukça açık görünüyor
Ancak şu aşamada biz daha çok sağlam temeli kuran kişileriz; temel hazır olduğunda hazır modellerle adları değiştirmek veya yorum eklemek nispeten kolay
Esas nokta, %100 doğruluk gerektiren zor decompile işini bizim yapmamız; adlar ve yorumlar gibi yaklaşık sonuçların kabul edilebilir olduğu kısımlarda ise LLM'i devreye alabilmemiz
Her hâlükârda ad değiştiren script yazmak oldukça kolay, belgeler için buraya bakabilirsiniz: https://docs.rev.ng/user-manual/model-tutorial/
JSNice'ın içeride ne yaptığını açıklayan makale: https://files.sri.inf.ethz.ch/website/papers/jsnice15.pdf
Benim ELF dosyamda çalışmıyor
./revng artifact --analyze --progress decompile-to-single-file ../maytag.kokomutunu çalıştırıncaOnly ELF executables and ELF dynamic libraries are supportedmesajı çıkıyor; dosya iseELF 64-bit LSB relocatable, x86-64, version 1 (FreeBSD), not strippedolarak görünüyorFreeBSD ikililerini desteklemiyor mu?
Düzeltme: Kernel modüllerini desteklemediğini kaçırmışım; FreeBSD’den ziyade bunun basit bir çalıştırılabilir dosya olmamasından kaynaklanıyor gibi
Bunu yüklemek o kadar zor olmayacak gibi
İş birliği iş akışına çok ilgi gösterilmesini isterim
IDA Teams gibi şeyleri denemedim, ama Google Docs gibi sürtünmesiz bir tersine mühendislik deneyimi mümkün olursa harika olur
Eskiden UI tabanlı olarak QtCreator kullanıyorduk; berbat bir seçimdi
Sonra VSCode’a geçtik ve tesadüfen tarayıcıda da çalıştırılabiliyordu
Bu yüzden biraz Kubernetes de katarak, tamamen bağımsız sürümle birebir aynı kullanıcı deneyimine sahip bir bulut decompiler geliştirdik
İş birliği kısmının hâlâ daha fazla QA’ya ihtiyacı var, ama temelde çalışıyor
Yapısı çok basit: bir daemon, birden çok client
Sanırım eskiden CTF’lerde sunucunun X oturumu üzerinde birden fazla IDA penceresi ve birden fazla imleçle “iş birliği” yapma deneyiminden ilham aldık. Çok lanetli bir yöntemdi ama işe yarıyordu
Tip çıkarımı destekleme planınız var mı?
Şu anda tüm değişkenler
generic64_tgibi görünüyor; Ghidra gibi tipleri otomatik algılasa iyi olurdu. Elbette Ghidra da bazen yanılıyorYol haritası maddesi: https://rev.ng/roadmap#feature-798
Tasarım notları: https://pad.rev.ng/s/eDHi2PUoP#
İlginç görünüyor
Tamamen bağımsız sürümü denemek isterim
Yaklaşık fiyat hakkında bir haber var mı? Hobi kullanıcılarının da karşılayabileceği düzeyde olursa iyi olur
İkili dosya hackleme araçlarının artması her zaman sevindirici
Kendim de denemek isteyebileceğim için, seçilen paketleme biçimi hakkında fazlasıyla ayrıntılı bir öneri bırakıyorum
source ./environmentiyiye işaret değil. tar dosyasını indirince gerçekten PATH dâhil birkaç ortam değişkeni ayarladığını gördüm; neyse kiLD_LIBRARY_PATHdeğildiÇoğu
HARD_önekiyle başlıyor; muhtemelen size özgüdür amaREVNGdaha açık görünür, mevcut ortam değişkenleriyle çakışması kötü olurAWS_EC2_METADATA_DISABLED="true"da ayarlanıyor; AWS kullanmadığım için bende bozmuyor ama genel olarak şüpheli duruyorRPATH_PLACEHOLDER,HARD_FLAGS_CXX_CLANG, uzun PATH, mingw32/gentoo/mips dizgeleri vb. kırılgan görünüyorÇalıştırma talimatlarında “şimdi ortam değişkenlerini değiştirin” yazıyorsa genelde vazgeçiyorum; bu, Ubuntu dışı sistemlerde düzgün çalışmayan programlarla güçlü biçimde ilişkili
Uygulamanın denetim akışını çalışma ortamına bağlamak, ilk bakışta göründüğünden daha fazla hata modu doğurur ve global değişkenlere çok benzer
Clang, derleme sırasında
-DCLANG_DEFAULT_CXX_STDLIB=libc++gibi varsayılanları içine gömebilir;DEFAULT_SYSROOTda kullanışlıdırrpathkullansanız bile, kullanıcıLD_LIBRARY_PATHayarlı halde çalıştırırsa ikilininDT_RUNPATHdeğeri ezilebilirGünümüzde
-Wl,rpathaslında rpath değil, daha az kullanışlı olanrunpathanlamına geliyor; muhtemelen istediğiniz çağrı-Wl,rpath -Wl,--disable-new-dtags, böylece yükleyici kütüphane ararkenLD_LIBRARY_PATHdeğerini yok sayarClang derleme bayrakları, statik linkleme ve ikili içinde ikili gömme gibi şeylerin birleşimiyle ortam değişkeni manipülasyonunu tamamen ortadan kaldırmak büyük olasılıkla mümkün
clang-16ikilisinin dinamik linklenmiş olması ve çalışma zamanındalibLLVMAArch64CodeGen.so.16gibi şeyleri araması da hata modlarını artırıyorLLVM_BUILD_STATIC=ON, HPC modül araç zincirinin etkin olduğu ortamlarda yanlış kütüphaneyi çekme sorununu azaltabilirAraçlar
libc++.so,libc++abi.sovb. dosyalara linklenmiş; statik libc++ düşünmeye değer, en azındanlibc++abivelibunwind’ı libc++ içine statik linklemek daha iyi olurLinux’ta dinamik linkli program dağıtmaya sabrım tamamen tükendi
README’deki
source ourhackya da modül sisteminin bıraktığı ortam değişkenleri uygulamamın çalışma zamanı kütüphanelerini değiştirirse kullanıcı deneyimi ve sonraki hata raporu maliyeti korkunç olurBuna kıyasla statik linkleme gerçekten harika
source environmentyapılacağı varsayımı altında geçerliAslında bunu önermemizin nedeni yalnızca demo ikilileri için dağıttığımız GCC’nin kullanılmasını sağlamaktı; amaçlanan kullanım biçimi
./revngbetiğiBu durumda ortam değişiklikleri yalnızca
revngçağrısını etkilerBelgeler burada: https://docs.rev.ng/user-manual/working-environment/
source ./environmenthakkında bir uyarı eklemek iyi olurLD_LIBRARY_PATHkullanmamak için çok zaman harcadık ve her ELF’nin bağımlılıklarını göreli yollarla referansladığı tamamen kendi kendine yeterli bir ikili seti oluşturduk.LD_LIBRARY_PATHkötülüktürHARD_değişkenleri yalnızca derleyici wrapper’ında kullanılıyor ve gerçekten çakışma olasılıklarının çok düşük olduğunu düşünüyorumAWS_EC2_METADATA_DISABLED="true"için asıl tartışma https://github.com/revng/revng/pull/309#discussion_r12805759... adresindeAWS SDK’yı yamalayarak bundan kaçınmak mümkün olabilir ama her hâlükârda yalnızca rev.ng bulutta çalıştırıldığında etkisi var
RPATH_PLACEHOLDERveHARD_FLAGS_CXX_CLANG, revng’nin çevirdiği ikilileri linklerken kullanılıyor; uçtan uca ikili çeviriyle ilgilenmiyorsanız önemli değillerBiz bilinçli olarak
DT_RUNPATHistiyoruz.DT_RPATHkullanım dışına çıkarılmak üzere veLD_LIBRARY_PATHile bizim kütüphanelerimizi değiştirmeniz gereken kullanım senaryoları olabilir“Ortam manipülasyonu” eleştirisinin yalnızca özel olmayan ortam değişkenleri söz konusu olduğunda geçerli olduğunu düşünüyorum
RPATH_PLACEHOLDER,HARD_*,REVNG_*özel değişkenler ve hepsi ikili çeviri amacıyla varBunları daha dar kapsamlı bir derleyici wrapper’ının içine itebiliriz ama Python’u da birlikte dağıttığımız için ortamı tamamen ortadan kaldıramayız
Clang’e bazı bayrakları gömmek tek başına yeterli değil. Bu bayraklar linker’ı da etkiliyor ve wrapper işlevlerinin basitçe yerleşik hâle getirilemeyecek kısımları var
Yine de bunları daha özel bir konuma taşıyabiliriz
Dinamik linklemeye temkinli yaklaşıyor gibisiniz; biz buna emek verdik ve artık oldukça iyi çalışıyor, her zaman doğru konumu buluyor
Mutlak yolları hardcode etmiyoruz, ikiliyi “yamalamak” gibi bir kurulum adımı da yok. Arşivden çıkarılan dizin istenen yere taşınabilir
Kullandığımız çözüm
LD_LIBRARY_PATHkullanmıyor; tüm ikililer$ORIGINüzerinden birbirlerini sağlam biçimde referanslıyor./root/bin/python ./root/bin/revng artifact --helpçalıştırırsanız çalıştığını görürsünüzTekrar söyleyeyim,
source environmentneredeyse yalnızca demo amaçlı; gerçek kullanımda sadece./revngçalıştırırsanız ortam olduğu gibi kalırPython’u da birlikte dağıtıyoruz ama onu kullanmak zorunda değilsiniz.
./revngkullanabilir veya daemon modunda ağ üzerinden etkileşime geçebilirsinizYaklaşım, istediğiniz betikleme aracıyla YAML proje dosyasını ayrıştırıp değiştirdikten sonra
./revng artifactçağırmak ya da daemon ile etkileşime geçmek: https://docs.rev.ng/user-manual/model-tutorial/Sonuç olarak biz güncel Python sürümünü kullanıyoruz, kullanıcı da istediği dili kullanabiliyor
İleride, çeşitli Python sürümleriyle uyumlu yardımcı bir wrapper’ı PyPI’da sunmayı planlıyoruz
Özetle
source ./environmentyapmayın,./revngkullanınBirilerinin bu tür ayrıntılara önem vermesine sevindim
Bir sonraki büyük iterasyonda nix + mount namespace’i devreye alıp root yetkisi olmadan
/nix/storekullanılmasını sağlayarak birçok şeyi basitleştirebilirizBu tür tartışmaları burada değil de Discord sunucusunda yapmak daha iyi olabilir
QEMU TCG'ye lifting işini emanet ettiğiniz için pişmanlığınız var mı, yoksa iyi çalıştı mı?
Birincisi, QEMU fork'umuzu birkaç yıl boyunca rebase etmediğimiz için kötü bir duruma düştük
Yine de tam bugün ekipten biri en güncel QEMU ile lifting yapmayı başardı ve QEMU'ya destek eklenmesine yardımcı olduğumuz Qualcomm Hexagon kodunu da lift edebildi
Sonuçta ilk düzgün Hexagon decompiler biz olacağız
İkincisi, QEMU'ya fazla odaklandığımız için front-end QEMU ile sıkı biçimde birleşti
Artık QEMU tabanlı olmayan ek front-end'leri desteklemek biraz çaba gerektirecek, ama imkânsız değil
Tasarladığımız şey, kullanıcı yeni bir mimari desteği eklerken yalnızca C ile CPU durum yapısını ve onun üzerinde çalışan birkaç fonksiyonu tanımlasın
İç temsili öğrenmesine gerek kalmasın
Özetle QEMU harika bir tercihti; o kadar iyi çalıştı ki kod tabanının o kısmına uzun süre dokunmadık ve teknik borç birikti, ama şimdi bunu çözüyoruz