公司要求使用釘釘定位打卡,可是由于經(jīng)常晚上加到很晚后,匆忙回家,忘記打卡,因此想著能不能修改一下定位呢,這樣哪怕忘了,到家躺在床上也能打卡,畢竟咱們程序員都很辛苦,不能再因為打卡添加煩惱了。下面直接進入正題。
需要提前配置:
安裝MonkeyDev
安裝class-dump
幾張圖片展示:



步驟一:
之前經(jīng)常逛iOSRE,參考這篇文章 iOS 逆向?qū)崙?zhàn) - 釘釘簽到遠程“打卡”,便著手動工了。為了省去砸殼等一系列步驟,直接在PP助手越獄商店下載應(yīng)用,Cydia中安裝Reveal2Loader,看了下UI,打卡那塊是webView,直接class-dump出頭文件,不管用的是什么地圖,最終也會調(diào)用系統(tǒng)的地方方法,所以直接找下面這個方法:
locationManager:didUpdateLocations:
搜索didUpdateLocations,可以看到我們的搜索范圍很小了

使用Hopper Disassembler搜索得到的結(jié)果也是一致,且可以看到更多細節(jié),方便我們進一步縮小范圍

簡單分析一下,我們要找的方法是locationManager:didUpdateLocations:,排除LAPLocationInfo和DTLocationJSAPIHandler,定位頁面沒有地圖,排除MAMapView,LocData看一下里面內(nèi)容應(yīng)該只是保存和提供數(shù)據(jù)的也可以排除。剩下的5個AMapLocationCLMDelegate,AMapLocationManager,DTCLocationManager,LALocationManager,VILocationManager,分別hook嘗試一下,發(fā)現(xiàn)修改AMapLocationCLMDelegate,AMapLocationManager中的定位信息可以生效。
CHDeclareClass(AMapLocationCLMDelegate)
CHOptimizedMethod2(self, void, AMapLocationCLMDelegate, locationManager, id, arg1, didUpdateLocations, id, arg2) {
CHSuper2(AMapLocationCLMDelegate, locationManager, arg1, didUpdateLocations, @[location]);
}
CHConstructor {
CHLoadLateClass(AMapLocationCLMDelegate);
CHHook2(AMapLocationCLMDelegate, locationManager, didUpdateLocations);
}
步驟二:
找到可以生效的地方,接下來就是加個地圖進去,方便點選位置進行打卡。在Monkeydev中使用pod,參考MonkeyDevSpecs,本項目中只使用了MDSettingCenter(慶神寫的方便調(diào)試和動態(tài)配置),AMap3DMap(高德地圖),SCLAlertView-Objective-C(帶動效的alertView),注意,pod要寫在Dylib中。
# Uncomment the next line to define a global platform for your project
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/AloneMonkey/MonkeyDevSpecs.git' #不可少
use_frameworks! #不可少
platform :ios, '8.0'
target 'DingTalkLocation' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for DingTalkLocation
end
target 'DingTalkLocationDylib' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for DingTalkLocationDylib
pod 'MDSettingCenter' #設(shè)置中心
pod 'AMap3DMap' #3D地圖SDK
pod 'SCLAlertView-Objective-C' #好看的AlertView
end
偷了個懶,懸浮球直接在接收到UIApplicationDidFinishLaunchingNotification后添加到keyWindow上了,這樣第一次打開登錄后就看不到了,可以選擇hook一下首頁的viewDidLoad方法。后面也沒啥好說的了,地圖就按照高德地圖官方操作就好了,有一點需要注意,我們拿到的經(jīng)緯度直接賦值會產(chǎn)生偏移,這點挺讓人糾結(jié)的,我們項目和釘釘同樣是高德地圖,應(yīng)該不存在偏移問題,后來根據(jù)偏移大致推算了一下,釘釘在獲取到位置經(jīng)緯度之后,會調(diào)用坐標(biāo)轉(zhuǎn)換,所以咱們傳入經(jīng)緯度之后,被轉(zhuǎn)換了,自然就偏移了。坐標(biāo)轉(zhuǎn)換代碼如下:
CLLocationCoordinate2D amapcoord = AMapCoordinateConvert(CLLocationCoordinate2DMake(39.989612,116.480972), AMapCoordinateTypeGPS);
也沒啥關(guān)系,坐標(biāo)是朝右上角偏移的,所以定位的時候往左下角選一點就可以了。
最后放出源碼,直接將ipa導(dǎo)入就可以使用了。(BundleID修改成:com.laiwang.DingTalk,對應(yīng)的版本號最好也要修改一下,否則釘釘會彈出警告。)
釘釘定位修改