必赢亚洲手机app下载


scm xcode 配置

从零先导学

苹果电脑移动App入侵与逆向破解技术

转载: URL http://dev.qq.com/topic/577e0acc896e9ebb6865f321

 

 

假诺您有耐心看完那篇文章,您将明白如何动手展开app的分析、追踪、注入等实用的破解技术,其它,通过“凌犯”,将扶持你精通什么躲过常见的安全漏洞,小说大纲:

  • 回顾介绍ios二进制文件结构与凌犯的规律
  • 介绍凌犯常用的工具和方法,蕴含pc端和手提式有线电话机端
  • 教授黑客技术中的静态分析和动态分析法
  • 通过贰个简便的实例,来介绍怎么样综合应用砸壳、寻找注入点、lldb远程调节和测试、追踪、反汇编技术来进展黑客实战
  • 教学越狱破解补丁和不需越狱的破解补丁制作方法和差别

黑客的造诣

  • 敏感的嗅觉
    有时候通过一个函数名,3个类名,就能大约的判断出它的职能,那正是嗅觉;功力已臻化境时,甚至足以行使第五感判断出一部分注入点

  • 面对失利的胆略
    破解有时候很耗费时间,和次序开发刚刚相反,它耗费时间不是耗在写代码上,而是耗在物色注入点和逆向工程上,有只怕您花了3天时间去找程序的破碎,可是最终的破解代码恐怕就2行,不到一分钟就化解了;然而你也急需加强面对退步的备选,假如路选错了,有或者您那3天完全是在浪费脑细胞

  • 南宋之力
    洪荒之力-即入侵进度中须要依靠的各类工具,工欲善其事,必先利其器,工具都以先行者智慧的战果,能用工具化解的,绝不要手动去搞

iOS黑客关键字

iOS的侵袭离不开越狱开发,一切的破解、凌犯都以成立在越狱的根基上的,假若没有获得系统级权限,一切的想法都以放空炮了,当然,市面上存在免越狱的破解补丁,不过它的开支进程,也是基于越狱环境的

tweak

在iOS的黑客界,要做破解或越狱开发,就务须询问tweak,它是各个破解补丁的统称,在google上,假设你想寻找一些越狱开发资料或许开源的破解补丁代码,它是最棒的主要性字。

iOS的tweak大概分成二种:

  • 率先种是在cydia上披露的,供给越狱才能安装,大多数是deb格式的安装包,iOS在越狱后,会暗许安装2个叫作mobilesubstrate的动态库,它的效益是提供1个系统级的侵入管道,全数的tweak都能够依赖它来展开付出,如今主流的开发工具有theos和iOSOpenDev,前者是使用makefile的多个编译框架,后者提供了一套xcode项目模版,能够直接使用xcode开发可调节,然而这一个类型曾经终止更新了,对高版本的xcode援助不佳,大家研讨采纳(本文中的例子全部使用theos)

  • 第二种是直接打包成ipa安装包,并行使本人的支出证书恐怕公司证书签名,不需越狱也足以设置,可直接放到自身的网站上,可达成在线安装;对于从未越狱的无绳电电话机,由于权力的范围,大家是未曾章程写系统级的tweak的,例如springboard的补丁是迫于运转的,那种tweak大多是针对某些app,把对象app实行修改注入处理,再重新签名和公告,有点类似于windows软件的xxx破解版、xxx免注册版

从未越狱的机械由于系统中从未mobilesubstrate那个库,大家有三个挑选,第多少个是直接把这么些库打包进ipa当中,使用它的api完成注入,第二个是间接修改汇编代码;第多少个适用于相比复杂的破解行为,而且越狱tweak代码能够复用,第三种适用于破解一些if…else…之类的尺度语句

Mobilesubstrate

上边包车型大巴图彰显的正是oc届有名的method
swizzling技术,他正是iOS的注入原理,类似于windows的钩,所以大家注入也号称hook

苹果电脑 1

Mobilesubstrate为了方便tweak开发,提供了三个第三的模块:

  • MobileHooker
    就是用来做地点所说的那件事的,它定义一多级的宏和函数,底层调用objc-runtime和fishhook来替换系统大概指标应用的函数

  • MobileLoader
    用来在目的程序运维时依照规则把钦定目录的第壹方的动态库加载进去,第2方的动态库也正是大家写的破解程序,他的法则上边会简单讲解一下

  • Safe mode
    类似于windows的安全格局,比如大家写的部分系统级的hook代码产生crash时,mobilesubstrate会自动进入安全形式,安全情势下,会禁止使用全部的第壹方动态库

app注入原理

地点讲到了mobileloader,他是怎么形成把第壹方的lib注入进目的程序的吗?这几个大家要从二进制文件的构造说起,从上面包车型客车图来看,Mach-O文件的数码主导可分为三大多数,分别是底部(Header)、加载命令(Load
commands)、和最后的多少(Data)。mobileloader会在目的程序运营时,会依照内定的规则检查钦定目录是不是存在第②方库,假使有,则会由此改动二进制的loadCommands,来把团结注入进具有的app当中,然后加载第叁方库。

苹果电脑 2

为了让大家看的更掌握,上面小编用machoview来开辟五个真真的二进制文件给大家看看,能够看到,二进制当中全数引用到的动态库都位于Load
commands段在那之中,所以,通过给那一个段扩张记录,就能够注入我们有福同享写的动态库了

苹果电脑 3

那就是说问题来了,在那里插入我们协调的动态库有怎样用?大家友好写的代码没有执行的进口,大家一样没发干坏事,嗯,恭喜您问到点子上了,大家还亟需一个”main”函数来实施大家本身的代码,这一个”main”函数在oc里面称为构造函数,只要在函数前声称
“attribute((constructor)) static”
即可,有了它大家就足以表明想象力,进行避人耳目干点坏事了:

#import <CaptainHook/CaptainHook.h>

CHDeclareClass(AnAppClass);
CHMethod(1, void, AnAppClass, say, id, arg1)
{
    NSString* tmp=@"Hello, iOS!";
    CHSuper(1, AnAppClass, say, tmp);
}
__attribute__((constructor)) static void entry()
{
    NSLog(@"Hello, Ice And Fire!");
    CHLoadLateClass(AnAppClass);
    CHClassHook(1, AnAppClass,say);
}

到这边结束,大家曾经了解了怎么在目的程序注入本人的代码,那么大家怎么通晓需求hook哪些措施?怎么找到关键点举行实际的破解呢?下边讲一下科学普及的app凌犯分析方法

###iOS逆向分析方法

逆向分析最常用的有三种艺术:

  1. 互联网分析
    通过分析和篡改接口数据,能够使得的破解通过接口数据来控制客户端表现的app,常用的抓包工具有Tcpdump,
    WireShark, 查尔斯等,windows平台有fidller

  2. 静态分析
    通过砸壳、反汇编、classdump头文件等技巧来分析app行为,通过那种方式能够有效的解析出app实用的局地第贰方库,甚至分析出app的架构等内容,常用的工具有dumpdecrypted(砸壳)、hopper
    disassembler(反汇编)、class_dump(导头文件)

  3. 动态解析
    有静就有动,万物皆以相生相克的,动态解析指的是经过分析app的运维时数据,来恒定注入点或许取得首要数据,常用的工具有cycript(运维时间控制制台)、
    lldb+debugserver(远程断点调试)、logify(追踪)

demo:微信抢红包插件

地点讲了广大原理性的事物,相信我们已经看的浮躁了,上面我们一同动点真格的,大家从头初步,一步一步的做3个微信的电动抢红包插件,当然,网上也许早就有连锁的开源代码了,但是小编那里要讲的是,这个代码是怎么得出去的,笔者么重点讲一讲分析进度

工欲善其事,必先利其器

一台越狱的无绳电话机,并负有以下软件

  • cycript
  • dumpdecrypted
  • debug server
  • openssh

一台苹果电脑,并持有以下软件

  • class_dump
  • Theos
  • 苹果电脑,Hopper Disassembler v3
  • xcode
  • insert_dylib
  • pp助手

###找寻注入点

砸壳

第三大家要做的就是把微信的壳砸掉,砸壳其实是为着把它的头文件classdump出来,因为从appstore下载的app二进制都以经过加密的,直接开展classdump操作是吗也看不出来的

  • 用pp助手把dumpdecrypted.dylib文件copy到微信的documents目录
  • ssh到手提式有线话机的终极,cd到documents目录中,执行下边包车型地铁命令实行砸壳操作

xxx$ cp /usr/lib/dumpdecrypted.dylib /path/to/app/document
xxx$ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/WeChat
  • 终极砸壳实现后会在documents目录生成砸了壳后的二进制文件,用pp帮手copy出来并class-dump他的头文件备用

履行完这几行命令后,会在微信的documents目录生成二个WeChat.decrypted文件,那正是砸壳后的二进制文件;当然了,这一步不是必须的,大家得以一贯从93只怕pp帮手下载三个早已砸过壳的版本

动态解析-cycript

要想达成全自动抢红包,咱们必须找到收到红包音讯的handler方法,怎么动手呢?我们先从界面出发,进入微信的音信首发窗口:

苹果电脑 4

  • ssh进手提式有线电话机的终极,输入ps命令,查找到微信的长河id

ps aux | grep WeChat
  • 祭起神器cycript,遵照上一步找到的pid注入到微信的经过

cycript -p pidxxx
  • 在cycript的终极输入这一串方法,成效便是打字与印刷出脚下界面包车型大巴view层级,(cycript还有成都百货上千妙用,我们能够上官网看文书档案,那里不详细介绍)

UIApp.keyWindow.recursiveDescription().toString()

最后的输出如下,内容太多,我们一定看不清楚,可是没什么,这一个不是重大,那里只是突显一下打字与印刷的结果方式:

苹果电脑 5

小编们得以随心所欲的选项二个节点不要太靠树叶,也不要太靠树根,例如笔者选的是标红的一部分,把这些节点的内部存款和储蓄器地址copy出来,那么些内部存款和储蓄器地址,就代表了这几个节点的view对象,ios开发的老油条们都明白,通过view的nextResponder方法,能够找出它所属的视图控制器ViewController,所以笔者么在cycript的控制德雷斯顿频频输入如下的吩咐:

苹果电脑 6

见到没有,通过多少个nextResponder方法调用,小编么找到了当前闲谈窗口的ViewController类名,他正是BaseMsgContentViewController,以后我们缩短了指标范围,下边大家还索要持续收缩范围,要找到切实可行的消息处理函数才行。

动态解析-Logify

要继承压缩范围,就得祭起神器Logify了,它是theos的一个模块,功效就是依照头文件自动生成tweak,生成的tweak会在头文件的有所办法中注入NSLog来打字与印刷格局的入参和出参,分外适合追踪方法的调用和多少传递

近期我们依据在此以前砸壳后class_dump出来的头文件,找到BaseMsgContentViewController在pc终端履行如下命令:

logify.pl /path/to/BaseMsgContentViewController.h > /out/to/Tweak.xm

输出的tweak文件大概是其一样子的:

苹果电脑 7

这边带百分号的重中之重字,例如 %hook、%log、%orig
都以mobilesubstrate的MobileHooker模块提供的宏,其实也正是把method
swizzling相关的方法封装成了各类宏标记,使用起来更简短,大家想要更透彻精通各类标记,能够google一下logos语言

theos创建tweak

地方咱们用logify生成了一个tweak代码,大家要把它安装到手提式有线电话机上,首先须求运用theos举行编写翻译,安装了theos之后,在pc终端输入nic.pl

苹果电脑 8

第①选择品种模版当然是tweak啦,然后是项目名称、笔者,前面多少个挑选要留心:

  • 第③是bundle filter,那几个必要填你须要注入的靶子app的bundle
    id,MobileLoader模块会基于它来搜寻你的tweak的注入目的
  • 最后是list id applications to terminate upon
    installation,这里钦点当tweak安装成功以往,须求kill的长河,大家要hook微信,那里就填微信的二进制文件名就可以了,为啥要kill?
    因为笔者么的插件是索要在app运维时加载进去的,假如不重启app,插件是不会生效的

最后一切都形成后,在此时此刻目录会生成下列文件:

苹果电脑 9

把地点logify生成的tweak文件覆盖到当前目录,并用文件编辑器打开makefile文件,在文书的起初扩张你的ios设备的ip地址和ssh端口:

苹果电脑 10

说到底在pc终端进入项目目录,输入 make package install 命令:

苹果电脑 11

以内会让您输入设备的ssh密码,越狱机器的暗中同意ssh密码是alpine,make命令会生成deb安装包,放在debs目录,大家若是想对外发表本身的插件,能够把转变的安装包上传到cydia即可

设置成功后重新进入微信的聊天界面,并运用别的1个微信在群里发个普通新闻,连接xcode打开越狱机器控制台,查看输出,会发现有近似上边包车型客车输出:

Jun  7 09:56:13 Administratorde-iPhone WeChat[85972] <Notice>: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:308[m [0;30;46mDEBUG:[m -[<BaseMsgContentViewController: 0x15e0c9a00> addMessageNode:{m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=ccg*675~9, m_nsToUsr=1037957572@chatroom, m_uiStatus=1, type=1, msgSource="(null)"}  layout:1 addMoreMsg:0]

看出来了呢,新闻处理函数是BaseMsgContentViewController的**addMessageNode:layout:addMoreMsg:**艺术,大家能够看看,方法的参数内容也打字与印刷出来了


动态解析-lldb

到最近结束,笔者么已经把范围裁减到了具体的函数,看起来注入点已经找到了,可是请我们想想一下,借使大家在那一个函数中注入抢红包逻辑,这大家的tweak会不会有啥致命的败笔?

科学,因为BaseMsgContentViewController那个类是微信群聊天窗口对应的controller,作者么必须进入到群的聊天界面,这些类才会制造,若是不进去聊天窗口,大家的插件就不奏效了,而且,尽管进入聊天窗口,也只是能自动枪当前群的红包而已,别的群就无法了,是否有点low?

由此为了使我们的插件显得崇高一些,笔者么还要继续追根溯源,寻找音信的源流,那里就用到了lldb远程调节和测试,使用lldb打断点的法门,通过调用栈,大家可以就足以见到当音讯赶到时,方法的调用顺序,找到发轫执行的新闻处理函数。

要在刚刚追踪到的**addMessageNode:layout:addMoreMsg:**方法中打断点,首先我们得明白它在运维时的内部存款和储蓄器地址,那么内部存款和储蓄器地址怎么来啊?有这么一个公式:

  • 内存地址=进度内部存款和储蓄器营地址+函数在二进制中的偏移量

首先偏移量大家能够通过反汇编工具hooper来查,在pc上用hooper打开微信的二进制文件(注意,打开时会让你挑选armv7恐怕arm64,那亟需依据你越狱手提式有线电话机的cpu类型来选,一定要和你的手提式有线电话机一律),hooper的界面13分简短,左边有个搜索框,能够输入函数名,直接找到函数在二进制中的地方

苹果电脑 12

透过左边的搜索框搜addMessageNode关键字,找到它的偏移量是0x00000001017d7c6c:

苹果电脑 13

找到了偏移量,还索要经过的营地址,那几个地点须求连lldb,所以上边讲一下怎么着连接lldb实行远程调节和测试,先ssh进越狱手提式有线电话机的终端,在极限输入如下命令(注意,你的无绳电话机必须连xcode调节和测试过才会有那些命令):

debugserver *:19999 -a WeChat

下一场在pc端新起四个终端窗口,输入如下命令来连接手提式有线话机端实行调节和测试:

lldb  ->  process connect connect://deviceIP:19999

设若连接成功,会进来lldb的控制台,我们在lldb的控制台输入如下命令来收获微信进度的集散地址:

image list -o -f

履行那么些命令会打字与印刷很多行数据,像上面图中这样,笔者么要找到微信的二进制文件所在的行,记录它的内部存款和储蓄器地址0X00000000000E800:

苹果电脑 14

到此处我们八个地点都找到了,再通过br命令打断点:

br s -a '0X00000000000E800+0x00000001017d7c6c'

打好断点后持续向群里面发音讯,我们会发觉经过被断掉了,那时输入bt指令,就足以观望近年来的调用栈,就好像下图这样:

苹果电脑 15

浅析堆栈的时候,重点找出模块时WeChat的项,那个都是微信模块的不二法门调用,有了储藏室,大家须求按照堆栈的内部存款和储蓄器地址找出它的现实性函数名,思路依然先依照上面讲到的公式来测算出栈地址在二进制中的偏移量,然后用hooper找到偏移量对应的函数名

  • 函数在二进制中的偏移量=内部存款和储蓄器地址 –
    进度内部存款和储蓄器营地址

例如依据箭头所指的内部存储器地址和刚刚得到的经过营地址,总结偏移量:

0x0000000101ad02f4 – 0x00000000000e8000 = 1019E82F4

下一场在hooper中寻找那么些地址,得到结果如下:

苹果电脑 16

最终把富有的栈都举办还原,得出调用栈是以此样子的:

-[CMessageMgr MainThreadNotifyToExt:]:
–>    
-[BaseMsgContentLogicController OnAddMsg:MsgWrap:]:
——>
-[RoomContentLogicController DidAddMsg:]
———->
-[BaseMsgContentLogicController DidAddMsg:]
—————->
-[BaseMsgContentViewController addMessageNode:layout:addMoreMsg:]:

CMessageMgr那些类浮出水面了,是时候表达黑客的嗅觉了,依据章程名大家能看清出MainThreadNotifyToExt:那么些方法只有是用来发送公告的,借使hook这一个法子,我们是拿不到音讯内容的

出于此处大概是三个异步调用,用断点的措施,也许已经打字与印刷不出来栈音信了,所以还得利用logify来继续追踪CMessageMgr那一个类,讲过的内容自己就不重复了,直接获取终极的音信处理函数:

-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap 

实现“抢”的动作

上一节大家早就找到了hook的关键点,那么该怎么去落成抢的动作?同样大家必要组合动态解析和静态分析,首先获得红包消息体的数目特征,然后再分析处理音讯的关键点

多少包分析

第②大家的代码供给分辨哪些才是红包音信,方法很不难,用logify追踪BaseMsgContentViewController,然后向微信群发三个红包,观察手提式有线电话机日志输出,我们得以看看音信的数据结构中有个type字段,值是49,这几个type应该正是标志音讯类型的,若是不鲜明,能够再发个图片或许文本之类的音信,那些值是例外的:

Administratorde-iPhone WeChat[47410] <Notice>: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:308[m [0;30;46mDEBUG:[m -[<BaseMsgContentViewController: 0x15e0c9a00> addMessageNode:{m_uiMesLocalID=16, m_ui64MesSvrID=1452438635530425509, m_nsFromUsr=1037957572@chatroom, m_nsToUsr=ccg*675~9, m_uiStatus=4, type=49, msgSource="<msgsource>
        <silence>0</silence>
        <membercount>3</membercount>
    </msgsource>
    "}  layout:1 addMoreMsg:0]

方今大家能辨识音信类型了,重点来了,怎么落到实处抢那些事呢,或者聪明人已经猜到了,从ui入手,先找到微信本人的抢红包函数,大家和好来给它构造参数并调用他不就行了?

苹果电脑 17

把红包点开后,用cycript打字与印刷出近来view的层次,就好像上面这几个,一眼就足以见到重点,WCRedEnvelopesReceiveHomeView正是开红包弹框的类名

苹果电脑 18

精通类名后,用cycript追踪它,点击开红包,在日记中找到了下图中的内容,从名字来看,那是3个事件处理函数,大家前日要做的,便是把他回复成oc代码,真正完成抢红包功能

Administratorde-iPhone WeChat[91173] <Notice>: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:8[m [0;30;46mDEBUG:[m -[<WCRedEnvelopesReceiveHomeView: 0x13cdda8c0> OnOpenRedEnvelopes]

静态分析法

怎么把她回复成oc代码,真正贯彻抢红包功用吗?还得凭借一丢丢汇编技能,只是一丢丢罢了,因为未来的反汇编工具已经很强劲了,大家不需求挨个去看寄存器了

在pc上用hooper打开微信的二进制文件,搜索OnOpenRedEnvelopes,查看汇编代码,注意在图片中最后一行调用了三个WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes函数

苹果电脑 19
苹果电脑 20


接二连三寻找WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes这几个办法,找到它的汇编代码

  • 首先她不清楚从什么地方获得了二个payinfoitem
  • 下一场又收获了payinfo的m_c2cNativeUrl属性
  • 然后调用substringfromindex吧navtiveurl的前缀截断,并调用bizutil的3个方法把url参数转换到了贰个字典

苹果电脑 21

终极反解出的代码如下,是还是不是很简短?

NSString *nativeUrl = [[msgWrap m_oWCPayInfoItem] m_c2cNativeUrl];
nativeUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]];
NSDictionary *nativeUrlDict = [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@"&"];

继续往下看, 在此间前边三行成立了八个mutable dictionary:

  • 接着上面多少个框框处都以调用了setobject:forkey:向里面填东西,那填的东西是吗呢?
  • 实在那里早已得以看的很明亮了,第一个key是msgtype,值是字符串1,第四个sendid,值是调用了一个objectforkey从另一个字典中取出来的,很明朗,另二个字典就是上面从url解析获得的,前面包车型客车channelid也是一样的道理

苹果电脑 22

终极得到的代码如下:

NSMutableDictionary *args = [[%c(NSMutableDictionary) alloc] init];
[args setObject:nativeUrlDict[@"msgtype"] forKey:@"msgType"];
[args setObject:nativeUrlDict[@"sendid"] forKey:@"sendId"];
[args setObject:nativeUrlDict[@"channelid"] forKey:@"channelId"];

此起彼伏往下看从箭头所指的几处,大家得以望见,它的代码是如此的,共分为四步

  • 率先个箭头调用了mmservicecenter的defaultcenter方法来获取mmservicecenter实例
  • 其次个箭头调用了CContactMgr的class方法
  • 其四个箭头调用了第贰步获取的mmservicecenter实例的getservice方法,而那一个方法是把第3步获得的class作为参数
  • 第四个箭头很明白了吗,第3步获得了CContactMgr实例,那里就是调用CContactMgr实例的getselfcontact方法得到自个儿的账户资料

苹果电脑 23

说到底恢复生机的到的代码如下:

CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];

此起彼伏往下看,这里运用刚刚收获的selfcontact来赢得displayname和headimgurl,并把它们设置到刚刚的字典里面了,key分别是nickname和headimg

苹果电脑 24

末段的代码:

[args setObject:[selfContact getContactDisplayName] forKey:@"nickName"];
[args setObject:[selfContact m_nsHeadImgUrl] forKey:@"headImg"];

随即看,接下去这两段就比较蛋疼了,完全是从内部存款和储蓄器地址里面取的值,作者也不清楚她从何地来,怎么办呢?有没有不懂汇编就能化解它的近便的小路呢,答案是有!

  • 对此第②个,笔者能够通过它的key猜出来,还记得最开首的时候大家取过payinfo的八个nativeurl属性吧,大家姑且把她传进去
  • 对此第二个,我们能够推测sessionUserName大概是会话名称,也正是群名称的情趣,从何地取那几个值吗?我们先把也设置成伪代码

苹果电脑 25

末尾的结果如下:

[args setObject:nativeUrl forKey:@"nativeUrl"];
[args setObject:xxx forKey:@"sessionUserName"];

再三再四往下看,接下去这一段还是用mmservicecenter来获取WCRedLogicMgr对象,然后调用WCRedLogicMgr的open方法来拆红包,能够想象open方法的参数便是地点大家辛苦组装的字典

苹果电脑 26

代码如下:

[[[%c(MMServiceCenter) defaultCenter] getService:[%c(WCRedEnvelopesLogicMgr) class]] OpenRedEnvelopesRequest:args];

领红包逻辑

到此处,大家再下结论一下我们位置分析的经过…

  • 得到m_oWCPayInfoItem属性
  • 解析m_oWCPayInfoItem的m_c2cNativeUrl属性
  • 得到selfcontact
  • 组建相关参数
  • 调用OpenRedEnvelopesRequest:领取红包

说到底的抢红包代码合并起来如下:

#import "WxMsgPreview.h"

%hook CMessageMgr

-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap {
    %log;
    %orig;
    if(msgWrap.m_uiMessageType == 49){
        CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
        CContact *selfContact = [contactManager getSelfContact];

        if ([msgWrap.m_nsContent rangeOfString:@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao"].location != NSNotFound) { // 红包

            NSString *nativeUrl = [[msgWrap m_oWCPayInfoItem] m_c2cNativeUrl];
            nativeUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]];

            NSDictionary *nativeUrlDict = [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@"&"];

            NSMutableDictionary *args = [[%c(NSMutableDictionary) alloc] init];
            [args setObject:nativeUrlDict[@"msgtype"] forKey:@"msgType"];
            [args setObject:nativeUrlDict[@"sendid"] forKey:@"sendId"];
            [args setObject:nativeUrlDict[@"channelid"] forKey:@"channelId"];
            [args setObject:[selfContact getContactDisplayName] forKey:@"nickName"];
            [args setObject:[selfContact m_nsHeadImgUrl] forKey:@"headImg"];
            [args setObject:nativeUrl forKey:@"nativeUrl"];
            [args setObject:msgWrap.m_nsFromUsr forKey:@"sessionUserName"];

            [[[%c(MMServiceCenter) defaultCenter] getService:[%c(WCRedEnvelopesLogicMgr) class]] OpenRedEnvelopesRequest:args];
        }
    }
}

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图