日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS逆向工程整理 HOOK微信抢红包

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS逆向工程整理 HOOK微信抢红包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原理

Objective-C 是一門動態語言,我們可以利用OC的Runtime動態的替換App原有的函數,來達到我們(不可告人)的目的。OC 中對某個對象的方法的調用并不像 C++ 一樣直接取得方法的實現的偏移值來調用,所以 C++ 方法與實現的關系在編譯時就可確定。而 OC 中方法和實現的關系是在運行時決定的。在調用某個對象的方法時,實際上是調用了 obj_msgsend 向對象發送一個名稱為方法名的消息,而我們可以替換這個響應這個消息的實現內容。OC 中比較有力的動態特性 Method Swizzing 就是建立在這個基礎之上。
簡單來說就是以下三句代碼:

Method originalMethod = class_getInstanceMethod(theClass, originalSelector);Method newMethod = class_getInstanceMethod(theClass, newSelector);method_exchangeImplementations(originalMethod, newMethod);
  • 1
  • 2
  • 3

這樣一來,原來調用originalSelector函數,都會指向我們的newSelector函數,以此實現HOOK。

工欲善其事,必先利其器

要進行iOS的HOOK開發,首先要準備一臺Mac電腦(廢話),一臺越獄的iphone或者ipad。針對這類的需求,大神們開發了很多NB的工具,專門幫我們更好的去HOOK,我們都是站在大神的肩膀上。?
先介紹以下越獄開發常見的工具OpenSSH,Dumpdecrypted,class-dump、Theos、Reveal、IDA,Hopper

OpenSSH

這個工具是通過命令行工具訪問蘋果手機,執行命令行腳本。在Cydia中搜索openssh,安裝。具體用法如下:?
1、打開mac下的terminal,輸入命令ssh root@192.168.2.2(越獄設備ip地址)?
2、接下來會提示輸入超級管理員賬號密碼,默認是alpine?
3、回車確認,即可root登錄設備?
你也可以將你mac的公鑰導入設備的/var/root/.ssh/authorized_keys文件,這樣就可以免密登錄root了。

Cycript

Cycript是大神saurik開發的一個非常強大的工具,可以讓開發者在命令行下和應用交互,在運行時查看和修改應用。它可以幫助你HOOK一個App。Cycript最為貼心和實用的功能是它可以幫助我們輕松測試函數效果,整個過程安全無副作用,效果十分顯著,實乃業界良心!?
安裝方式:在Cydia中搜索Cycript安裝?
使用方法:?
1、root登錄越獄設備?
2、cycript-p 你想要測試的進程名?
3、隨便玩,完全兼容OC語法比如cy# [#0x235b4fb1 hidden]?
Cycript有幾條非常有用的命令:?
choose:如果知道一個類對象存在于當前的進程中,卻不知道它的地址,不能通過“#”操作符來獲取它,此時可以使用choose命令獲取到該類的所有對象的內存地址?
打印一個對象的所有屬性 [obj _ivarDescription].toString()?
打印一個對象的所有方法[obj _methodDescription].toString()?
動態添加屬性 objc_setAssociatedObject(obj,@”isAdd”, [NSNumbernumberWithBool:YES], 0);?
獲取動態添加的屬性 objc_getAssociatedObject(self, @”isAdd”)

Reveal

Reveal是由ITTY BITTY出品的UI分析工具,可以直觀地查看App的UI布局,我們可以用來研究別人的App界面是怎么做的,有哪些元素。更重要的是,可以直接找到你要HOOK的那個ViewController,賊方便不用瞎貓抓耗子一樣到處去找是哪個ViewController了。?
安裝方法:?
1、下載安裝Mac版的Reveal?
2、iOS安裝Reveal Loader,在Cydia中搜索并安裝Reveal Loader?
在安裝Reveal Loader的時候,它會自動從Reveal的官網下載一個必須的文件libReveal.dylib。如果網絡狀況不太好,不一定能夠成功下載這個dylib文件,所以在下載完Reveal Loader后,檢查iOS上的“/Library/RHRevealLoader/”目錄下有沒有一個名為“libReveal.dylib”的文件。如果沒有就打開mac Reveal,在它標題欄的“Help”選項下,選中其中的“Show Reveal Library in Finder”,找到libReveal.dylib文件,使用scp拷貝到 iOS的/Library/RHRevealLoader/目錄下。至此Reveal安裝完畢!

Dumpdecrypted

Dumpdecrypted就是著名的砸殼工具,所謂砸殼,就是對 ipa 文件進行解密。因為在上傳到 AppStore 之后,AppStore自動給所有的 ipa 進行了加密處理。而對于加密后的文件,直接使用 class-dump 是得不到什么東西的,或者是空文件,或者是一堆加密后的方法/類名。?
使用步驟如下:?
1、設備中打開需要砸殼的APP。?
2、SSH連接到手機,找到ipa包的位置并記錄下來。?
3、Cycript到該ipa的進程,找到App的Documents文件夾位置并記錄下來。?
4、拷貝dumpdecrypted.dylib到App的Documents 的目錄。?
5、執行砸殼后,并拷貝出砸殼后的二進制文件。?
具體執行命令:?
1、ssh root@192.168.2.2 (iP地址為越獄設備的iP地址)?
2、 ps -e (查看進程,把進程對應的二進制文件地址記下來)?
3、cycript -p 進程名?
4、 [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory?
inDomains:NSUserDomainMask][0] (找到程序的documents目錄)?
5、scp ~/dumpdecrypted.dylib root@192.168.2.2:/var/mobile/Containers/Data/Application/XXXXXX/Documents?
6、DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/?
Application/XXXXXX/xxx.app/xxx?
然后就會生成.decrypted的文件,這個就是砸殼后的文件。接下來各種工具都隨便上了class-dump、IDA、Hopper Disassembler

class-dump

class-dump就是用來dump二進制運行文件里面的class信息的工具。它利用Objective-C語言的runtime特性,將存儲在Mach-O文件中的頭文件信息提取出來,并生成對應的.h文件,這個工具非常有用,有了這個工具我們就像四維世界里面看三維物體,一切架構盡收眼底。?
class-dump用法:?
class-dump –arch armv7 -s -S -H 二進制文件路徑 -o 頭文件保存路徑

IDA

IDA是大名鼎鼎的反編譯工具,它乃逆向工程中最負盛名的神器之一。支持Windows、Linux和Mac OS X的多平臺反匯編器/調試器,它的功能非常強大。class-dump可以幫我們羅列出要分析的頭文件,IDA能夠深入各個函數的具體實現,無論的C,C++,OC的函數都可以反編譯出來。不過反編譯出來的是匯編代碼,你需要有一定的匯編基礎才能讀的懂。?
IDA很吃機器性能(我的機器經常卡住不動),還有另外一個反編譯工具Hopper,對機器性能要求沒那么高,也很好用,殺人越貨的利器。

LLDB

LLDB是由蘋果出品,內置于Xcode中的動態調試工具,可以調試C、C++、Objective-C,還全盤支持OSX、iOS,以及iOS模擬器。LLDB要配合debugserver來使用。常見的LLDB命令有:?
p命令:首先p是打印非對象的值。如果使用它打印對象的話,那么它會打印出對象的地址,如果打印非對象它一般會打印出基本變量類型的值。當然用它也可以申明一個變量譬如 p int a=10;(注lldb使用a = 10; (注lldb使用在變量前來聲明為lldb內的命名空間的)?
po 命令:po 命令是我們最常用的命令因為在ios開發中,我們時刻面臨著對象,所以我們在絕大部分時候都會使用po。首先po這個命令會打印出對象的description描述。?
bt [all] 打印調用堆棧,是thread backtrace的簡寫,加all可打印所有thread的堆棧。?
br l 是breakpoint list的簡寫,列出所有的斷點?
image list -o -f 列出模塊和ASLR偏移,以及偏移后的地址,可以通過偏移后的地址-ASLR偏移來得出模塊的基地址。?
b NSLog給函數設置斷點?
br s -a IDA中偏移前的地址+ASLR偏移量 給內存地址設置斷點?
p (char *)$r1打印函數名稱?
br dis、br en和br del表示禁用、啟用和刪除斷點?
nexti(ni)跳過一行?
stepi(si)跳入函數?
c繼續執行直到斷點?
register write r0 1修改寄存器的值

usbmuxd

很多人都是通過WiFi連接使用SSH服務的,因為無線網絡的不穩定性及傳輸速度的限制,在復制文件或用LLDB遠程調試時,iOS的響應很慢,效率不高。iOS越獄社區的知名人士Nikias Bassen開發了一款可以把本地OSX/Windows端口轉發到遠程iOS端口的工具usbmuxd,使我們能夠通過USB連接線ssh到iOS中,大大增加了ssh連接的速度,也方便了那些沒有WiFi的朋友。使用usbmuxd能極大提升ssh的速度,用LLDB遠程連接debugserver的時間被縮短至15秒以內,強烈建議大家把usbmuxd作為ssh連接的首選方案

Theos

以上都是App的分析工具,而Theos是一個越獄開發工具包(具體寫代碼),由iOS越獄界知名人士Dustin Howett開發并分享到GitHub上。Theos與其他越獄開發工具相比,最大的特點就是簡單:下載安裝簡單、Logos語法簡單、編譯發布簡單,可以讓使用者把精力都放在開發工作上去。就是讓你省去了繁瑣的原始代碼編寫,簡化了編譯和安裝過程。同樣有一款工具iOSOpenDev是整合在Xcode里的,可以直接在Xcode中配置開發、運行越獄程序,不過iOSOpenDev的安裝,過程真的是讓人要吐血(我有一臺mac死活都裝不上)。?
用法,theos有多種模板可以選擇,最常用的就是tweak插件了:/opt/theos/bin/nic.pl

NIC 2.0 - New Instance Creator

[1.] iphone/application?
[2.] iphone/library?
[3.] iphone/preference_bundle?
[4.] iphone/tool?
[5.] iphone/tweak?
打包編譯安裝,需要按照固定格式編寫Makefile文件,然后執行命令?
make package install,自動編譯打包安裝到iOS設備。?

如果你用的是IOSOpenDev就更簡單了,配置好iOS設備ip地址,直接執行product->Bulid for->profiling,自動打包安裝好。

原理上篇已經說過了,利用iOS的runtime特效,替換方法的實現來達到HOOK的目的。本篇是一個實戰教程,講解怎么來Hook微信的自動搶紅包。

第1步:砸殼

首先ssh連上越獄iOS設備,執行ps -e查找微信的app地址

這里的app路徑是/var/mobile/Containers/Bundle/Application/690828B8-B63F-4FAC-B7CC-DEFD8E23AF46/WeChat.app/WeChat,記下來先。
然后進入Cycript,查找出微信的Documents目錄

把這個路徑記下來/var/mobile/Containers/Data/Application/2B65DCC1-9FAD-41C8-A5EC-C3D9326EE3D6/Documents/
然后退出cycript,cd到documents目錄下,執行以下命令:

adminde-iPhone:~ root# adminde-iPhone:/var/mobile/Containers/Data/Application/2B65DCC1-9FAD-41C8-A5EC-C3D9326EE3D6/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/690828B8-B63F-4FAC-B7CC-DEFD8E23AF46/WeChat.app/WeChatmach-o decryption dumperDISCLAIMER: This tool is only meant for security research purposes, not for application crackers.[+] detected 32bit ARM binary in memory. [+] offset to cryptid found: @0xd7a4c(from 0xd7000) = a4c [+] Found encrypted data at address 00004000 of length 49463296 bytes - type 1. [+] Opening /private/var/mobile/Containers/Bundle/Application/690828B8-B63F-4FAC-B7CC-DEFD8E23AF46/WeChat.app/WeChat for reading. [+] Reading header [+] Detecting header type [+] Executable is a FAT image - searching for right architecture [+] Correct arch is at offset 16384 in the file [+] Opening WeChat.decrypted for writing. [+] Copying the not encrypted start of the file [+] Dumping the decrypted data into the file [+] Copying the not encrypted remainder of the file [+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a4c [+] Closing original file [+] Closing dump file adminde-iPhone:/var/mobile/Containers/Data/Application/2B65DCC1-9FAD-41C8-A5EC-C3D9326EE3D6/Documents root# ls WeChat.decrypted

WeChat.decrypted文件就是我們砸殼后的二進制文件,我們可以拷貝到Mac上,各種工具都可以用上了。

第2步:導出頭文件

使用class-dump,將我們砸殼出來的二進制文件的頭文件導出來:

admindeMac-mini:微信6.5.5 admin$ class-dump --arch armv7 -s -S -H WeChat.decrypted -o headers/ admindeMac-mini:微信6.5.5 admin$ ls headers/ AAAlertItem.h AACloseNotifyReq.h AACloseNotifyRes.h AACloseReq.h AACloseRes.h AALaunchByMoneyReq.h AALaunchByMoneyRes.h AALaunchByPersonReq.h AALaunchByPersonRes.h AALaunchItem.h AAListRecord.h AAOperationReq.h AAOperationRes.h AAPayReq.h AAPayRes.h

可以看到微信的頭文件有8500多個(汗),如此茫茫代碼海出如何找出我們需要的那一部分呢?

第2步:精準定位我們想要HOOK的代碼

iOS開發是遵循MVC模式的,所以我們需要找到這個M模型層來找到我需要的業務邏輯代碼。搶紅包的原理是通過截取微信收到了紅包消息,然后直接調用打開紅包的接口來實現自動搶紅包。
通過查找發現CMessageMgr這個類就是用來管理各種消息的,查看CMessageMgr.h頭文件

- (void)AddAppMsg:(id)arg1 MsgWrap:(id)arg2 Data:(id)arg3 Scene:(unsigned long)arg4; - (void)AddAppMsg:(id)arg1 MsgWrap:(id)arg2 DataPath:(id)arg3 Scene:(unsigned long)arg4; - (BOOL)AddBackupMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddEmoticonMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddFloatBottle:(id)arg1 MsgWrap:(id)arg2; - (void)AddHelloMsg:(id)arg1 MsgWrap:(id)arg2 HelloUser:(id)arg3 OpCode:(unsigned long)arg4 DES:(unsigned long)arg5 checkCreateTime:(BOOL)arg6 status:(unsigned long)arg7; - (void)AddHelloMsgList:(id)arg1 MsgList:(id)arg2; - (void)AddLocalMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddLocalMsg:(id)arg1 MsgWrap:(id)arg2 fixTime:(BOOL)arg3 NewMsgArriveNotify:(BOOL)arg4; - (void)AddLocalMsg:(id)arg1 MsgWrap:(id)arg2 fixTime:(BOOL)arg3 NewMsgArriveNotify:(BOOL)arg4 Unique:(BOOL)arg5; - (void)AddMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddMsgPattern:(id)arg1; - (void)AddPimMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddRecordMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddShortVideoLocalMsg:(id)arg1 ToUsr:(id)arg2 VideoInfo:(id)arg3 MsgType:(unsigned long)arg4; - (void)AddShortVideoMsg:(id)arg1 ToUsr:(id)arg2 VideoInfo:(id)arg3; - (void)AddUniqueLocalMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AddVideoMsg:(id)arg1 ToUsr:(id)arg2 VideoInfo:(id)arg3; - (void)AddVideoMsg:(id)arg1 ToUsr:(id)arg2 VideoInfo:(id)arg3 MsgType:(unsigned long)arg4; - (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AsyncOnAddMsgForSession:(id)arg1 MsgWrap:(id)arg2; - (void)AsyncOnAddMsgForSession:(id)arg1 MsgWrap:(id)arg2 NewMsgArriveNotify:(BOOL)arg3; - (void)AsyncOnAddMsgListForSession:(id)arg1 NotifyUsrName:(id)arg2; - (void)AsyncOnCheckQQ; - (void)AsyncOnDelMsg:(id)arg1; - (void)AsyncOnDelMsg:(id)arg1 DelAll:(BOOL)arg2; - (void)AsyncOnDelMsg:(id)arg1 MsgWrap:(id)arg2; - (void)AsyncOnModMsg:(id)arg1 MsgWrap:(id)arg2;

通過猜想假設,再加上編寫Tweak腳本測試,發現我們想要的接受消息的函數是AsyncOnAddMsg這個函數。找到接受消息的函數后接下來,我們要找打開紅包的函數。
在頭文件目錄下搜索OpenRedEnvelope

grep -nR 'OpenRedEnvelope' ./ .//WCAtomicRedEnvReceiveHomeView.h:15: UIButton *m_oOpenRedEnvelopesButton; .//WCAtomicRedEnvReceiveHomeView.h:31:- (void)OnOpenRedEnvelopes; .//WCAtomicRedEnvReceiveHomeViewDelegate-Protocol.h:12:- (void)WCAtomicRedEnvReceiveHomeViewOpenRedEnvelopes:(_Bool)arg1; .//WCFestivalRedEnvFinishView.h:28:- (void)OnOpenRedEnvelopes; .//WCFestivalRedEnvReceiveHomeView.h:31:- (void)OnOpenRedEnvelopes; .//WCFestivalRedEnvReceiveHomeViewDelegate-Protocol.h:12:- (void)WCFestivalRedEnvReceiveHomeViewOpenRedEnvelopes:(_Bool)arg1; .//WCFestivalRedEnvShareView.h:28:- (void)OnOpenRedEnvelopes; .//WCRedEnvelopesControlData.h:31: NSDictionary *m_structDicAfterOpenRedEnvelopesInfo; .//WCRedEnvelopesControlData.h:49:@property(retain, nonatomic) NSDictionary *m_structDicAfterOpenRedEnvelopesInfo; // @synthesize m_structDicAfterOpenRedEnvelopesInfo; .//WCRedEnvelopesEnterpriseControlLogic.h:39:- (void)WCFestivalRedEnvReceiveHomeViewOpenRedEnvelopes:(_Bool)arg1; .//WCRedEnvelopesGreetingReceiveControlLogic.h:37:- (void)OnOpenRedEnvelopesRequest:(id)arg1 Error:(id)arg2; .//WCRedEnvelopesGreetingReceiveControlLogic.h:52:- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes; .//WCRedEnvelopesLogicMgr.h:42:- (void)OpenRedEnvelopesRequest:(id)arg1;

我們猜想WCRedEnvelopesLogicMgr.h里面的OpenRedEnvelopesRequest函數就是我們要找的目標函數,經常反復的測試和驗證,這個函數確實是我們要的打開紅包的函數。

第3步:寫代碼完成開發

經歷了以上分析和驗證的過程,寫代碼對于HOOK來說反而是很簡單的水到渠成。具體搶紅包的代碼如下:

@class CMessageMgr;CHDeclareClass(CMessageMgr);CHOptimizedMethod(2, self, void, CMessageMgr, AsyncOnAddMsg, id, arg1, MsgWrap, id, arg2) {CHSuper(2, CMessageMgr, AsyncOnAddMsg, arg1, MsgWrap, arg2);Ivar uiMessageTypeIvar = class_getInstanceVariable(objc_getClass("CMessageWrap"), "m_uiMessageType");ptrdiff_t offset = ivar_getOffset(uiMessageTypeIvar);unsigned char *stuffBytes = (unsigned char *)(__bridge void *)arg2;NSUInteger m_uiMessageType = * ((NSUInteger *)(stuffBytes + offset));Ivar nsFromUsrIvar = class_getInstanceVariable(objc_getClass("CMessageWrap"), "m_nsFromUsr");id m_nsFromUsr = object_getIvar(arg2, nsFromUsrIvar);Ivar nsContentIvar = class_getInstanceVariable(objc_getClass("CMessageWrap"), "m_nsContent");id m_nsContent = object_getIvar(arg2, nsContentIvar);switch(m_uiMessageType) {case 1: {}break;case 49: {// 49=紅包//微信的服務中心Method methodMMServiceCenter = class_getClassMethod(objc_getClass("MMServiceCenter"), @selector(defaultCenter));IMP impMMSC = method_getImplementation(methodMMServiceCenter);id MMServiceCenter = impMMSC(objc_getClass("MMServiceCenter"), @selector(defaultCenter));//紅包控制器id logicMgr = ((id (*)(id, SEL, Class))objc_msgSend)(MMServiceCenter, @selector(getService:), objc_getClass("WCRedEnvelopesLogicMgr"));//通訊錄管理器id contactManager = ((id (*)(id, SEL, Class))objc_msgSend)(MMServiceCenter, @selector(getService:),objc_getClass("CContactMgr"));Method methodGetSelfContact = class_getInstanceMethod(objc_getClass("CContactMgr"), @selector(getSelfContact));IMP impGS = method_getImplementation(methodGetSelfContact);id selfContact = impGS(contactManager, @selector(getSelfContact));if ([m_nsContent rangeOfString:@"wxpay://"].location != NSNotFound){NSString *nativeUrl = m_nsContent;NSRange rangeStart = [m_nsContent rangeOfString:@"wxpay://c2cbizmessagehandler/hongbao"];if (rangeStart.location != NSNotFound){NSUInteger locationStart = rangeStart.location;nativeUrl = [nativeUrl substringFromIndex:locationStart];}NSRange rangeEnd = [nativeUrl rangeOfString:@"]]"];if (rangeEnd.location != NSNotFound){NSUInteger locationEnd = rangeEnd.location;nativeUrl = [nativeUrl substringToIndex:locationEnd];}NSString *naUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]];NSArray *parameterPairs =[naUrl componentsSeparatedByString:@"&"];NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithCapacity:[parameterPairs count]];for (NSString *currentPair in parameterPairs) {NSRange range = [currentPair rangeOfString:@"="];if(range.location == NSNotFound)continue;NSString *key = [currentPair substringToIndex:range.location];NSString *value =[currentPair substringFromIndex:range.location + 1];[parameters setObject:value forKey:key];}//紅包參數NSMutableDictionary *params = [@{} mutableCopy];[params setObject:parameters[@"msgtypes"]?:@"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"];((void (*)(id, SEL, NSMutableDictionary*))objc_msgSend)(logicMgr, @selector(OpenRedEnvelopesRequest:), params);return;}break;}default:break;} }

以上就是微信搶紅包的分析和代碼過程,才有的是越獄方式開發,打包的dylib動態鏈接庫文件是直接放入到系統文件目錄里面的。至于非越獄開發,要更復雜一點,涉及到原始app文件的解包,修改,添加動態鏈接庫,然后再簽名打包的一系列復雜過程。僅供參考和學習用,請勿用于商業用途,否則后果自負!

轉自: http://blog.csdn.net/dlmlzz09/article/details/62232254

總結

以上是生活随笔為你收集整理的iOS逆向工程整理 HOOK微信抢红包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。