Hook實(shí)現(xiàn)Android 微信、陌陌 、探探位置模擬(附源碼下載)
Hook實(shí)現(xiàn)Android 微信、陌陌 、探探位置模擬
最近需要對(duì)微信,陌陌等程序進(jìn)行位置模擬 實(shí)現(xiàn)世界各地發(fā)朋友圈,搜索附近人的功能,本著站在巨人肩膀上的原則 愛網(wǎng)上搜索一番。
也找到一些 代碼和文章,但是代碼大都雷同而且都有一個(gè)弊端 比如說 微信 對(duì)目標(biāo)函數(shù)實(shí)現(xiàn)hook之后第一次打開微信 第一次定位是可以改變的
但是 我如果想更換地址的話 就需要重啟手機(jī)了,重新加載hook了,試了很多次都是這樣滿足不了需求。
為了改進(jìn)這個(gè)地方我們從gps定義的源代碼流程開始看尋找hook系統(tǒng)函數(shù)的突破口
我也是看完之后才找到hook的地方 LocationMangerService 這個(gè)類
@Override
public void reportLocation(Location location, boolean passive) {
checkCallerIsProvider(); //檢測(cè)權(quán)限和uid
if (!location.isComplete()) {
Log.w(TAG, "Dropping incomplete location: " + location);
return;
}
//發(fā)送位置信息
mLocationHandler.removeMessages(MSG_LOCATION_CHANGED, location);
Message m = Message.obtain(mLocationHandler, MSG_LOCATION_CHANGED, location);
m.arg1 = (passive ? 1 : 0);
mLocationHandler.sendMessageAtFrontOfQueue(m);
}
那么我們可以hook掉這個(gè)location的參數(shù) 修改為我們想要定位的地方就可以實(shí)現(xiàn)效果了,
XposedHelpers.findAndHookMethod("com.android.server.LocationManagerService", lpparam.classLoader, "reportLocation", Location.class, boolean.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Location location = (Location) param.args[0];
XposedBridge.log("實(shí)際 系統(tǒng) 經(jīng)度"+location.getLatitude() +" 系統(tǒng) 緯度"+location.getLongitude() +"系統(tǒng) 加速度 "+location.getAccuracy());
XSharedPreferences xsp =new XSharedPreferences("com.markypq.gpshook","markypq");
if (xsp.getBoolean("enableHook",true)){
double latitude = Double.valueOf(xsp.getString("lan","117.536246"))+ (double) new Random().nextInt(1000) / 1000000 ;
double longtitude = Double.valueOf(xsp.getString("lon","36.681752"))+ (double) new Random().nextInt(1000) / 1000000 ;
location.setLongitude(longtitude);
location.setLatitude(latitude);
XposedBridge.log("hook 系統(tǒng) 經(jīng)度"+location.getLatitude() +" 系統(tǒng) 緯度"+location.getLongitude() +"系統(tǒng) 加速度 "+location.getAccuracy());
}
}
});
如果我想主動(dòng)調(diào)用這個(gè)函數(shù) 必須要得到這個(gè)LocationMangerService 的對(duì)象 獲取這個(gè)對(duì)象可以通過hook LocationManager 的構(gòu)造函數(shù)獲取,
XposedBridge.hookAllConstructors(LocationManager.class,new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
if (param.args.length==2) {
Context context = (Context) param.args[0]; //這里的 context
XposedBridge.log(" 對(duì) "+getProgramNameByPackageName(context)+" 模擬位置");
//把權(quán)限的檢查 hook掉
XposedHelpers.findAndHookMethod(context.getClass(), "checkCallingOrSelfPermission", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
if (param.args[0].toString().contains("INSTALL_LOCATION_PROVIDER")){
param.setResult(PackageManager.PERMISSION_GRANTED);
}
}
});
XposedBridge.log("LocationManager : " + context.getPackageName() + " class:= " + param.args[1].getClass().toString());
//獲取到 locationManagerService 主動(dòng)調(diào)用 對(duì)象的 reportLocation 方法 可以去模擬提供位置信息
//這里代碼中并沒有涉及到主動(dòng)調(diào)用
Object locationManagerService = param.args[1];
}
}
});


當(dāng)然還需要hook一些其他的輔助函數(shù) ,這些函數(shù)都可以在 Android studio 中看到Java的代碼 我們就無需過多解釋了 上 源代碼
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android性能優(yōu)化之弱網(wǎng)優(yōu)化詳解
這篇文章主要為大家介紹了Android性能優(yōu)化之弱網(wǎng)優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Flutter?Widget?之FocusableActionDetector使用詳解
這篇文章主要為大家介紹了Flutter?Widget?之FocusableActionDetector使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android開發(fā)實(shí)現(xiàn)多進(jìn)程彈窗效果
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)實(shí)現(xiàn)多進(jìn)程彈窗效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Android頂部狀態(tài)欄透明化并釋放空間的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了Android頂部狀態(tài)欄透明化并釋放空間的兩種實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
android高仿小米時(shí)鐘(使用Camera和Matrix實(shí)現(xiàn)3D效果)
這篇文章主要介紹了android高仿小米時(shí)鐘(使用Camera和Matrix實(shí)現(xiàn)3D效果),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01
AlertDialog點(diǎn)擊按鈕不消失的實(shí)現(xiàn)方法
我有一個(gè)文本輸入對(duì)話框,當(dāng)我點(diǎn)擊對(duì)話框上的“是”按鈕,它會(huì)驗(yàn)證輸入,然后關(guān)閉對(duì)話框,但是,如果輸入錯(cuò)誤,我想停留在同一個(gè)對(duì)話框中。怎么實(shí)現(xiàn)此功能呢?下面通過本文給大家分享下2017-01-01
Android實(shí)現(xiàn)一個(gè)絲滑的自動(dòng)輪播控件實(shí)例代碼
輪播圖對(duì)大家來說應(yīng)該再熟悉不過了,下面這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)一個(gè)絲滑的自動(dòng)輪播控件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Android 通過自定義view實(shí)現(xiàn)水波紋效果案例詳解
這篇文章主要介紹了Android 通過自定義view實(shí)現(xiàn)水波紋效果案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

