Bir kaç gün önce Donanımhaber forumlarında 1. nesil bir iPhone’un internet bağlantısı olmadan da konum tespiti yapabildiğini belirten bir başlık açılmıştı. Acaba olabilir mi diye kurcalarken gördüm ki iPhone’daki Maps uygulaması, yer tespiti yaptıkça /var/root/Library/Caches/locationd klasöründeki cells.plist dosyasına bazı bilgiler eklemekteymiş.
Sahte GPS için internet gerekliliği
Öncelikle belirtmeliyim ki haricen bir işlem yapılmadığı sürece birinci nesil iPhone’larda internet bağlantısı olmadan konum tespiti yapılması mümkün değil, hatta 2.0’dan önceki bellenimlerde internete bağlı değilken konum tespit tuşuna bastığınızda internete bağlı olmadığınızı belirten bir hata alıyordunuz ve yanlış da olsa bir konum gösterilmiyordu. 2.0.0 belleniminden sonra ise internete bağlı değilseniz de bir hata almayabiliyorsunuz ve iPhone doğru veya yanlış bir konum gösterebiliyor.
Bu durumu test etmek için hareket halindeki bir aracın içerisinde internet açık ve kapalıyken konum tespiti yaptırmaya çalıştım ve gördüm ki interneti kapatıp konum tespiti yapmaya çalıştığımda bazen en son geçerli koordinatımı gösterirken bazen daha önceki geçerli noktalardan birisini de gösterebiliyordu. Yani “en son noktayı” gösteriyor deyip işin içinden çıkamıyorduk. Bunu farkettikten sonra önbellek olarak kullanılan dosyayı bulabileceğimi ümit ederek dosya sisteminde gezinmeye başladım.
İlk tahminim /var/mobile/Library/Caches altındaki MapTiles.sqlitedb dosyası oldu fakat bu veritabanında, haritada kullanılan resimlerden başka pek de bir bilgi olmadığını gördüm.
İlginç bir klasör: /var/root/Library/Caches/locationd
/var/root/Library/Caches altında ise locationd diye bir klasör buldum. İçerisinde cache.plist, clients-b.plist ve cells.plist diye üç adet dosya ve wifi diye bir klasör yer alıyordu. “clients-b.plist” dosyasında son tespit edilen konumla beraber WifiGUID değeri ve Apple’ın kötü niyetli uygulamaların listesini tutacağı tahmin edilen https://iphone-services.apple.com/clbl/unauthorizedApps adresi bulunuyor. İlginçtir ki, “cache.plist” dosyasının içeriği bu adresin içeriği ile aynıydı. Zdziarski, yazdığı bir yazıda DNS kandırmacası ile bu adresi taklit edip telefonundaki bazı uygulamaları kapatabildiğini belirtmiş. Betinzer bir test uygulanıp clients-b.plist dosyasının içeriğinin değiştirilip değiştirilmediği de kontrol edilebilir belki.
(Bu arada, wifi klasörünün içerisinde herhangi bir dosya yoktu. Tahmin ediyorum ki konum tespiti yaparken Skyhook‘ta tanımlı bir wifi bağlantı noktasının yakınındaysanız ilgili bilgiler bu klasörde tutuluyor olacaktır.)
cells.plist dosyasında konum önbelleklemesi
Gelelim asıl dikkatimi çeken dosya “cells.plist”e. Dosyaya ilk baktığımda içeriği şu şekildeydi:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>.lastpurge</key>
<integer>240785321</integer>
<key>286,001,0x8e36,0xecd8</key>
<string>2,+39.99401855,+32.62229919,1799,1</string>
<key>286,001,0x92e6,0xe492</key>
<string>2,+40.09725952,+33.03080750,1799,1</string>
</dict>
</plist>
<string> içerisinde enlem ve boylam bilgilerinin olduğu aşikar. Google Maps’te bu koordinatları girdiğimde gördüm ki tam olarak son iki konum tespitimin yerleri. Tam bir karar vermek için işten eve dönerken EDGE ve harita uygulamasındaki konum belirleme işlevini etkin hale getirip dosya içeriğinin nasıl değiştiğini takip ettim. Görünen o ki her bir konum tespiti sonrasında kullanılan baz istasyonunun bilgileri ve hesaplanan koordinatı bu dosyaya ekliyordu. 45 dakikalık yolculuğun sonrasında cells.plist dosyasında 39 adet konum bilgisi eklenmişti bile. Peki bu bilgiler ne kadar kullanılıyordu?
Ertesi sabah işe giderken EDGE’i etkin hale getirmeden Maps uygulamasını açtım ve konumumun tespit edilmesini beklemeye koyuldum. Bir önceki gün konum bilgileri kaydedilmiş olan güzergah üzerinde ilerliyor olmama rağmen harita herhangi bir konum gösteremiyordu. cells.plist dosyasını açtığım zamansa içeriğinin silindiğini farkettim. Neyse ki cells.plist dosyasının yedeğini almıştım ve bu yedeği geri yükledim. Dosya içerisindeki “.lastpurge” değerinin dosyanın geçerliliğinin kontrolünde kullanılan bir zaman değeri olduğunu düşünüp en soldaki 2’yi 5 olarak değiştirdim ve Maps uygulamasını yeniden çalıştırdım ve ahanda :), konumum yaklaşık olarak gösteriliyordu. Daha da güzeli, işe gidene kadar konumum yaklaşık olarak gösterilmeye devam etti.
Öyleyse internet olmadan sahte GPS ile konum tespiti mümkün mü?
Evet, benim yaptığım gibi internet açıkken konum tespiti yapıp cells.plist dosyasını baz istasyonu ve koordinat bilgileri ile doldurursanız ve bu dosyanın silinmesine engel olabilirseniz aynı konum civarlarında gezerken internete bağlı olmasanızda yaklaşık olarak konumunuzu tespit etmeniz mümkün. Peki bu yöntem ne kadar pratiktir, daha nasıl geliştirilebilir, onlar da ayrı bir yazının konusu olacak 🙂