.dex
dosyası Dalvik bayt kodunun aktarım formatıdır. Bir dosyanın geçerli bir .dex
dosyası olması için belirli sözdizimsel ve anlamsal kısıtlamalar vardır ve yalnızca geçerli .dex dosyalarını desteklemek için bir çalışma zamanı gerekir.
Genel .dex bütünlüğü kısıtlamaları
Genel bütünlük kısıtlamaları, .dex
biçiminde ayrıntılı olarak açıklandığı gibi, bir .dex
dosyasının daha büyük yapısıyla ilgilidir.
Tanımlayıcı | Tanım |
---|---|
G1 | .dex dosyasının magic numarası dex\n035\0 veya dex\n037\0 olmalıdır. |
G2 | Sağlama toplamı, magic ve checksum alanı dışındaki tüm dosya içeriğinin Adler-32 sağlama toplamı olmalıdır. |
G3 | İmza, magic , checksum ve signature dışında tüm dosya içeriğinin SHA-1 karması olmalıdır. |
G4 | file_size , bayt cinsinden gerçek dosya boyutuyla eşleşmelidir. |
G5 | header_size değeri şu değere sahip olmalıdır: 0x70 |
G6 | endian_tag şu değerden birine sahip olmalıdır: ENDIAN_CONSTANT veya REVERSE_ENDIAN_CONSTANT |
G7 | link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs ve data bölümlerinin her biri için, offset ve size alanlarının her ikisi de sıfır olmalı veya her ikisi de sıfırdan farklı olmalıdır. İkinci durumda, uzaklığın dört baytla hizalanması gerekir. |
G8 | map_off dışındaki başlıktaki tüm uzaklık alanları dört baytla hizalanmalıdır. |
G9 | map_off alanı ya sıfır olmalı ya da veri bölümüne işaret etmelidir. İkinci durumda, data bölümünün mevcut olması gerekir. |
G10 | link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs ve data bölümlerinin hiçbiri birbiriyle veya başlıkla örtüşmemelidir. |
G11 | Bir harita mevcutsa her harita girişinin geçerli bir türü olmalıdır. Her tür en fazla bir kez görünebilir. |
G12 | Bir harita mevcutsa, her harita girişinin sıfırdan farklı bir uzaklığı ve boyutu olmalıdır. Uzaklık, dosyanın karşılık gelen bölümüne işaret etmelidir (yani, bir string_id_item string_ids bölümüne işaret etmelidir) ve öğenin açık veya örtülü boyutu, bölümün gerçek içeriği ve boyutuyla eşleşmelidir. |
G13 | Bir harita mevcutsa, harita girişi n+1 uzaklığı, harita girişi n plus than size of map entry n daha büyük veya eşit olmalıdır. Bu, örtüşmeyen girişler ve düşükten yükseğe sıralama anlamına gelir. |
G14 | Aşağıdaki giriş türlerinin dört baytla hizalanmış bir uzaklığı olmalıdır: string_id_item , type_id_item , proto_id_item , field_id_item , method_id_item , class_def_item , type_list , code_item , annotations_directory_item . |
G15 | Her string_id_item için string_data_off alanı, data bölümüne geçerli bir referans içermelidir. Başvurulan string_data_item için data alanı geçerli bir MUTF-8 dizesi içermeli ve utf16_size dizenin kodu çözülmüş uzunluğuyla eşleşmelidir. |
G16 | Her type_id_item için descriptor_idx alanının string_ids listesine geçerli bir referans içermesi gerekir. Başvurulan dize geçerli bir tür tanımlayıcısı olmalıdır. |
G17 | Her proto_id_item için shorty_idx alanı string_ids listesine geçerli bir referans içermelidir. Başvurulan dize geçerli bir kısa tanımlayıcı olmalıdır. Ayrıca, return_type_idx alanının type_ids bölümünde geçerli bir dizin olması gerekir ve parameters_off alanının sıfır olması veya data bölümüne işaret eden geçerli bir uzaklık olması gerekir. Sıfır değilse parametre listesi geçersiz giriş içermemelidir. |
G18 | Her field_id_item için hem class_idx hem de type_idx alanlarının type_ids listesinde geçerli dizinler olması gerekir. class_idx tarafından başvurulan giriş, dizi olmayan bir başvuru türü olmalıdır. Ayrıca name_idx alanının string_ids bölümüne geçerli bir referans olması ve başvurulan girdinin içeriğinin MemberName spesifikasyonuna uygun olması gerekir. |
G19 | Her method_id_item için class_idx alanının type_ids bölümünde geçerli bir dizin olması ve başvurulan girişin dizi olmayan bir başvuru türü olması gerekir. proto_id alanı, proto_ids listesine geçerli bir referans olmalıdır. name_idx alanı string_ids bölümüne geçerli bir referans olmalı ve başvurulan girdinin içeriği MemberName spesifikasyonuna uygun olmalıdır. |
G20 | Her field_id_item için class_idx alanının type_ids listesinde geçerli bir dizin olması gerekir. Başvurulan giriş, dizi olmayan bir başvuru türü olmalıdır. |
Statik bayt kodu kısıtlamaları
Statik kısıtlamalar, bayt kodunun bireysel öğeleri üzerindeki kısıtlamalardır. Genellikle kontrol veya veri akışı analizi teknikleri kullanılmadan kontrol edilebilirler.
Tanımlayıcı | Tanım |
---|---|
A1 | insns dizisi boş olmamalıdır. |
A2 | insns dizisindeki ilk işlem kodunun sıfır dizini olması gerekir. |
A3 | insns dizisi yalnızca geçerli Dalvik işlem kodlarını içermelidir. |
A4 | Talimatın indeksi n+1 olası işlenenler dikkate alınarak, talimat indeksi n artı talimatın uzunluğu n eşit olmalıdır. |
A5 | insns dizisindeki son talimat insns_size-1 dizininde bitmelidir. |
A6 | Tüm goto ve if-<kind> hedefleri aynı yöntem içindeki işlem kodları olmalıdır. |
A7 | packed-switch komutunun tüm hedefleri aynı yöntem içindeki işlem kodları olmalıdır. Hedeflerin boyutu ve listesi tutarlı olmalıdır. |
A8 | Bir sparse-switch komutunun tüm hedefleri aynı yöntem içindeki işlem kodları olmalıdır. İlgili tablonun tutarlı olması ve düşükten yükseğe doğru sıralanması gerekir. |
A9 | const-string ve const-string/jumbo talimatlarının B işleneni, dize sabit havuzunda geçerli bir dizin olmalıdır. |
A10 | iget<kind> ve iput<kind> talimatlarının C işleneni, alan sabiti havuzunda geçerli bir dizin olmalıdır. Başvurulan giriş bir örnek alanını temsil etmelidir. |
A11 | sget<kind> ve sput<kind> talimatlarının C işleneni, alan sabiti havuzunda geçerli bir dizin olmalıdır. Başvurulan giriş statik bir alanı temsil etmelidir. |
A12 | invoke-virtual , invoke-super , invoke-direct ve invoke-static talimatlarının C işleneni, yöntem sabiti havuzunda geçerli bir dizin olmalıdır. |
A13 | invoke-virtual/range , invoke-super/range , invoke-direct/range ve invoke-static/range talimatlarının B işleneni, yöntem sabiti havuzunda geçerli bir dizin olmalıdır. |
A14 | Adı '<' ile başlayan bir yöntem, .dex dosyasından kaynaklanan kod tarafından değil, yalnızca VM tarafından örtülü olarak çağrılmalıdır. Bunun tek istisnası, invoke-direct tarafından çağrılabilen örnek başlatıcıdır. |
A15 | invoke-interface komutunun C işleneni, yöntem sabiti havuzunda geçerli bir dizin olmalıdır. Başvurulan method_id bir arayüze ait olmalıdır (bir sınıfa değil). |
A16 | invoke-interface/range komutunun B işleneni, yöntem sabit havuzunda geçerli bir dizin olmalıdır. Başvurulan method_id bir arayüze ait olmalıdır (bir sınıfa değil). |
A17 | const-class , check-cast , new-instance ve filled-new-array/range talimatlarının B işleneni, tür sabiti havuzunda geçerli bir dizin olmalıdır. |
A18 | instance-of , new-array ve filled-new-array talimatlarının C işleneni, tür sabiti havuzunda geçerli bir dizin olmalıdır. |
A19 | new-array talimatı tarafından oluşturulan dizinin boyutları 256 küçük olmalıdır. |
A20 | new talimat dizi sınıflarına, arayüzlere veya soyut sınıflara atıfta bulunmamalıdır. |
A21 | new-array talimatının atıfta bulunduğu tür, geçerli, referans olmayan bir tür olmalıdır. |
A22 | Tek genişlikli (çift olmayan) bir talimat tarafından atıfta bulunulan tüm kayıtlar, mevcut yöntem için geçerli olmalıdır. Yani indeksleri negatif olmamalı ve registers_size değerinden küçük olmalıdır. |
A23 | Bir talimat tarafından çift genişlikli (çift) şekilde atıfta bulunulan tüm kayıtlar, mevcut yöntem için geçerli olmalıdır. Yani indeksleri negatif olmamalı ve registers_size-1 değerinden küçük olmalıdır. |
A24 | invoke-virtual ve invoke-direct talimatlarının method_id işleneni bir sınıfa (bir arayüze değil) ait olmalıdır. Sürüm 037 önceki Dex dosyalarında aynı durum invoke-super ve invoke-static talimatları için de geçerli olmalıdır. |
A25 | invoke-virtual/range ve invoke-direct/range talimatlarının method_id işleneni bir sınıfa (bir arayüze değil) ait olmalıdır. Sürüm 037 önceki Dex dosyalarında aynı durum invoke-super/range ve invoke-static/range talimatları için de geçerli olmalıdır. |
Yapısal bayt kodu kısıtlamaları
Yapısal kısıtlamalar, bayt kodunun çeşitli öğeleri arasındaki ilişkilere ilişkin kısıtlamalardır. Genellikle kontrol veya veri akışı analizi teknikleri kullanılmadan kontrol edilemezler.
Tanımlayıcı | Tanım |
---|---|
B1 | Bağımsız değişkenlerin sayısı ve türleri (kayıtlar ve anlık değerler) her zaman talimatla eşleşmelidir. |
B2 | Kayıt çiftleri asla parçalanmamalıdır. |
B3 | Okunabilmesi için öncelikle bir kayıt (veya çift) atanmalıdır. |
B4 | invoke-direct talimatı, yalnızca geçerli sınıfta veya onun üst sınıflarından birinde bir örnek başlatıcıyı veya yöntemi çağırmalıdır. |
B5 | Bir örnek başlatıcı yalnızca başlatılmamış bir örnekte çağrılmalıdır. |
B6 | Örnek yöntemleri yalnızca üzerinde çağrılabilir ve örnek alanlarına yalnızca önceden başlatılmış örneklerde erişilebilir. |
B7 | new-instance komutunun sonucunu tutan bir kayıt, örnek başlatılmadan önce aynı new-instance talimatı tekrar yürütülürse kullanılmamalıdır. |
B8 | Örnek başlatıcının herhangi bir örnek üyesine erişilebilmesi için başka bir örnek başlatıcıyı (aynı sınıf veya üst sınıf) çağırması gerekir. İstisnalar, başka bir başlatıcı çağrılmadan önce atanabilen, devralınmayan örnek alanları ve genel olarak Object sınıfıdır. |
B9 | Tüm gerçek yöntem argümanları, ilgili resmi argümanlarıyla atamayla uyumlu olmalıdır. |
B10 | Her örnek yöntemi çağrısı için, gerçek örneğin, talimatta belirtilen sınıf veya arayüzle atama uyumlu olması gerekir. |
B11 | Bir return<kind> talimatı, yönteminin dönüş türüyle eşleşmelidir. |
B12 | Bir üst sınıfın korumalı üyelerine erişirken, erişilen örneğin gerçek türü ya geçerli sınıf ya da onun alt sınıflarından biri olmalıdır. |
B13 | Statik alanda depolanan değerin türü, alanın türüyle atamayla uyumlu veya dönüştürülebilir olmalıdır. |
B14 | Bir alanda saklanan değerin türü, alanın türüyle atamayla uyumlu veya dönüştürülebilir olmalıdır. |
B15 | Bir dizide saklanan her değerin türü, dizinin bileşen türüyle atamayla uyumlu olmalıdır. |
B16 | throw komutunun A işleneni, java.lang.Throwable ile atamayla uyumlu olmalıdır. |
B17 | Bir yöntemin ulaşılabilir son talimatı ya bir geriye goto ya da dallanma, bir return ya da bir throw talimatı olmalıdır. insns dizisini altta bırakmak mümkün olmamalıdır. |
B18 | Önceki bir yazmaç çiftinin atanmamış yarısı, başka bir komutla yeniden atanıncaya kadar okunamayabilir (geçersiz kabul edilir). |
B19 | Bir move-result<kind> talimatının hemen öncesinde ( insns dizisinde) bir invoke-<kind> talimatı bulunmalıdır. Bunun tek istisnası, filled-new-array talimatının öncesinde de move-result-object talimatıdır. |
B20 | Bir move-result<kind> talimatının hemen öncesinde (gerçek kontrol akışında) eşleşen bir return-<kind> talimatı bulunmalıdır (buna atlanmamalıdır). Bunun tek istisnası, filled-new-array talimatının öncesinde de move-result-object talimatıdır. |
B21 | Bir move-exception talimatı, bir istisna işleyicide yalnızca ilk talimat olarak görünmelidir. |
B22 | packed-switch-data , sparse-switch-data ve fill-array-data sözde talimatlarına kontrol akışı tarafından erişilememelidir. |