接觸逆向工程也有一點時間了,從最初研究我水哥的小黃書(iOS應用逆向工程),到后來自己摩拳擦掌准備實練,突然發現自己沒有一款越獄手機,以至於很多iOS工具都無法使用。這就很糾結。突然發現網易的大佬 慶哥把iOSOpenDev(13年已停更)修改升級除了 MonkeyDev ,這個東西有多好用。簡單來說,他就已經注入dylib,集成Reveal、Cycript等等,不需要自己搞去配置。
一切的一切,只需要自己配置好最新的 theos 環境。
1 sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
安裝ldid(如安裝theos過程安裝了ldid,跳過)
2 brew install ldid
然后安裝 MonkeyDev
你可以通過以下命令選擇指定的Xcode進行安裝:(3.1和3.2選一個執行)
3.1 sudo xcode-select -s /Applications/Xcode-beta.app
默認安裝的Xcode為:
3.2 xcode-select -p
執行安裝命令:
4 git clone https://github.com/AloneMonkey/MonkeyDev.git 5 cd MonkeyDev/bin 6 sudo ./md-install
具體使用請參考
https://github.com/AloneMonkey/MonkeyDev/wiki/開始使用 慶哥在github 寫的很詳細了。
CoreLocation 框架,那么我們就hook它!
本文主要是分享我是如何從無從下手 到 成功 hook 釘釘的打卡機制的思想過程。
從PP助手上下載了個釘釘,直接扔到 MonkeyDev 里面,調好設置,准備調試!結果他還檢測出我不是正版應用,於是我老老實實的去plist 文件吧bundle ID 復制了出來,然后粘在了Organization Identifiler 上。在跑,果然沒事了。
那么說到定位,我就想到
首先是使用 CaptainHook 這個慶哥也集成好了,咱們直接拿來用
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 搜索看看 這個方法,是不是方法有什么需要咱們注意東西。於是我搜索了
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); }
真機一跑,成了!可以打卡了!
哈哈哈 ,以上是我心路歷程!我也已經集成了一個pod 在 https://github.com/AloneMonkey/MonkeyDevSpecs ,你可以直接在 MonkeyDev 通過cocopods 集成它。鏈接里還有許多好玩的,作為彩蛋送給大家。溜了,溜了。