何為逆向工程?
逆向工程,指的是通過分析一個程序或系統的功能、結構或行為,將它的技術實現或設計細節推導出來的過程。當我們對一個軟件的功能很感興趣,卻又拿不到它的源代碼時,往往可以通過逆向工程的方式對它進行分析。
推薦的書籍:
iOS逆向交流論壇:http://iosre.com/
開始嘗試簡單的微信搶紅包
應用脫殼:
準備工作
- 一臺已越獄的iPhone5s以上機器(已安裝OpenSSH和Cycript,砸殼用)
- 砸殼工具dumpdecrypted.dylib
- PP助手(建議安裝,非常方便)
接下來就是需要找到微信的Bundle路徑了,可以把iPhone上的所有App都關掉,唯獨保留微信,然后輸入命令 ps -e
這樣我們就找到了微信的可執行文件Wechat的具體路徑了。接下來我們需要用Cycript找出微信的Documents的路徑,輸入命令cycript -p WeChat
拷貝dumpdecrypted.dylib到iPhone上,這里我們用到scp命令.
scp 源文件路徑 目標文件路徑 。具體如下(也可以使用PP助手):
開始砸殼
dumpdecrypted.dylib的具體用法是:DYLD_INSERT_LIBRARIES=/PathFrom/dumpdecrypted.dylib /PathTo
當前目錄下會生成砸殼后的文件,即WeChat.decrypted。同樣用scp命令把WeChat.decrypted文件拷貝到電腦上,接下來我們要正式的dump微信的可執行文件了。(這邊原文寫的不完善,不過后來用PP助手文件管理器直接就導出來了,非常方便)
電腦端可以通過otool命令再次驗證是否砸殼成功:
> otool -l WeChat.app/WeChat | grep -B 2 crypt
cmd LC_ENCRYPTION_INFO
cmdsize 20
cryptoff 16384
cryptsize 40534016
cryptid 0
--
cmd LC_ENCRYPTION_INFO_64
cmdsize 24
cryptoff 16384
cryptsize 43663360
cryptid 0
otool可以輸出app的load commands,然后通過查看cryptid這個標志位來判斷app是否被加密。1代表加密了,0代表被解密了
編寫Hook代碼:
新建一個dylib工程,因為Xcode默認不支持生成dylib,所以我們需要下載iOSOpenDev,安裝完成后(Xcode7環境會提示安裝iOSOpenDev失敗,請參考iOSOpenDev安裝問題),重新打開Xcode,在新建項目的選項中即可看到iOSOpenDev選項了。
編寫代碼(就貼出了部分代碼):
//紅包參數
NSMutableDictionary *params = [@{} mutableCopy];
[params setObject:parameters[@"msgtype"]?:@"null" forKey:@"msgType"];
[params setObject:parameters[@"sendid"]?:@"null" forKey:@"sendId"];
[params setObject:parameters[@"channelid"]?:@"null" forKey:@"channelId"];
id getContactDisplayName = objc_msgSend(selfContact, @selector(getContactDisplayName));
id m_nsHeadImgUrl = objc_msgSend(selfContact, @selector(m_nsHeadImgUrl));
[params setObject:getContactDisplayName forKey:@"nickName"];
[params setObject:m_nsHeadImgUrl forKey:@"headImg"];
[params setObject:[NSString stringWithFormat:@"%@", nativeUrl]?:@"null" forKey:@"nativeUrl"];
[params setObject:m_nsFromUsr?:@"null" forKey:@"sessionUserName"];
if (kCloseRedEnvPlugin != HBPluginType) {
//自動搶紅包
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:[docDir stringByAppendingPathComponent:HBPluginDelaySettingFile]];
if (dict){
HBPluginDelay = ((NSNumber *)dict[HBPluginDelayKey]).floatValue;
}
if (HBPluginDelay<0) {
HBPluginDelay=0;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(HBPluginDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
((void (*)(id, SEL, NSMutableDictionary*))objc_msgSend)(logicMgr, @selector(OpenRedEnvelopesRequest:), params);
});
編寫完代碼,直接XCODE運行跑一遍,就可以生成你自己的dylib了。接下來要做的就是讓微信來執行你的dylib。
重新打包微信App
準備工具:
- dylib注入神器:yololib
- 自動注入打包神器:iInjection.app
- 證書!沒有證書什么都白搭。
有了以上3個,那就可以快速進行重新打包了。~!
Warning:打包之前記得刪除微信APP包里的Watch文件夾以及Plugins文件夾里的東西~!
如圖,這個工具支持的功能很全面。
Tips:如果需要定制個性版的微信(自定義微信圖標,自定義微信APP顯示名字,比如圖標改成網易新聞的圖標,名字改成網易新聞~你想用這個微信來干啥都不會有人懷疑啊)??梢栽诖虬麬PP之前找兩張120120 180180的png格式圖片
名字改為AppIcon60x60@2x.png和AppIcon60x60@3x.png替換原app文件夾里的圖片即可~改名則是通過上面的APP打包神器更改顯示名字即可。
打包出來的ipa文件直接拖入PP助手就能快速安裝了~
參考鏈接:
一步一步實現iOS微信自動搶紅包(非越獄)
非越獄環境下從應用重簽名到微信上加載Cycript
iOS 破殼 反編譯 黑客技術大揭秘
工具下載:
進階之路
這邊就簡單介紹幾個工具。。
一款可以查看你是否注入成功的工具
這個厲害了。反編譯APP,能顯示匯編代碼(無奈看不懂。),但是看不懂也沒關系。。他能生成相應的偽代碼。
越獄手機 上可以查看 任何APP的UI結構。
class-dump:
可導出APP的所有.h文件。
總結
網上現在教程也挺多,也能搜到很多前人先好的hook代碼,如果真要自己去想實現一個功能從頭到尾自己做還是非常難的!而且最近微信對于搶紅包,多開微信的查處力度也在不斷加強,微信那邊簡簡單單加一句檢測代碼,逆向就可能要分析好久才能找到對應方法。(如果能拿到微信源代碼那該多爽啊!)。
總之逆向非常坎坷,中途總會遇到莫名其妙的錯誤,只能不斷的嘗試當然最后成功的喜悅也是不言而喻的!希望大家都可以嘗試嘗試~