目的:在不越狱的前提下,使用动态库库注入的方式来hook应用的某些函数以篡改应用行为。

需要的工具:

砸壳: dumpdecrypted

class-dump: class-dump

Cycript: cycript

IDA: ida demo

theos: theos

iosopendev: iosopendev

调试: lldb+debugserver

本文以微信自动抢红包为例,虽然教程很多了,但还是从如何获取关键调用函数的过程来分析。

以下内容仅供研究学习,请不要用于非法用途,笔者概不负责。

进入正题:

1.砸壳:

参考文章: http://www.blogfshare.com/dumpdecrypted-app.html

获取Document目录:

[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

如果不想自己砸壳,可以直接从PP助手上下载一个即可,已经砸过壳的。

2.class-dump:

参考文章: http://www.blogfshare.com/ioss-class-dump-z.html

使用:class-dump-z WeChat.decrypted -H -o OutPutHeaders

拿到头文件后,新建一个Xcode工程,然后把头文件拖进去备用查找。

3.开始分析工作:

先要找到从别人发来的消息是哪个函数在处理。

首先还是从界面入手,随便进入一个群聊天界面,使用Cycript显示出界面结构:

随便找一个其中的控件,然后找到它的controller。

找到了一个叫BaseMsgContentViewController的ViewController,使用theos Logify的方法来跟踪这个类。

参考博文: http://www.blogfshare.com/ioss-theos-logify.html

打开群聊界面,往该群组发送消息,从log输出可以看到添加消息节点的调用:

- [<BaseMsgContentViewController: 0x1638b200> addMessageNode:{m_uiMesLocalID=76, m_ui64MesSvrID=2873926057328047596, m_nsFromUsr=1759668824@chatroom, m_nsToUsr=wxi*l12~19, m_uiStatus=4, type=1, msgSource=”<msgsource>

<silence>0</silence>

<membercount>3</membercount>

</msgsource>

“}  layout:1 addMoreMsg:0]

为了获取这个消息包的来源,下面要使用lldb进行调试,查看堆栈调用。

附加微信进程,使用 image list -o -f 获取微信模块加载的基地址,这里基地址为:    0xad000

-[BaseMsgContentViewController addMessageNode:layout:addMoreMsg:]:的文件偏移地址为:0x0154a084

下断点:

br s -a ’0xad000+0x0154a084′

计算0x017dd7f4在文件中的地址:

0x017dd7f4 – 0xad000 = 0x17307F4

而这个地址在:

-[BaseMsgContentLogicController DidAddMsg:]

继续 回溯:

0×01149684 – 0xad000 = 0x109C684

这个地址在:

-[RoomContentLogicController DidAddMsg:]

0x017dda3e -  0xad000 = 0x1730A3E

这个地址在:

-[BaseMsgContentLogicController OnAddMsg:MsgWrap:]:

0x01e44d42 – 0xad000 = 0x1D97D42

这个地址在:

-[CMessageMgr MainThreadNotifyToExt:]:

到此,整个流程基本就出来了:

-[CMessageMgr MainThreadNotifyToExt:]:

–>

-[BaseMsgContentLogicController OnAddMsg:MsgWrap:]:

——>

-[RoomContentLogicController DidAddMsg:]

———->

-[BaseMsgContentLogicController DidAddMsg:]

—————->

-[BaseMsgContentViewController addMessageNode:layout:addMoreMsg:]:

跟踪类CMessageMgr,继续发送消息测试。

通过log可以获取到大致的流程如下:

-[CMessageMgr MessageReturn:MessageInfo:Event:]

–>

-[CMessageMgr AsyncOnAddMsg:MsgWrap:]

——>

-[CMessageMgr MainThreadNotifyToExt:]

这就是为什么很多文章都说要在-[CMessageMgr AsyncOnAddMsg:MsgWrap:]这个函数拦截消息的原因了。

接着发个红包看看消息包的内容:

mesType:49

sender:175***68824@chatroom

to:wxid_wtrsjdfy64il12

content:xia***g28:

<msg><appmsg appid=”” sdkver=””><des><![CDATA[我给你发了一个红包,赶紧去拆!]]></des><url><![CDATA[https://wxapp.tenpay.com/mmpayhb/wxhb_personalreceive?showwxpaytitle=1&msgtype=1&channelid=1&sendid=10000373012016032560109227249&ver=6&sign=3c0406fab3e5e2a2ed90be8e3da61374f54487b1c693ac55e8204cf045d78c36f8b2047dc28e667d2b9f451b319346f7565c756549d5843d2f44f89243fbf8539e09da7690ec31bbbf5c7c9cde86b3286bf0870e998fca308668b1d5fbf20f8c]]></url><type><![CDATA[2001]]></type><title><![CDATA[微信红包]]></title><thumburl><![CDATA[http://wx.gtimg.com/hongbao/img/hb.png]]></thumburl><wcpayinfo><templateid><![CDATA[7a2a165d31da7fce6dd77e05c300028a]]></templateid><url><![CDATA[https://wxapp.tenpay.com/mmpayhb/wxhb_personalreceive?showwxpaytitle=1&msgtype=1&channelid=1&sendid=10000373012016032560109227249&ver=6&sign=3c0406fab3e5e2a2ed90be8e3da61374f54487b1c693ac55e8204cf045d78c36f8b2047dc28e667d2b9f451b319346f7565c756549d5843d2f44f89243fbf8539e09da7690ec31bbbf5c7c9cde86b3286bf0870e998fca308668b1d5fbf20f8c]]></url><iconurl><![CDATA[http://wx.gtimg.com/hongbao/img/hb.png]]></iconurl><receivertitle><![CDATA[恭喜发财,大吉大利!]]></receivertitle><sendertitle><![CDATA[恭喜发财,大吉大利!]]></sendertitle><scenetext><![CDATA[微信红包]]></scenetext><senderdes><![CDATA[查看红包]]></senderdes><receiverdes><![CDATA[领取红包]]></receiverdes><nativeurl><![CDATA[wxpay://c2cbizmessagehandler/hongbao/receivehongbao?msgtype=1&channelid=1&sendid=10000373012016032560109227249&sendusername=xia***g28&ver=6&sign=3c0406fab3e5e2a2ed90be8e3da61374f54487b1c693ac55e8204cf045d78c36f8b2047dc28e667d2b9f451b319346f7565c756549d5843d2f44f89243fbf8539e09da7690ec31bbbf5c7c9cde86b3286bf0870e998fca308668b1d5fbf20f8c]]></nativeurl><sceneid><![CDATA[1002]]></sceneid><innertype><![CDATA[0]]></innertype><scenetext>微信红包</scenetext></wcpayinfo></appmsg><fromusername><![CDATA[xia***g28]]></fromusername></msg>

mesSource:<msgsource>

<silence>0</silence>

<membercount>3</membercount>

</msgsource>

4.接着分析工作:

上面已经得到了接受消息的处理函数,然后怎么自动去打开这个红包呢?

还是从领取红包的界面入手:

hookWCRedEnvelopesReceiveHomeView这个类,可以从log看到打开红包的时候调用-[WCRedEnvelopesReceiveHomeView OnOpenRedEnvelopes]这个函数:

- [<WCRedEnvelopesReceiveHomeView: 0x1656f120; frame = (0 0; 1024 768); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x14da5c40>> OnOpenRedEnvelopes]

IDA分析:

在IDA里面搜索函数:WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes

发现只有WCRedEnvelopesReceiveControlLogic这个类里面有这个函数,用IDA跟进该函数:

基本流程如下:

获取红包的消息包,得到消息包的m_oWCPayInfoItem属性,然后拿出m_c2cNativeUrl除了wxpay://c2cbizmessagehandler/hongbao/receivehongbao?的其它部分。

wxpay://c2cbizmessagehandler/hongbao/receivehongbao?msgtype=1&channelid=1&sendid=10000373012016032560109227249&sendusername=xia***g28&ver=6&sign=3c0406fab3e5e2a2ed90be8e3da61374f54487b1c693ac55e8204cf045d78c36f8b2047dc28e667d2b9f451b319346f7565c756549d5843d2f44f89243fbf8539e09da7690ec31bbbf5c7c9cde86b3286bf0870e998fca308668b1d5fbf20f8c

msgtype=1&channelid=1&sendid=10000373012016032560109227249&sendusername=xia***g28&ver=6&sign=3c0406fab3e5e2a2ed90be8e3da61374f54487b1c693ac55e8204cf045d78c36f8b2047dc28e667d2b9f451b319346f7565c756549d5843d2f44f89243fbf8539e09da7690ec31bbbf5c7c9cde86b3286bf0870e998fca308668b1d5fbf20f8c

按&拆分

{

channelid = 1;

msgtype = 1;

sendid = 10000373012016032560109227249;

sendusername = xia***g28;

sign = 3c0406fab3e5e2a2ed90be8e3da61374f54487b1c693ac55e8204cf045d78c36f8b2047dc28e667d2b9f451b319346f7565c756549d5843d2f44f89243fbf8539e09da7690ec31bbbf5c7c9cde86b3286bf0870e998fca308668b1d5fbf20f8c;

ver = 6;

}

生成字典:

{

channelId = 1;

msgType = 1;

sendId = 10000373012016032560109227249;

}

拿到个人资料:

[[[MMServiceCenter defaultCenter] getService:[CContactMgr class]] getSelfContact]

拿到昵称和头像:

getContactDisplayName

m_nsHeadImgUrl

加到字典:

{

channelId = 1;

headImg = “http://wx.qlogo.cn/mmhead/ver_1/c6Dx0qq06keVnF3LTicYUaZYVT572gsyzNzbUc7lMPanMdTAsmhhbZPHCLhM1AbAAPhibbEzCC1QEaVwguTgtqEsbichAcaNwaYDmVvmcj7eyE/132″;

msgType = 1;

nickName = “\U963f\U55b5″;

sendId = 10000373012016032560109227249;

}

获取nativeurl和当前群id加入字典:

[[[MMServiceCenter defaultCenter] getService:[MMMsgLogicManager class]] GetCurrentLogicController]

最后调用请求接口:

[[[MMServiceCenter defaultCenter] getService:[WCRedEnvelopesLogicMgr class]] OpenRedEnvelopesRequest:dic]

所以可以通过拦截消息包,然后构造请求参数,最后调用接口打开红包。

5.动手写Tweak:

先在越狱机器上进行越狱开发,后面再说怎么迁移到非越狱机器上去,新建一个Logos Tweak工程。

编写代码如下:

%hook CMessageMgr-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap {%log;if(msgWrap.m_uiMessageType == 49){CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];CBaseContact *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 addObject:nativeUrlDict[@"msgtype"] forKey:@"msgType"];[args addObject:nativeUrlDict[@"sendid"] forKey:@"sendId"];[args addObject:nativeUrlDict[@"channelid"] forKey:@"channelId"];[args addObject:[selfContact getContactDisplayName] forKey:@"nickName"];[args addObject:[selfContact m_nsHeadImgUrl] forKey:@"headImg"];[args addObject:nativeUrl forKey:@"nativeUrl"];[args addObject:msgWrap.m_nsFromUsr forKey:@"sessionUserName"];[[[%c(MMServiceCenter) defaultCenter] getService:[%c(WCRedEnvelopesLogicMgr) class]] OpenRedEnvelopesRequest:args];}}}%end

运行,发送红包,秒抢成功!

6.迁移到非越狱机器:

刚刚只是在进行越狱平台的开发,如果想把代码迁移到非越狱平台运行就继续往下看。

这篇文章也提到过这种方式 http://www.blogfshare.com/inject-with-njb.html 。

编写dylib,注入load command,重新名,运行。

这里想直接只用越狱环境编译的dylib,但是该动态库依赖于libsubstrate.dylib。

➜   otool -L WeChatTweak.dylib

WeChatTweak.dylib (architecture armv7):

/Library/MobileSubstrate/DynamicLibraries/WeChatTweak.dylib (compatibility version 1.0.0, current version 1.0.0)

/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)

原来依赖的是CydiaSubstrate,这里修改为libsubstrate.dylib。

注入动态库:

使用insert_dylib工具把自己的动态库注入到微信可执行文件。

./insert_dylib @executable_path/WechatTweak.dylib WeChat

动态库重签名:

codesign -f -s “iPhone Developer******”      ***.dylib 对动态库进行签名

然后拷贝两个动态库到可执行文件的目录下,再拷贝embedded.mobileprovision到可执行文件目录。

修改Info.plist文件的Bundle id。

编写Entitlements.plist文件:

<?xml version=”1.0″ encoding=”UTF-8″?>

<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>

<plist version=”1.0″>

<dict>

<key>com.apple.developer.team-identifier</key>

<string>>**********.</string>

<key>application-identifier</key>

<string>**********.com.codesign.demo</string>

<key>get-task-allow</key>

<true/>

</dict>

</plist>

对已经签过名的可执行文件调用ldid -e 即可获取这些信息。

重签名:

codesign -f -s “iPhone Developer:******” –entitlements  Entitlements.plist ./WeChat.app

至于微信其它的一些extension,重签名也可以,否则直接把Watch和Plugins目录删除。

打包:

xcrun -sdk iphoneos PackageApplication -v WeChat.app -o ~/WeChat.ipa

最后使用iTools安装即可。

7.调试小技巧:

新建一个ios 应用的Target,就叫WeChat。

在工程的Build Phases加入自己的脚本,完成以上的重签名操作,然后把重签名生成的WeChat.app覆盖调用上面target生成的app。

这样就是可以在自己编写的动态库里面下好断点,然后点击运行,Xcode便会自动执行脚本,完成重签名的操作,然后安装重签名后的微信,进入调试模式。

然后就可以愉快的在微信里面调试自己的动态库了~~~~

iOS安全–在非越狱平台进行越狱开发(附分析流程)相关推荐

  1. 如何分别在Android、iOS、Windows Phone三大平台进行“触摸屏”开发?

    <移动开发全平台解决方案--Android/IOS/Windows Phone> 源代码下载地址:http://www.devdiv.com/thread-85477-1-1.html 当 ...

  2. 电子商务平台支付接口开发原理及流程

    随着电子商务行业的发展,很多中小企业也加入了电子商务大军,实现电子商务非常重要的一个需求就是有一个强大的电子商务网站平台,用于对企业电子商务相关产品.服务进行管理等操作.而完成整个电子商务流程最不能越 ...

  3. 使用Jenkins搭建iOS/Android持续集成打包平台

    http://debugtalk.com/post/iOS-Android-Packing-with-Jenkins/ http://debugtalk.com/post/iOS-Android-Pa ...

  4. iOS越狱过程:越狱工具做了什么事情?( iOS系统结构、常见的二进制文件类型)

    文章目录 前言 I 什么是越狱? 1.1 越狱破坏了 iOS 系统的哪些保护机制 1.2 攻击的目标 1.3 越狱工具做的事情 II iOS系统结构 III iOS二进制文件类型 3.1 bundle ...

  5. IOS 5 拦截手机短信(需越狱)

    引用 1.手机要越狱,没有越狱的话,下面的可以不用看了!  2.IOS 要5.0以上,4.xx的同上  首先,声明下!由于公司移动开发的项目中,需要根据手机的内容进行逻辑处理,也就是要实现手机短信拦截 ...

  6. Unc0ver 8.0.0 更新:支持 iOS 14.6-14.8、A12-A13 iPhone 越狱

    今日,越狱工具 unc0ver 发布了全新的 8.0.0 版本.现在支持 iOS 14.6-14.8 版本越狱,需要搭载 A12-A13 芯片的 iPhone 手机. 本次越狱支持的系统版本:iOS ...

  7. iOS 8全系统苹果盘古完美越狱工具1.0.0版For Windows下载地址

    iOS 8全系统苹果盘古完美越狱工具1.0.0版For Windows下载地址iOS 8全系统苹果盘古完美越狱工具1.0.0版For Windows下载地址iOS 8全系统苹果盘古完美越狱工具1.0. ...

  8. 11系统越狱无法连接服务器,Electra发布iOS 11.2-11.3.1“不完美”越狱工具(附教程)...

    7月8日消息 据相关媒体报道,iOS越狱团队Electra日前发布了适用于所有iPhone.iPod touch.iPad用户的iOS 11.2-11.3.1"不完美"越狱工具.不 ...

  9. 越狱检测/越狱检测绕过

    越狱检测/越狱检测绕过--xCon 一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在app争抢装机率的环境下,是不会在乎对方的设备越狱与否的.但很显然,我忽略了一个问题,app在设计的时候或许会依 ...

最新文章

  1. 重磅推出开发者计划、App Store,赛灵思普及自适应计算的一大步
  2. 10.5 QQ 支持
  3. 中国爬虫违法违规案例汇总
  4. Java 接口interface
  5. 每天一道LeetCode-----在字符方格中查找某个单词
  6. 15.3 动态类型安全
  7. CodeForces - 987E Petr and Permutations(树状数组+逆序对定理)
  8. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
  9. Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归
  10. php伪静态是什么,php路由设置伪静态
  11. Python中的operator.itemgetter函数
  12. 学习记录——背包问题基础公式解释回顾
  13. [强烈推荐] 新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析
  14. 搜狗拼音输入法4.2_巧用搜狗快速输入特殊字符与表情字符画
  15. 京东助手+淘宝试用助手+苏宁试用助手软件
  16. 安卓dj专业打碟机软件_帮助 DJ 走出卧室,开始第一场演出
  17. padavan固件获取网络地图中的客户端状态
  18. 学计算机装什么系统,怎么看电脑装的什么系统|怎么查看安装的系统是什么版本...
  19. 深入解析车牌识别相机在互联网+加油站中的应用方案
  20. 深夜,想到今天学的linux内容,太值了

热门文章

  1. 经典SQL学习笔记 (四)-子查询
  2. 快数据如何在物联网高速公路上驱动分析
  3. java定义一个Person类
  4. eclipse 左侧导航栏不见怎么办
  5. vspython版本控制_git进行版本控制心得详谈
  6. 腾讯安全【数实融合 安全共赢】圆桌栏目,精彩来袭
  7. 个人支付宝、微信、云闪付收款
  8. 通过XtraBackup进行数据库表备份和表空间传输实例
  9. python第三方库的下载、安装与升级(包含whl,zip,tra.gz格式)
  10. MATLAB反三角函数arcsecx, arccscx, arctanx, arccotx, arcsinx, arccosx绘图表示