30-项目实战(2)

前言

我们继续之前的29-项目实战(1),接着破解分析红包的相关逻辑。

一、IDA初使用

IDA是windows平台上的反编译插件,如果在mac电脑上使用,首先得装个虚拟机,虚拟机上安装windows操作系统,现成的软件有Parallels Desktop,可自行百度搜索安装。安装完成后,打开微信的Mach-O二进制文件👇🏻

⚠️注意:恢复符号表,这个时间段会很长(可能3h以上),我们等待就行。

二、静态分析拆红包

在静态分析之前,我们应该知道,Wechat的二进制文件是去符号的,即很多OC的方法干掉了,因此需要恢复,这样对IDA反编译也有很大的帮助,此时我们可以使用Monkey来做恢复符号这项工作。

2.1 Monkey恢复符号演示

其实很简单,就是修改Monkey的配置项👇🏻

恢复符号后的app包,再把里面的Mach-O文件丢给IDA进行反编译。

2.2 开始静态分析

目前,我们定位到拆红包的方法是OnOpenRedEnvelopes,这是一个实例方法,而且这个实例是个view(WCRedEnvelopesReceiveHomeView),那么触发它就必须有个前提 👉🏻 模拟构造一个WCRedEnvelopesReceiveHomeView对象,很显然,这么做会很难。

我们只有想另外一条途径 👇🏻

OnOpenRedEnvelopes内部的逻辑是什么?

我们只要能弄清楚拆红包的内部做的事情,然后将这个逻辑写到CheckMessageStatus:Msg方法中,不就等于自动拆红包了么。那么接下来的重点 👉🏻 反汇编OnOpenRedEnvelopes内部的逻辑。

  1. 打开反汇编完成后的ida文件,搜索OnOpenRedEnvelopes👇🏻
  • WARedEnvelopesReceiveHomeView头文件👇🏻
  • WCRedEnvelopesReceiveHomeView头文件👇🏻

可见,WARedEnvelopesReceiveHomeViewWCRedEnvelopesReceiveHomeView大部分的属性和方法都一样,WA这个应该是旧版本的红包View类,里面的属性没有WC的多。

  1. 分析汇编代码👇🏻

以上,其实分析下来,流程不怎么难,即获取一个字典m_dicBaseInfo,获取key分别是isSenderhbType的value,再拿到m_delegate对象,调用其WCRedEnvelopesReceiveHomeViewOpenRedEnvelope方法。

三、动态调试拆红包

接下来,我们通过logos语法,hookWCRedEnvelopesReceiveHomeView中的上面的关键信息,打印看看具体有什么。

  1. 成员变量m_dicBaseInfom_delegate👇🏻
  1. 编写logos代码👇🏻

⚠️注意:针对成员变量的获取方式 👉🏻 MSHookIvar

首先要声明一下类

@interface WCRedEnvelopesReceiveHomeView
{
  id m_delegate;// 具体delegate不需要指明
  NSDictionary *m_dicBaseInfo;
}
@end

然后hook拆红包方法,我们在的时机点,打印信息

%hook WCRedEnvelopesReceiveHomeView
- (void)OnOpenRedEnvelopes {
    // BaseInfo
    NSDictionary *dict = MSHookIvar<NSDictionary *>(self, "m_dicBaseInfo");
    NSArray *keys = [dict allKeys];
    for (int i = 0; i < keys.count; i++) {
        NSLog(@"%@ : %@", keys[i], [dict objectForKey:keys[i]]);
    }
    
    // delegate
    id delegate = MSHookIvar<id>(self, "m_delegate");
    NSLog(@"delegateClass:%@", [delegate class]);
    
    %orig;
}
%end
  1. 编译安装,接收一个红包消息,点击拆开,查看控制台输出👇🏻

上图可见,m_dicBaseInfo中的信息就是红包相关的信息,m_delegate的类就是WCRedEnvelopesReceiveControlLogic,那么拆红包最终就是调用WCRedEnvelopesReceiveControlLogic类的方法WCRedEnvelopesReceiveHomeViewOpenRedEnvelope

四、静态分析delegate

接下来,我们静态分析下WCRedEnvelopesReceiveControlLogicWCRedEnvelopesReceiveHomeViewOpenRedEnvelope方法👇🏻

我们去WCRedEnvelopesReceiveControlLogic.h头文件中看看👇🏻

果然有带参数的方法,且参数类型是id类型👇🏻

- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:(id)arg1;

那么,我们可以理解它的执行流程 的伪代码就是👇🏻

- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes {
  [self WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:0];
}

接着继续分析带参数的WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes👇🏻

接着我们看看m_data是什么👇🏻

m_data的类是WCRedEnvelopesControlData。那么上面的流程伪代码可以这么写👇🏻

- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:(id)arg1 {
  [self reportReveiveHomeViewEmoticon];
  WCRedEnvelopesControlData *data = self.m_data;
  [data m_oSelectedMessageWrap];
}

继续,看看WCRedEnvelopesControlData类的m_oSelectedMessageWrap方法👇🏻

m_oSelectedMessageWrap是一个属性,类是CMessageWrap

接着看CMessageWrap👇🏻

m_oWCPayInfoItem也是一个属性,类是WCPayInfoItem,继续👇🏻

果然,m_c2cNativeUrl也是一个属性。
综上,完善上面的伪代码👇🏻

- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:(id)arg1 {
  [self reportReveiveHomeViewEmoticon];
  WCRedEnvelopesControlData *data = self.m_data;
  CMessageWrap *msgWrap = [data m_oSelectedMessageWrap];
  WCPayInfoItem *payInfoItem = [msgWrap m_oWCPayInfoItem];
  NSString *url = [payInfoItem m_c2cNativeUrl];
}

五、动态调试delegate

还是一样,根据上面的伪代码,接下来我们动态调试一下👇🏻

  1. 编写logos hook代码👇🏻
// 声明需要的类及属性
@interface WCPayInfoItem
@property(retain, nonatomic) NSString *m_c2cNativeUrl;
@end

@interface CMessageWrap
@property(retain, nonatomic) WCPayInfoItem *m_oWCPayInfoItem;
@end

@interface WCRedEnvelopesControlData
@property(retain, nonatomic) CMessageWrap *m_oSelectedMessageWrap;
@end



%hook WCRedEnvelopesReceiveControlLogic
- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:(id)arg1 {
    // 这个流程是UIView相关的,不是拆红包的重点,可以注释掉
//    [self reportReveiveHomeViewEmoticon];
    // 不能直接.m_data获取,可通过MSHookIvar这种方式获取
//    WCRedEnvelopesControlData *data = self.m_data;
    WCRedEnvelopesControlData *data = MSHookIvar<WCRedEnvelopesControlData *>(self, "m_data");
    // 以下3句可以简化成1句
//    CMessageWrap *msgWrap = [data m_oSelectedMessageWrap];
//    WCPayInfoItem *payInfoItem = [msgWrap m_oWCPayInfoItem];
//    NSString *url = [payInfoItem m_c2cNativeUrl];
    NSString *url = data.m_oSelectedMessageWrap.m_oWCPayInfoItem.m_c2cNativeUrl;
    NSLog(@"m_c2cNativeUrl:%@", url);
    // 也不需要继续走原有的流程,这样就不会真正的“拆”红包了
//    %orig;
}
%end
  1. 编译安装,接收红包消息,查看控制台信息👇🏻
m_c2cNativeUrl:wxpay://c2cbizmessagehandler/hongbao/receivehongbao?msgtype=1&channelid=1&sendid=1000039901202108267308122328105&sendusername=Aron1101&ver=6&sign=39c4f82a43ecd7ae7154169e7c69ff70c71e43a1ace7bb9b9b35486c18e99b302cece5fa7544a479021db71856a3936182bc6dc7cf1d86267cbfba952b67bd4673e4751447d5bb1c76b2a52c7e7e32a1

我们拿到了url,其中包含有签名信息sign

  1. 我们继续往下静态分析- (void)WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:(id)arg1剩下的汇编代码流程👇🏻
  • cfstr_WxpayC2cbizmes
    其实只需看WxpayC2cbizmes,我们可以直接鼠标点进去查看👇🏻

可见,cfstr_WxpayC2cbizmes其实是个简化字符串,即👇🏻

wxpay://c2cbizmessagehandler/hongbao/receivehongbao?

和前面控制台打印输出的url的前半部分一模一样,再回过头看汇编,就能明白cfstr_WxpayC2cbizmes那块处理做的事情👇🏻

至此,我们分析到截取wxpay://c2cbizmessagehandler/hongbao/receivehongbao?之后,得到的子串👇🏻

msgtype=1&channelid=1&sendid=1000039901202108267308122328105&sendusername=Aron1101&ver=6&sign=39c4f82a43ecd7ae7154169e7c69ff70c71e43a1ace7bb9b9b35486c18e99b302cece5fa7544a479021db71856a3936182bc6dc7cf1d86267cbfba952b67bd4673e4751447d5bb1c76b2a52c7e7e32a1

总结

本篇文章,使用IDA逆向软件,针对WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes,通过静态分析汇编代码,加上hook动态调试打印关键信息,一步步得到关键的字串

我们先告一段落,后面文章将继续讲解WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes的重点 👉🏻 31-项目实战(3)还原红包方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容