/var/mobile/Library/SMS 中sms.db存放了短信數(shù)據(jù) 未加密 可解讀
通訊錄存放位置不正確
為/var/mobile/Library/CallHistoryDB
8.4中 ?無Safari/Histroy.plist
http://www.cnblogs.com/OtionSky/archive/2011/11/10/iPhone_TelephoneCenter.html這篇博客詳細講述了IOS5追迟、6上怎么樣短信電話攔截
先感謝snankky的開源精神 分享了SMSNinja這個著名開源插件的源碼?SMSNinja-master.zip
這個源碼對于后續(xù)的關(guān)于短信來電的研發(fā)提供非常寶貴的材料
主要實現(xiàn)了 短信的監(jiān)聽 iMessage的監(jiān)聽 下面主要介紹實現(xiàn)過程以及踩過的坑
實現(xiàn)代碼如下:
%group?SNIncomingMessageHook_5_6_7_8
%hook?IMDServiceSession
-?(void)didReceiveMessage:(id)message?forChat:(NSString?*)arg2?style:(unsigned?char)arg3?//?incoming?iMessage_5/message_6_7_8
{
%orig;
NSLog(@"message?coming:");
message?=?(IMMessageItem?*)message;
NSString?*text?=?[[message?body]?string];
NSLog(@"%@",text);
}
%end
%end
%hook?IMDaemon
-?(void)_loadServices
{
%orig;
NSLog(@"zenmeyang:ffff");
%init(SNIncomingMessageHook_5_6_7_8);
}
%end
%ctor
{
%init
}
這里面關(guān)于logos的語法問題就不介紹了 總之也很頭痛
對于IOS5侮繁,IOS6來說 添加CTTelephonyCenterAddObserver 的監(jiān)控 是有效監(jiān)聽短信來電的有效方法 上面的那個博客說的很詳細了
但是在IOS7,IOS8之后 蘋果改變了這種機制
這兩種系統(tǒng)中 IOS后臺維護了一個后臺進程 這個后臺進程是:com.apple.imagent
這個不用白費心機的打印出來
打印結(jié)果如圖
根本沒有這個進程
原來蘋果在編譯階段 并未加載這個進程 這個進程是在蘋果實際運行的時候加載進去的 這樣打印當然看不到
就是這個進程 主宰著IOS中SMS和iMessage的短信收發(fā)崖疤,這個進程從系統(tǒng)啟動到結(jié)束 一直存在后臺運行并始終有權(quán)限
所以很簡單移层,無論你怎么對可疑函數(shù)進行hook聂抢,根本就沒有用 因為這個函數(shù)是在 這個后臺進程 稱之為imagent進程 中加載的 你無法獲取到這個imagent 就無法hook這個進程
在IOS7中 這個進程啟動函數(shù)是:IMDamenCore這個私有框架里?IMDService類的-?(void)loadServiceBundle 函數(shù) 即 只有在這個函數(shù)里加載可疑函數(shù)才有用 目標函數(shù)是:_processReceivedMessage
在IOS8中 這個進程的啟動函數(shù)是:IMDaemon 這個我根本查不到它是哪個框架哪個類里的_loadServices是進程加載函數(shù) 目標函數(shù)是:-?(void)didReceiveMessage:(id)message?forChat:(NSString?*)arg2?style:(unsigned?char)arg3 只有在這個函數(shù)里面加載才有用
接下來的才是大坑蒂窒,因為imagent這個進程僅僅在系統(tǒng)啟動的時候才啟動一次 所以每次更新完tweak后 必須要重新啟動一次imagent這個進程 否則tweak根本不會生效 可以通過reboot來重啟imagent進程
這里聲明一下 重啟reboot和重啟spring board是兩個事件 重啟reboot則重啟所有的service膀估,而重啟spring board則僅僅重啟自己
相信也一定有辦法重啟imagent進程 而不用每次都重啟reboot
結(jié)果如圖
大功告成
theos中有個很大的bug 即是只要tweak中 不存在logos的基本的語法錯誤 不存在未知類的鏈接錯誤 就不會報錯 就是說 假設(shè)我在tweak里面hook一個根本沒有的類 根本沒有的函數(shù) theos也不會報錯
諸如上述 在IOS9.3中?IMDaemonCore框架雖然有 但是屬于私有框架 如果不對其進行添加幔亥,那么?didReceiveMessage 這個函數(shù)根本就不會被hook,因為這個函數(shù)這個類 根本就不能被識別
現(xiàn)在在IOS9.3中 添加PRIVATE_FRAMEWORKS 發(fā)現(xiàn) IOS9.3的framework文件路徑有誤
經(jīng)查閱發(fā)現(xiàn) 這個沒有辦法theos目前的私有框架引用 就是不支持IOS9.3
所以要把xcode降級到9.2
theos無法debug開發(fā) 是它最大的弊端察纯,只好在里面不停的輸出log了
比如
這里的abcd類里的 woke函數(shù)根本不存在
編譯器也不報錯
也許 這就是短信hook為什么不通的原因
但是 我可以很明確的缺點 在添加了?IMDaemonCore之后 確實存在著IMDServiceSession這個類 也確實存在這個函數(shù) 為什么SMSNijina能拿到log帕棉,能到這個函數(shù) 我卻不能····
后來發(fā)現(xiàn)不少這個原因····
此為上述監(jiān)聽短信行為demo的編譯文件
可以看到降級到9.2之后 可以成功添加私有框架
最后貼出監(jiān)聽發(fā)短信和打電話的行為代碼
%hook UIApplication
-(BOOL)openURL:(id)arg1
{
%log;
BOOL returnValue = %orig;
NSString*actionName = @"";
NSString *actualString = [arg1 absoluteString];
if ([actualString hasPrefix:@"sms"]) actionName = @"發(fā)短信";
else if ([actualString hasPrefix:@"tel"]) actionName = @"打電話";
else actionName = @"木知";
NSProcessInfo *info = [NSProcessInfo processInfo];
NSLog(@"I konw what you are doing:\n行為:%@\n參數(shù):%@\n進程名:%@\n進程編號:%d\napp bundle id:%@\n當前線程:%@\n當前時間:%@",actionName,arg1,info.processName,info.processIdentifier,[[NSBundle mainBundle]bundleIdentifier],[NSThread currentThread],[NSDate date]);
return returnValue;
}
%end