初涉iOS逆向工程:免越獄修改微信

破殼

? 參考文章iOS逆向之博破殼

外觀篇

? 參考文章初涉iOS逆向工程:免越獄修改微信(外觀篇)

功能篇

本文是在以上兩篇文章的基礎(chǔ)上來分析如何逆向修改微信原生功能,包含以下3個小功能

  • 微信消息防撤回
  • 修改微信運動步數(shù)
  • 擲骰子、石頭剪刀布自定義

關(guān)于微信消息防撤回和修改微信步數(shù)網(wǎng)上也有很多的資料了萍摊,我也借鑒了一部分

原始代碼參考于https://github.com/Abeautifulliar/WeChatHook,之后我自定義實現(xiàn)了擲骰子和剪刀石頭布作弊功能

1.界面分析與準備

  • 頭文件分析

    首先對破殼后拿到的頭文件進行分析酷鸦,根據(jù)文件類名疙咸、方法名、變量名等猜測其作用

    image.png

    文件名是如此之多鲜屏,足足10000+肉盹,想要一個一個看文件名難免力不從心昔驱,這時就需要考驗我們的技巧了,比如你想搜登錄相關(guān)的邏輯可以搜索一些關(guān)鍵字進行過濾以找到你想要的文件上忍,如搜索login ViewController manager骤肛。 頭文件內(nèi)又有很多實例變量和方法申明纳本,我們也可以很容易猜測出用途

  • UI界面分析
    通過debug查看UI層級圖可以很容易的知道當前UI界面所屬的ViewController了

    image.png

    如圖可以得知微信聊天界面所屬的VC是BaseMsgContentViewController
    同樣的方法可以知道設(shè)置界面是NewSettingViewController,通訊錄界面是ContactsViewController

消息防撤回

網(wǎng)上很多資料也說了,微信的消息管理類是CMessageMgr,一些關(guān)鍵方法如下

- (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(id)arg2;
- (void)AsyncOnDelMsg:(id)arg1;
- (void)onRevokeMsg:(id)arg1;

根據(jù)猜測得知微信接收到撤回消息時會先調(diào)用 onRevokeMsg方法腋颠,該方法會創(chuàng)建一條通知消息,即xxx撤回了一條消息繁成,然后會調(diào)用AsyncOnDelMsg方法,該方法會將本地的消息刪除淑玫,而我們要做的就是調(diào)用onRevokeMsg方法巾腕,但是不調(diào)用AsyncOnDelMsg方法,這樣就達到了防撤回的目的

注:用戶自己刪除本地消息時也會調(diào)用AsyncOnDelMsg方法絮蒿,所以為了不影響其它操作尊搬,我們應(yīng)該只屏蔽掉因接受到撤回消息時調(diào)用AsyncOnDelMsg
關(guān)鍵代碼如下

// 阻止撤回消息
CHOptimizedMethod1(self, void, CMessageMgr, onRevokeMsg, id, msg){
    [WeChatManager manager].revokeMsg = YES;
    CHSuper1(CMessageMgr, onRevokeMsg, msg);
}

CHDeclareMethod3(void, CMessageMgr, DelMsg, id, arg1, MsgList, id, arg2, DelAll, BOOL, arg3){
    if ([WeChatManager manager].revokeMsg) {
        [WeChatManager manager].revokeMsg = NO;
    } else {
        CHSuper3(CMessageMgr, DelMsg, arg1, MsgList, arg2, DelAll, arg3);
    }
}

WeChatManager是自定義的類,用于記錄是否收到了通知撤回消息和保存要修改的步數(shù)

修改步數(shù)

修改步數(shù)的關(guān)鍵類是WCDeviceStepObject

#import "MMObject.h"

@class NSMutableArray;

@interface WCDeviceStepObject : MMObject
{
    unsigned int beginTime;
    unsigned int endTime;
    unsigned int m7StepCount;
    unsigned int hkStepCount;
    NSMutableArray *allHKSampleSource;
}

- (void).cxx_destruct;
@property(retain, nonatomic) NSMutableArray *allHKSampleSource; // @synthesize allHKSampleSource;
@property(nonatomic) unsigned int beginTime; // @synthesize beginTime;
@property(nonatomic) unsigned int endTime; // @synthesize endTime;
@property(nonatomic) unsigned int hkStepCount; // @synthesize hkStepCount;
@property(nonatomic) unsigned int m7StepCount; // @synthesize m7StepCount;

@end

只需Hook住m7StepCount方法即可
如下代碼

CHOptimizedMethod0(self, unsigned int, WCDeviceStepObject, m7StepCount){
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
    NSDate *today = [cal dateFromComponents:components];
    components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[WeChatManager manager].lastChangeStepCountDate];
    NSDate *otherDate = [cal dateFromComponents:components];
    BOOL modifyToday = NO;
    if([today isEqualToDate:otherDate]) modifyToday = YES;
    if ([WeChatManager manager].stepCount < CHSuper0(WCDeviceStepObject, m7StepCount) || !modifyToday) {
        [WeChatManager manager].stepCount = CHSuper0(WCDeviceStepObject, m7StepCount);
    }
    return [WeChatManager manager].stepCount;
}

擲骰子土涝、剪刀石頭布

有過擲骰子佛寿、剪刀石頭布的都知道,擲骰子的結(jié)果其實是在發(fā)送方就決定了但壮,而不是到服務(wù)端或者接收方才確定的結(jié)果冀泻,所以我們把發(fā)送消息類型攔截就行啦~
原理和防撤回消息類似,當發(fā)送Emoticon消息時會調(diào)用- (void)AddEmoticonMsg:(id)arg1 MsgWrap:(id)arg2;蜡饵,修改消息內(nèi)容即可
代碼如下

CHMethod(2, void, CMessageMgr, AddEmoticonMsg, id, arg1, MsgWrap, id, arg2) {
    id msgType = [arg2 valueForKey:@"m_extendInfoWithMsgType"];
    if (((NSNumber *)([msgType valueForKey:@"m_uiGameType"])).intValue == 2) {
        [msgType setValue:[NSNumber numberWithInt:[WeChatManager manager].gameContent2] forKey:@"m_uiGameContent"];
        [arg2 setValue:msgType forKey:@"m_extendInfoWithMsgType"];
    }
    if (((NSNumber *)([msgType valueForKey:@"m_uiGameType"])).intValue == 1) {
        [msgType setValue:[NSNumber numberWithInt:[WeChatManager manager].gameContent1] forKey:@"m_uiGameContent"];
        [arg2 setValue:msgType forKey:@"m_extendInfoWithMsgType"];
    }
    CHSuper(2, CMessageMgr, AddEmoticonMsg, arg1, MsgWrap, arg2);
}

注:m_uiGameType為1時表示剪刀石頭布弹渔,為2時表示擲骰子,而當石頭剪刀布時m_extendInfoWithMsgType的值為1~3溯祸,分別代表剪刀(1),石頭(2)
,布(3),當為擲骰子時m_extendInfoWithMsgType的值分別為49,也就是擲骰子的結(jié)果(16)

其它

關(guān)于如何修改原生UI肢专,拿設(shè)置界面舉例,如果我們要添加一個自定義的設(shè)置選項您没,首先需要分析類NewSettingViewController

@class MMTableViewInfo, MMTipsViewController, NSString, WCAccountLogoutLogic, WCAccountSwitchLogic;

@interface NewSettingViewController : MMUIViewController <WCAccountSwitchLogicDelegate, WCAccountLogoutLogicDelegate, MMTipsViewControllerDelegate>
{
    MMTableViewInfo *m_tableViewInfo;
    _Bool m_bFromSetting;
    WCAccountSwitchLogic *m_switchLogic;
    WCAccountLogoutLogic *m_logoutLogic;
    MMTipsViewController *m_introView;
}
@end

根據(jù)頭文件可知鸟召,該VC的tableView被封裝到了m_tableViewInfo,類型為MMTableViewInfo氨鹏,該類提供了一個- (void)insertSection:(id)arg1 At:(unsigned int)arg2;方法,所以我們想辦法加一個section就行啦
代碼如下

CHDeclareMethod0(void, NewSettingViewController, reloadTableData){
   CHSuper0(NewSettingViewController, reloadTableData);
   MMTableViewInfo *tableInfo = [self valueForKeyPath:@"m_tableViewInfo"];
   MMTableViewSectionInfo *sectionInfo = [objc_getClass("MMTableViewSectionInfo") sectionInfoDefaut];
   MMTableViewCellInfo *stepcountCellInfo1 = [objc_getClass("MMTableViewCellInfo") editorCellForSel:@selector(recordStepCount:) target:[WeChatManager manager] title:@"微信運動步數(shù)" margin:300.0 tip:@"請輸入步數(shù)" focus:NO text:[NSString stringWithFormat:@"%ld", (long)[WeChatManager manager].stepCount]];
   MMTableViewCellInfo *cellInfo2 = [objc_getClass("MMTableViewCellInfo") editorCellForSel:@selector(recordGameContent1:) target:[WeChatManager manager] title:@"石頭剪刀(1~3)" margin:300.0 tip:@"" focus:NO text:[NSString stringWithFormat:@"%ld", (long)[WeChatManager manager].gameContent1]];
   MMTableViewCellInfo *cellInfo3 = [objc_getClass("MMTableViewCellInfo") editorCellForSel:@selector(recordGameContent2:) target:[WeChatManager manager] title:@"擲骰子(1-6)" margin:300.0 tip:@"" focus:NO text:[NSString stringWithFormat:@"%ld", (long)[WeChatManager manager].gameContent2-3]];
   [sectionInfo addCell:stepcountCellInfo1];
   [sectionInfo addCell:cellInfo2];
   [sectionInfo addCell:cellInfo3];
   [tableInfo insertSection:sectionInfo At:0];
   MMTableView *tableView = [tableInfo getTableView];
   [tableView reloadData];
}

最后

隨著微信防越獄技術(shù)的提高和版本的迭代压状,當前越獄版本可能在后續(xù)無法使用仆抵。而且第三方的越獄版app也不要太相信,可能會偷偷記錄個人隱私种冬。能自己弄的還是自己弄吧镣丑,且用且珍惜!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娱两,一起剝皮案震驚了整個濱河市莺匠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌十兢,老刑警劉巖趣竣,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摇庙,死亡現(xiàn)場離奇詭異,居然都是意外死亡遥缕,警方通過查閱死者的電腦和手機卫袒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來单匣,“玉大人夕凝,你說我怎么就攤上這事』С樱” “怎么了码秉?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸡号。 經(jīng)常有香客問我泡徙,道長,這世上最難降的妖魔是什么膜蠢? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任堪藐,我火速辦了婚禮,結(jié)果婚禮上挑围,老公的妹妹穿的比我還像新娘礁竞。我一直安慰自己,他們只是感情好杉辙,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布模捂。 她就那樣靜靜地躺著,像睡著了一般蜘矢。 火紅的嫁衣襯著肌膚如雪狂男。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天品腹,我揣著相機與錄音岖食,去河邊找鬼。 笑死舞吭,一個胖子當著我的面吹牛泡垃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羡鸥,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蔑穴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惧浴?” 一聲冷哼從身側(cè)響起存和,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捐腿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纵朋,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年叙量,在試婚紗的時候發(fā)現(xiàn)自己被綠了倡蝙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绞佩,死狀恐怖寺鸥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情品山,我是刑警寧澤胆建,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站肘交,受9級特大地震影響笆载,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涯呻,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一凉驻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧复罐,春花似錦涝登、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乱投,卻和暖如春咽笼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戚炫。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工剑刑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘹悼。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓叛甫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杨伙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • http://www.reibang.com/p/691d635eeda0
    曾柏超閱讀 535評論 0 1
  • 想起自己孩子小時候一件事萌腿。 和他玩猜時間的游戲限匣,就是估計現(xiàn)在是幾點鐘? 他就問:“什么是估計?” 我給他解釋:“就...
    分明魚閱讀 625評論 0 0
  • 十一小長假米死,對于我們已婚帶孩子的家庭來說锌历,多數(shù)人都會選擇陪孩子外出旅行。而對于未婚還在單身的年輕男男女女峦筒,多數(shù)都會...
    星亮晨雨閱讀 302評論 0 0
  • 時間就是最寶貴的資源究西,2017年11月21日TA15的兩周年組會在美麗的湖州隆重召開。 主持人:張麗萍 時間廊:盛...
    收納日用品生產(chǎn)閱讀 694評論 0 0
  • 立冬的早晨物喷,下雨了卤材。 享受冬天的靜謐時光 等待著春姑娘來臨 球場的走道上 草香也精神起來了 陰沉的天空 無法阻止內(nèi)...
    一元真人閱讀 340評論 8 16