Android-x86 Tricks

Bu yazımda Android-x86 ile ilgili edindiğim tecrübeleri paylaşıyor olacağım. Deneyimlerimin çoğunluğu Android-x86 7.1.2 versiyonunda edinilmiştir. Özellikle yeni versiyonlarında bu sorunlar ortadan kalmış olabilir yada aynı şekilde davranış göstermeyebilir.

Native Arm Library Support and Problems

Android x86 Android 5.1 versiyonundan sonra arm native bridge mechanism ile yanlızca arm native kütüphaneye sahip uygulamaları da desteklemeye başlamıştır. Bu destek Settings->App compability->Enable native bridge seçeneği ile aktif ediilmektedir.

Buradan kolayca aktif edilebilen destek çeşitli sebeplerle çalışmayabiliyor.
Bu butonun arka planda yaptığı şey şöyle;

root yetkisiyle /system/bin/enable_nativebridge scriptini çalıştırıyor.
Eğer bu seçeneği aktifleştirdiğiniz halde çalışmıyorsa su ile root haklarını aldıktan sonra /system/bin/enable_nativebridge scriptini çalıştırabilir ve debug edebilirsiniz. Bu script houdini.sfs i indirerek bu işlemi gerçekleştirmektedir. Fakat bu url ilginç bir şekilde sunucu hizmeti aldığım yerde engellendiği için dosyanın indirilememesi gibi bir problemle karşılaşabilirsiniz ya da Android-x86 nın eski versiyonlarında goo.gl url kısalma servisinin https e redirect etmesi ve android curl un https desteği olmaması sebebiyle indirme yapılamayabilir. Bu durumda enable_nativebridge scriptindeki goo.gl linkinin orjinalini tarayıcınızda edinip script içerisinden değiştirebilirsiniz.

Root ADB Only

Eğer root izinlerini uygulamalara vermeyip kendiniz shell’de root olmak istiyorsanız normalde adb shell ile terminale bağlandıktan sonra su ile root olabiliyorsunuz.
Fakat Android-86 da su binary çalıştırıldığında 255 return ediyor.
Android-x86’da adb ye bağlandıktan sonra adb root komutu ile adb yi root olarak başlatmanız ve bağlantı koptuysa tekrar bağlanmanız gerekiyor tekrar bağlandığınızda root olarak işlem yapabilirsiniz.

Enable ADB Root Permanently On Boot

Her seferinde bununla uğraşmak istemiyorsanız ramdisk.img içerisinde düzenleme yapmanız ve
ro.secure=0
ro.debuggable=1 gibi parametreleri düzenlemeniz gerekmektedir.
Bu parametreler hakkında detaylı bilgi edinmek için şuraya bakabilirsiniz:

https://source.android.com/setup/develop/new-device#build-variants

ramdisk.img modifiye etmek için şu adımları takip edebilirsiniz:

  1. Upload the ramdisk.img to your linux machine
  2. Change the ramdisk.img name to ramdisk.cpio.gz, and extract it by: # gzip -d ramdisk.cpio.gz
  3. Create a temporary folder, say tmp, copy ramdisk.cpio to tmp folder
  4. Extract the ramdisk.cpio in the tmp folder with command: # cpio -i -F ramdisk.cpio
  5. Remove the ramdisk.cpio in the tmp folder, and make any changes you want to the extracted ramdisk.cpio in tmp folder
  6. Recreate the ramdisk.cpio with command: # cpio -i -t -F ../ramdisk.cpio | cpio -o -H newc -O ../ramdisk_new.cpio

Kaynak: https://hvera.wordpress.com/2010/10/19/step-by-step-to-createmodify-ramdisk-img/

Modifiye ettikten sonra ramfs.img dosyasını bir iso aracı kullanarak orjinali ile değiştirin.

Modifying build.prop manufacturer and model

/system/build.prop dosyası bir sistem dosyasıdır her android cihazda bulunur adı üzerinde build bilgisini ve sistem özelliklerini barındırır. Boot esnasında yüklendiği için değişiklik yapıldıktan sonra değişikliklerin aktif olması için yeniden başlatmak gerekir.

Buradan değiştiremeyeceğimiz bazı ayarlar vardır bunlardan bazıları ro.product.manufacturer ve ro.product.model dir.

Bu ayarlar boot sırasında /etc/init.sh dosyası çalıştırılarak modifiye edilmektedir. Varsayılan olarak sys_vendor ve product_name değerleri atanmaktadır. Bu değerler /sys/class/dmi/id/ dizini altında tutulur.

Buradan Google Cloud, AWS, VirtualBox ve Google Cloud için örnek /sys/class/dmi/id/ lere ulaşabilirsiniz https://wiki.liutyi.info/pages/viewpage.action?pageId=7930129
Vmware için de Settings->About tablet seçeneğinde aşağıdaki şekilde değerlerin set edildiğini görüyoruz.

Bu değerleri init.sh dosyamızdan manuel olarak değiştirebiliriz.

Android-x86 Iptables

Android-x86 da iptables yeniden başlatıldığında sıfırlanmaktaydı.
iptables-save ve iptables-restore binaryleri mevcut olmasına rağmen görevlerini yerine getirmiyorlardı. strace ile çalışmalarını inceleyip çözüm geliştirmeye çalışsam da başarılı olamadım. Her açılışta sıfırlanma sorununu daha önce de bahsettiğim /etc/init.sh dosyasını düzenleyerek çözdüm. Dosyanın en altına return fonksiyonunun üzerine iptables komutlarımı yazarak her açılışta tekrar aktif olmalarını sağladım.

Bu yazıda Android-86’da farklılık gösteren sıkıntı yaratan noktaları ele aldım. Bir sonraki yazıda görüşmek üzerek.

CA Root Certificate Install

Ca root sertifika yüklemek için Root Certificate Manager ROOT yazılımı kullanılabilir. Fakat bu yazılımın çalışması için root izni gereklidir. Eğer root izni sadece ADB de ise oluşturulan sertifika system/etc/security/cacerts/ dizinine kopyalanabilir. Dosya ismi önemlidir. Dosya ismi .0 ile bitmelidir ve özel olarak ayarlanmalıdır. Dosya ismini ayarlamak için öncelikle sertifika DER tipinde ise (Binary encoded .crt yada .cert varsayılan uzantılı) PEM tipine (BASE64 ASCII .pem varsayılan uzantılı) çevrilmelidir.
Çevirme işlemi için;
openssl x509 -inform der -in <filename>.der -out <filename>.pem
Oluşan yeni pem formatındaki dosyaya;
openssl x509 -inform PEM -subject_hash_old -in cacertificate.crt | head -1
Komutu ile özel isim elde edilir.

Trust ADB

OS: (Adb ile yeni keyi oluşturup http ile sunuyoruz)
rm /root/.android/* & adb kill-server && adb start-server
python3 -m http.server 80
Android: (oluşturulan adbkey.pub ı androidde adb_keys olarak kaydediyoruz)
wget 192.168.179.135/adbkey.pub > /data/misc/adb/adb_keys