接觸逆向工程也有一點時間了,從最初研究我水哥的小黃書(iOS應用逆向工程),到後來本身摩拳擦掌準備實練,忽然發現本身沒有一款越獄手機,以致於不少iOS工具都沒法使用。這就很糾結。忽然發現網易的大佬 慶哥把iOSOpenDev(13年已停更)修改升級除了 MonkeyDev ,這個東西有多好用。簡單來講,他就已經注入dylib,集成Reveal、Cycript等等,不須要本身搞去配置。git
一切的一切,只須要本身配置好最新的 theos 環境。github
1 sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
api
安裝ldid(如安裝theos過程安裝了ldid,跳過)xcode
2 brew install ldid
而後安裝 MonkeyDevapp
你能夠經過如下命令選擇指定的Xcode進行安裝:(3.1和3.2選一個執行)框架
默認安裝的Xcode爲:3.1 sudo xcode-select -s /Applications/Xcode-beta.app
3.2 xcode-select -p
執行安裝命令:工具
CoreLocation 框架,那麼咱們就hook它!
首先是使用 CaptainHook 這個慶哥也集成好了,我們直接拿來用
4 git clone https://github.com/AloneMonkey/MonkeyDev.git 5 cd MonkeyDev/bin 6 sudo ./md-install
具體使用請參考https://github.com/AloneMonkey/MonkeyDev/wiki/開始使用 慶哥在github 寫的很詳細了。
本文主要是分享我是如何從無從下手 到 成功 hook 釘釘的打卡機制的思想過程。
從PP助手上下載了個釘釘,直接扔到 MonkeyDev 裏面,調好設置,準備調試!結果他還檢測出我不是正版應用,因而我老老實實的去plist 文件吧bundle ID 複製了出來,而後粘在了Organization Identifiler 上。在跑,果真沒事了。
那麼說到定位,我就想到
CHDeclareClass(CLLocation); CHOptimizedMethod0(self, CLLocationCoordinate2D, CLLocation, coordinate){ return CLLocationCoordinate2DMake(39.960742, 116.569844); } CHConstructor{ CHLoadLateClass(CLLocation); CHClassHook(0, CLLocation, coordinate); }
真機一跑,GG!想一想也是,要是這麼簡單就hook 了,企業專家也不是很沒面子,class dump 出全部頭文件,看看都有什麼吧。

因而進行谷歌搜索,高德地圖禁止虛擬定位,看了幾個博客,就找到 有這樣一個方法,- (BOOL) detectRiskOfFakeLocation 返回YES,就檢測虛擬定位,NO就不檢測;
OK ,那hook 它!先查找都那幾個類用它了,
搜索出來,一共就三個類, 好辦,搞它!
CHDeclareClass(AMapGeoFenceManager); CHMethod(0, BOOL,AMapGeoFenceManager,detectRiskOfFakeLocation){ return NO; } CHConstructor{ CHLoadLateClass(AMapGeoFenceManager); CHClassHook(0, AMapGeoFenceManager,detectRiskOfFakeLocation); } CHDeclareClass(AMapLocationManager); CHMethod(0, BOOL,AMapLocationManager,detectRiskOfFakeLocation){ return NO; } CHConstructor{ CHLoadLateClass(AMapLocationManager); CHClassHook(0, AMapLocationManager,detectRiskOfFakeLocation); } CHDeclareClass(DTALocationManager); CHMethod(0, BOOL,DTALocationManager,detectRiskOfFakeLocation){ return NO; } CHConstructor{ CHLoadLateClass(DTALocationManager); CHClassHook(0, DTALocationManager,detectRiskOfFakeLocation); }
真機跑起來,哈哈,此次你還不出來! 結果照樣GG !這麼辦,那咱們去高德地圖的api 搜索看看 這個方法,是否是方法有什麼須要我們注意東西。因而我搜索了spa
detectRiskOfFakeLocation 這個方法。

搜索出來 還真有! 一共六個,兩個 高德檢測,兩個釘釘檢測,無論全hook了!調試
CHDeclareClass(AMapGeoFenceManager); CHMethod(0, BOOL,AMapGeoFenceManager,detectRiskOfFakeLocation){ return NO; } CHMethod(0, BOOL,AMapGeoFenceManager,pausesLocationUpdatesAutomatically){ return NO; } CHConstructor{ CHLoadLateClass(AMapGeoFenceManager); CHClassHook(0, AMapGeoFenceManager,detectRiskOfFakeLocation); CHClassHook(0, AMapGeoFenceManager,pausesLocationUpdatesAutomatically); } CHDeclareClass(AMapLocationManager); CHMethod(0, BOOL,AMapLocationManager,detectRiskOfFakeLocation){ return NO; } CHMethod(0, BOOL,AMapLocationManager,pausesLocationUpdatesAutomatically){ return NO; } CHConstructor{ CHLoadLateClass(AMapLocationManager); CHClassHook(0, AMapLocationManager,detectRiskOfFakeLocation); CHClassHook(0, AMapLocationManager,pausesLocationUpdatesAutomatically); } CHDeclareClass(DTALocationManager); CHMethod(0, BOOL,DTALocationManager,detectRiskOfFakeLocation){ return NO; } CHMethod(0, BOOL,DTALocationManager,dt_pausesLocationUpdatesAutomatically){ return NO; } CHConstructor{ CHLoadLateClass(DTALocationManager); CHClassHook(0, DTALocationManager,detectRiskOfFakeLocation); CHClassHook(0, DTALocationManager,dt_pausesLocationUpdatesAutomatically); }
真機一跑,成了!能夠打卡了!code
哈哈哈 ,以上是我心路歷程!我也已經集成了一個pod 在 https://github.com/AloneMonkey/MonkeyDevSpecs ,你能夠直接在 MonkeyDev 經過cocopods 集成它。連接裏還有許多好玩的,做爲彩蛋送給你們。溜了,溜了。