之前有朋友希望能修改Android的gps信息,也就是說讓其他應用獲取gps信息時,取到修改后的信息。一開始聽上去感覺挺不靠譜的,后來網上查了下資料,發現還是有人搞定的,主要都是通過古河發布的注入代碼,將自己的內容注入到對應應用的內存。在這里,注入的過程就不敘述了,主要說下為什么能修改內容,用獲取gps信息來舉例。
首先Android中獲取gps信息的話主要通過這種方式:
關鍵代碼出現了,主要通過getSystemService()方法來獲取句柄,中間省略一系列復雜的查找步驟,,,我們最終找到一個地方,文件android.os.ServiceManager.java 中的getService()方法:
sCache又是什么呢:,,,看這里,直接根據名稱從HashMap中取,如果有就直接返回了。
關鍵代碼看完了,那么具體怎么做呢,很簡單,就是自己寫一個類,實現IBinder接口,然后通過反射方式將對應的名稱和你自己的IBinder添加到sCache這個HashMap中,那么程序通過getSystemService()方法取到的就是自己實現的IBinder類。接着就是實現自己的IBinder類了,很幸運的,在github上搜到了這個項目:https://github.com/aeoliazhang/android_inject_hook_demo,,這個是修改imei信息的,代碼相當全面,測試用的GpsIBinder也是根據這里面的ImeiBinder來修改的。
代碼就這么多,不過當時沒把具體的編譯和運行記錄下來,所以就自己搞定吧。坑還是很多的,新手還是多花點時間吧,有空會將編譯和運行的過程貼出來的。