Sunday, January 6, 2013

Android APK dosyası inceleme (reverse engineering)

Android'e bir şekilde bulaştıysanız AppBrain'i duymuşsunuzdur. Google'ın Android Market'ine alternatif olan ve size uygulama tavsiye edebilen bir site. AppBrain'in bir de istatistik hizmeti var. Bu istatistikler içinde benim en çok ilgimi çeken Developer tools istatistikleri. Örneğin ACRA kütüphnesini kullanan top 10 uygulamayı görebiliyorsunuz. AppBrain'in bu istatistikleri nasıl topladığını merak ediyorsanız okumaya devam edin.

Bu yazıda apk dosylarının, reverse engineering ile nasıl inceleneceğini adım adım anlatacağım.

1. Apk dosyasını indirme

Android projelerinin emulatörde ya da cihazda çalışabilmesi için projenin paketlenmesi ve imzalanması gerekiyor. Proje paketlendiğinde '.apk' uzantılı bir dosya oluşur. Apk dosyalarının oluşturulması ile ilgili detaylı bilgi almak isteyenler resmi android geliştirici sayfalarındaki Building and Running bölümüne bakabilir.

Apk dosyasını indirebilmek için apk downloader adında bir araç kullanacağız. Apk-downloader bir Chrome eklentisi. Android Market'te uygulamanın sayfasına girdiğinizde adres barında apk indirmek için bir düğme çıkartıyor. Apk-downloader, Google hesap bilgilerinize (şifreniz dahil) ve Google'a kayıtlı Android cihaz'ınızın Google Service Framework ID'sine ihtiyaç duyuyor. Google hesap bilgileriniz bizi hiç ilgilendirmiyor dese de işim bittikten sonra Google şifremi değiştirdim, size de aynısını tavsiye ediyorum. İncelemek istediğimiz uygulamayı Android Markette bulduktan sonra apk'yı indiriyoruz.

Instagram'ın popüler Android uygulamasının apk dosyasını aşağıdaki şekildeki gibi apk-downloader'ın apk indirme düğmesini kullanarak indirdim.

2. dex2jar

İkinci aracımız dex2jar. Dex2Jar sayesinde dex formatındaki dosyalari java class dosyalarına çevireceğiz ve java decompiler ile class dosyalarını java dosyalarına çevireceğiz. dex dosyasının açılımı "Dalvik executable". Android uygulamarını çalıştıran virtual machine (Dalvik), java class dosyalarını değil dex formatındaki dosyaları okuyabiliyor.

dex2jar ile apk dosyasını aşağıdaki gibi jar (java archive) dosyasına çeviriyoruz.

tututil:TEMP ilkinulas$ ~/Development/tools/dex2jar-0.0.9.12/d2j-dex2jar.sh com.instagram.android.apk
dex2jar com.instagram.android.apk -> com.instagram.android-dex2jar.jar

Oluşan jar dosyasını okumak incelemek için Java Decompiler kullanacağız.

Java decompiler'ın arayüzü ile bakarsak Instagram'ın Android uygulamasınin aşağıdaki kütüphaneleri kullandıgını görebiliriz: (Aşağıdaki resim java decompiler'in arayüzünü gösteriyor.)

3. apktool

apk dosyasının içinde sadece derlenmiş dex dosyaları bulunmuyor. Uygulamayı meydana getiren AndroidManifest.xml dosyasi, res, assets, lib dizinleri de apk dosyası içinde bulunmakta. Bu dosyalara erişmek için apktool aracını kullanacağız.

Aşağıdaki komut ile apk dosyasını INSTAGRAM dizinine açıyoruz.

tututil:TEMP ilkinulas$ apktool decode com.instagram.android.apk INSTAGRAM
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/ilkinulas/Library/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...
tututil:TEMP ilkinulas$ ls -ltr INSTAGRAM/
total 32
drwxr-xr-x   8 ilkinulas  staff   272 Jan  6 16:32 smali
-rw-r--r--   1 ilkinulas  staff  8248 Jan  6 16:32 AndroidManifest.xml
drwxr-xr-x  46 ilkinulas  staff  1564 Jan  6 16:32 res
drwxr-xr-x   4 ilkinulas  staff   136 Jan  6 16:32 lib
drwxr-xr-x   8 ilkinulas  staff   272 Jan  6 16:32 assets
-rw-r--r--   1 ilkinulas  staff   247 Jan  6 16:32 apktool.yml
tututil:TEMP ilkinulas$

apk-downloader, dex2jar, java decompiler ve apktool ile siz de seçtiğiniz bir uygulamayı decompile edip inceleyebilirsiniz. Happy hacking :)

Sunday, December 30, 2012

Okey Oyunu İçin Açık kaynak kodlu AI

Okey Mini kodlarını parça parça Github'a taşımaya başladım. Bluetooth multiplayer altyapısını daha önce P2P4Android projesi ile paylaşmıştım. Şimdi de oyundaki botların kodlarını (AI) OkeyBot projesi altında toparladım. User Interface (UI) kodlarını da elden geçirdikten sonra onları da paylaşacağım.

Yazdığınız koda 1 yıl sonra dönüp baktığınızda beğendiğiniz oluyor mu hiç? Ne güzel yazmışım diyor musunuz? Benim çok nadir oluyor. Okey Mini'nin kodlarına da yaklaşık bir yıldır bakmıyordum. Kaynak kodlarını paylaşmadan önce bir bakayım dedim ve kendi yazdığım koda bakınca kendimden utandım. Sağda solda OO yazılım prensipleri, tasarım kalıpları hakkında atıp tuttarken yazdığım koda bunları pek yansıtmamışım. Kaynak kodlarını paylaşıp görücüye çıkarmadan önce bir elden geçirme icap etti. Geniş kapsamlı bir ref.cktoring'ten sonra içime sinen bir hale geldi. Hala eksik testleri var. Zamanla testlerini tamamlayıp test coverage'ı artırmayı düşünüyorum.

Okey Mini'de botlar hile yapıyor diyenlere de kapak olsun bu paylaşım :)

Friday, September 9, 2011

Android için Okey

6 Haziran'daki yazımda Okey Mini'nin 10 bin Android cihazda kurulu olduğunu yazmıştım. Aradan geçen 3 ay boyunca Okey Mini 45 bin kullanıcıya ulaştı. Bu yazıyı 50 binde yazmayı düşünüyordum ama sabredemedim :)

Android Markette uygulaması olanlar bilirler Developer Console'da çeşitli istatistikler yer alıyor. Bu istatistikleri paylaşmak istiyorum. Türkiye'deki Android kullanıcılarının bir kısmı hakkında (en azından okey sevenler hakkında) ilginizi çekebilecek veriler var.

İlk olarak Okey Mini'nin Nisan 2011'den bugüne kullanıcı sayısı grafiğini görüyorsunuz. 78 bin download olmasına rağmen 45 bin cihazda kurulu. Bu da demek oluyor ki her 100 kişiden 57'si uygulamayı beğenmiş ve kurduktan sonra kaldırmamış. Bu yüzde 57 değerini gerçekten çok az buluyorum keşke diğer uygulama geliştiricileri de bu şekilde raporlar paylaşsa da genel olarak active installation yüzdesi hakkında fikir sahibi olabilsek.

Aşağıdaki resim kullanıcıların 5 üzerinden verdiği puanları gösteriyor. Yeni versiyonu 1.2.x markete gönderdikten sonra 4.6 olan ortalama 4.5'e düştü. Android Market'teki tüm uygulamaları değerlendirdiğinizde genel olarak 4 ve üzeri puandaki uygulamalar iyi uygulamalar olarak kabul edilebilir (bana göre).

Okey Mini'nin kullanıcılarının büyük bir çoğunluğunun Türk kullanıcılar olduğunu tahmin ediyorum. Okey'i bizim oynadığımız kurallarla oynayan başka bir ülke yoktur heralde. İlk istatistiğimiz Android versiyonları ile ilgili. Android 2.3.3 burada başı çekiyor. Android 3.0 ve 3.1'in olması tabletlerde de oyunun oynanabildiğini gösteriyor.Bu istatistikten çıkartılabilecek en sinir bozucu sonuç ise piyasada bulunan Android cihazlarda 10 farklı Android versiyonu bulunması.

Sıradaki istatistik Okey Mini'yi oynayan Android kullanıcılarının cihazları ile ilgili. En fazla kullanılan ilk iki cihaz Samsung Galaxy S ve S2. HTC Desire HD de 3. sırada yer alıyor. Okey Mini için konuşacak olursak Samsung cihazların ezici bir üstünlüğü var.

Olur da Okey Mİni kullanıcı sayısı 100 bin'e ulaşırsa istatistikleri tekrar paylaşırım. Bu rakamlar son zamanlarda operator kampanyaları ile ne kadar çok android cihaz satıldığını da göstermiş oluyor bence. Son olarak Android candır diyerek sözlerime nokta koyuyorum.

Saturday, June 11, 2011

Yunan Adaları Turu - Atina - Haziran 2011

Az önce Çanakkele Boğazı'ndan geçtik. Akşamüstü saat beşte Karaköy'de olacağız. Dün Atina'yı görme fırsatımız oldu. Gemi sabah 9'da Lavrion limanına yanaştı. Atina'ya gelen cruise'lar genelde Pire'deki limanda konaklıyor, fakat Pire limanı çok kalabalık olduğu için bizim gemi daha tenha ve Atina'ya daha uzak olan (70 km) Lavrion limanına yanaştı.

Saat 10'da gemiden ayrıldık. Geç kaldığımız için kiralık araç bulamadık. Biz gözümüzü açana kadar tüm araçlar diğer yolcular tarafından kiralanmış. Lavrion'dan Atina'ya gitmek için 3 alternatif var.

  • 40 avroya araç kiralayabilirsiniz (20 avroluk benzin yeterli olacaktır.)
  • Taksiler Atina'ya 80 avroya götürüyorlar. (Tabi bunun bir de dönüşü var.)
  • En yakın tren istasyonuna (Koropi) 40 avroya gidip, oradan 1.60 avroya Atina merkeze gidebilirsiniz.
Biz üçüncü seçeneği seçtik. Lavrion'dan Atina'ya 1 saat 20 dakika'da gidebildik. Atina'ya vardığımızda saat 12'ydi.

Atina'da ilk görülmesi gereken yer Atina Akropolisi. Akropolis "yukarıdaki şehir" anlamına geliyormuş. Yüksek kayaların üzerine 2500 yıl önce kurulmuş tapınaklar Atina'nın simgesi olmuş. Bu tapınakların en görkemlisi Partenon tapınağı. (Fotoğraflarda gözüken büyük sütunlu yapı). Bu tapınak Atina'yı koruyan tanrıça Athena için yapılmış. Atina'nın adı da bu tanrıçadan geliyormuş.

Tapınaklar'ın bulunduğu yere çıkmak 12 avro ve yürüyerek çıkmak zorundasınız. Nurten hamile olduğu için tepeye çıkmadı aşağıda beni bekledi. 150-200 metrelik bir tırmıştan sonra manzarayı izleyip ve bir kaç fotoğraf çekip aşağıya indim. Akropolis'ten Atina manzarasını aşağıdaki fotoğraflarda görebilirsiniz.

Gemi'ye dönüş için 3 saatimiz kalmıştı. 1 saat etraftaki mağazalarda takılıp dönüş için taksi aramaya başladık.

Burada taksiler çok lüks, çoğu Mercedes. Taksimetre açanına da rastlamdım hiç. Herşey pazarlık usulü. İngilizce bilen bir taksi şoförü bulabilirseniz şanslısınız. Geminin kalkmasına 2 saat kala bir taksi ile 65 avroya anlaşıp Atina'dan limana doğru yola çıktık.

Bu bizim ilk cruise seyahatimizdi. Bizim tatil anlayışımıza ters olduğu için bir daha böyle bir tatil yapmayı düşünmüyoruz. 500 kişi ile beraber seyahat etmek, yemek yemek, müzik dinlemek, güneşlenmek gerçekten zor. Açık büfede biten yemekler, herşey dahil olmasına rağmen biten içecekler, her gece "aynı" dans şovları turun kötü yanlarıydı. Öte yandan denizin ortasında geceleri yıldızları izlemek çok güzeldi. Ayın denizdeki ışıltısının gemiyi takip etmesi de görülmesi gereken bir manzaraydı. Ayrıca Casino'lara merakınız varsa cruise seyahatleri tam size göre.

Tatil bitti :( Gezdiğimiz gördüğümüz yerleri kısa kısa anlatmaya çalıştım. Umarım bu yazı dizisi ileride Yunan Adaları turuna katılmak isteyenlere tur ile ilgili bir fikir verebilir.

Thursday, June 9, 2011

Yunan Adaları Turu - Girit - Haziran 2011

Tatilin sonunu düşünmeye başladım yine. Bugün Girit, yarın Atina, cumartesi sabah da İstanbul'dayız. Girit çok büyük bir ada. Kuzeyi Ege Denizi'ne güneyi Akdeniz'e bakıyor. Böyle büyük bir adayı bir günde gezmek imkansız. Gemi sabah 8'de Girit'in en büyük şehri Heraklion'daki limana yanaştı. Bugün tura katılmadığımıza pişman olduk. Rodos'u kendimiz gezebilirdik fakat Girit'i gezmek için burayı iyi bilen birisi şart.

Kahvaltıdan sonra çantamızı hazırlayıp gemiden ayrıldık. Liman çok büyük olduğu için limanın girişine transfer otobüsleri ile gittik. Limandan çıkınca sora sora otobüs garını bulduk, atladık en yakın plajdan geçen otobüse. Arina Sand Beach'in önünde otobüsten indik. Bugün hava kapalı, hatta biz plajdayken ufak ufak da yağmur atıştırdı. Denize girmeden gerisin geri otobüs garına geri geldik. Aşağıdaki fotoğrafta güneş olmadığı için plajın boş kaldığını görebilirsiniz.


Otogardan taksi ile 5 Avro'ya şehir merkezindeki Aslanlı Çeşme'nin bulunduğu meydana gittik. Burası kafeler ve restoranlarla dolu bir meydan. Öğle yemeğini aşağıdaki resimde gözüken İzmir Kebap'ta yedik. Eşim (Nurten) hamile olduğu için Girit'in meşhur deniz ürünleri restoranlarında yemek yiyemedik.




Dinlene dinlene Girit sokaklarında dolaşırken arada serpiştiren yağmur ile serinliyorduk. Adada Venedikliler bıraktığı izler çoğunlukta. Aşağıdaki fotoğrafta Adayı denizden gelen baskınlara karşı koruyan kale duvarları (Fortress) gözüküyor. Osmanlı İmparatorluğu'nun bu duvarları aşıp Heraklion'u (diğer adıyla Kandiye) alması 24 yıl sürmüş.





Girit'ten beklediğim randımanı alamadık. Gezilecek çok yer var fakat zaman çok kısıtlı. Şu anda limandan ayrılmak üzereyiz. 3 yolcu henüz geri dönmemiş. Eğer 15 dakika içinde gelmezlerse gemi yolcuları almadan Atina'ya hareket edecek. Gemiyi kaçırma korkusu ile Girit'i doya doya gezememenin bir eksikliği var şu an içimde.

Wednesday, June 8, 2011

Yunan Adaları Turu - Rodos - Haziran 2011

Ben bu satırları yazarken gemimiz Alexander Von Humboldt Rodos'tan Girit'e doğru ağır ağır ilerlemekte. Bugün ilk defa geminin neden bu kadar yavaş ilerlediğini anladım. Jeton 4. günde ancak düştü. Gemi limandan ayrılır ayrılmaz bir sonraki limana kadar Casino açılıyor. Gemi uluslararası sularda hareket halinde olduğu sürece kumar devam ediyor. İşletmeciler, kumarhane ne kadar çok açık kalırsa o kadar çok para kazanacakları için aksamları 4-5 saatlik yolu 9-10 saatte alıyoruz.

Gemimiz güneye inmeye devam ediyor. Bugün Rodos'u gezme fırsatı bulduk. Yıllarca elden ele geçmiş bu ada Osmanlı'nın da elinden geçmiş. Adayı yıllarca korumayı başarmış Rodos Şövalyeleri Kanuni Sultan Süleyman'ın ordularına direnememiş ve ada 1522 yılında Osmanlı İmparatorluğu'nun eline geçmiş. 1912 yılında Trablusgarp Savaşı sırasında İtalyanlar tarafından işgal edilmiş ve 1948 yılında Oniki adalar'ın diğer adaları ile beraber Yunanistan'ın eline geçmiş. Rodos ile ilgili çarpıcı bir bilgi daha : Türkiye ile Rodos arasındaki en kısa mesafe 18 km.

Limana girer girmez Şövalyeler zamanında yapılan kale ve surları göze çarpıyor. Adada Osmanlı zamanından kalma binalar ve camiler de var. Halen Rodos'ta yaşan 3000 civarında Türk varmış. Aşağıdaki fotoğraf limandan çekildi. Surlar, arkasındaki cami ve kilise Rodos'un geçmişinin küçük bir özeti gibi.




Rodos ziyaretimiz ile Dünyanın Yedi Harikası'ndan birisi olan Rodos Heykeli'ni de gömüş olduk. Gördük dediysem yanlış anlaşılmasın turistik eşyalar satan dükkanların vitrinlerinde görebildik. M.Ö. 280 yılında yapılmış ve yapıldığı yıldan 96 yıl sonra yaşanan deprem ile yıkılmış (Bkz. İskenderiye Feneri) 30 metreyi aşkın bronzdan yapılmış Rodos Heykeli'nin yerine (limanın girişi) aşağıdaki fotoğrafta gözüken iki tane geyiği koymuşlar. Geyik heykellerinin oraya kimin zamanında dikildiğini öğrenemedim. Ne amaçla dikildiğinin mantıklı bir açıklaması vardır elbet.




Rodos'a Şövalyeler adası da diyorlar. Kudüs'ü koruyan Tapınak Şövalyeleri Kudüs düşünce Rodos'a geliyorlar ve 200 yıldan fazla adayı muhafaza ediyorlar. Rodos Şövalyeleri o zamanın güvenlik görevlileri, meslekleri savaşmak olan bir topluluk. Kuşatmalara karşı yaptıkları kale ve surları da görülmeye değer. Surlar lahana yaprakları gibi. Birisinin kapısından girince kalenin içine girdiniz sanıyorsunuz ama başka bir sur çıkıyor karşınıza. O suru geçiyorsunuz başka bir köprü ve başka bir sur ile karşılaşıyorsunuz. Fakat Sultan Süleyman'a dayanamamış bu surlar. Aşağıdaki fotoğrafta kalenin girişi sandığım bir kapıyı görebilirsiniz.




Kalenin içi restoranlar, kafeler ve hediyelik eşya satan dükkanlar ile dolu. Aynı bizim Kapalıçarşı'mız gibi. Aşağıdaki fotoğrafta Kanuni Sultan Süleyman tarafından yaptırılmış camiyi ve minarenin başında nöbet tutan şövalyeyi görebilirsiniz :)




Öğleden sonra Rodos'un meşhur plajlarından birisi olan Falaraki Plajı'na gittik. Mykonos'taki Paradise Beach'ten sonra burası gözüme Kilyos Halk Plajı gibi geldi doğrusu. Hiç bir özelliği olmayan bir plaj bence. Rodos'a günübirlik giderseniz plajda vakit öldürmeyin, kaleyi, çarşıyı ve müzeleri gezin derim. Aşağıdaki foto'da plajdan bir görüntü var.




Yolculuğumuzu kısa kısa anlatmaya çalışıyorum, çünkü biz de kısa kısa gezebiliyoruz. Gezdiğimiz adaların hiçbiri bir günde gezilebilecek adalar değil. Herbir ada için bir hafta ayırmaya değer. Emekli olduğumuzda bastonumuz ile gelir gezeriz artık :)

Tuesday, June 7, 2011

Yunan Adaları Turu - Santorini - Haziran 2011

Gece eğlencesine akan yolcular da geldikten sonra, sabaha karşı saat 4'te gemimiz Mykonos'tan ayrıldı. Sıradaki durak Santorini. Mykonos eğlencenin merkezi ise Santorini de romantizmin merkezi imiş.

Aşağıdaki fotoğrafta gemi Santorini'ye doğru yol alırken Ege Denizi'nde bıraktığımız iz gözüküyor.




Santorini Adası, aslında bir krater. Ortasındaki volkan patladıktan sonra oluşan krater aşağıdaki resimdeki gibi bir görünüm oluşturmuş. Ada, su ve yeşillik fakiri bir ada. Mykonos gibi burada da yeraltı kaynak suyu olmadığı için adaya su anakaradan tankerler ile taşınıyormuş.



Gemi en soldaki adanın sol tarafından kraterin içine girdi. Bu tarafta geminin yanaşabileceği büyüklükte bir liman olmadığı için kraterin içinde demir attı. Adayı gezmek isteyen yolcuları filikalarla adaya taşıdılar. Biz de öğle yemeğinden sonra atladık bir filikaya doğru romantizmin merkezine.




Filikalar ile adaya indikten sonra iş bitmiyor. Yerleşim yerlerini adamlar manzanın en güzel olduğu ve ulaşımın en zor olduğu dağın tepesine yapmışlar. Tepeye çıkmak için üç seçenek var. Birincisi kişi başı 4 avro vererek teleferik kullanmak, ikincisi yukarıya doğru çıkan merdivenleri kullanmak, üçüncüsü de eşeklere binmek. Biz eşeklere acıdığımız için teleferikle çıktık.




Tepeye çıktığınız zaman buraya neden romantizm adası dediklerini anlıyorsunuz. Manzara çok güzel, bakmaya doyamıyor insan. Diğer adalarda olduğu gibi adaya tek bir renk hakim, beyaz. Gemiye dönüşte geç kalarız korkusuyla siyah kumları olan plaja inemedik, böylece bugünü denize girmeden kapatmış olduk. Yarın Rodos'ta bugünün acısını çıkartırız.


Santorini dünya üzerinde en çok fotoğrafı çekilen yerlerden birisiymiş dedi rehber. Aşağıdaki fotoğraflar da benim makinemden çıkanlar.