[iOS Reverse]logify日志追踪,锁定注入口-控制台查看
前言
logify是theos的一个组件,路径是:
/opt/theos/bin/logify.pl
我们还是以微信红包为例子,根据[iOS Hacking]运行时分析cycript得到的入口文件:
BaseMsgContentViewController.h
ssh连接手机
在Mac上打开终端,用ssh连接手机:
ssh root@xx.xx.xx.xx
输入密码:
alpine
关于如何连接手机,请参考我之前的[iOS HACKING入门]微信注入。
获取BaseMsgContentViewController.h``中发消息方法的入參
在Mac上新建一个终端窗口,进入终端,按command+N
,在新的终端窗口中,cd到桌面或者某个确定的文件夹:
cd ~/Desktop
新建一个Tweak.xm
文件,输入命令:
touch Tweak.xm
logify
/opt/theos/bin/logify ~/Desktop/Hacking/WeChat/Headers/BaseMsgContentViewController.h > ~/Desktop/Tweak.xm
前面路径是你用class-dump
dump出的头文件中目标文件的地址,关于class-dump
有问题的话,可以参考我的博客:
[iOS Hacking]用class-dump获取头文件
打开生成的刚刚创建的Tweak.xm
文件,可以看到刚刚的命令 hook到了这个类所有的方法,
并且在方法中注入了 log,打印了方法的入参和返回值。下面是Tweak.xm的一部分代码:
%hook BaseMsgContentViewController
- (void)setM_badRoomLogicController:(BadRoomLogicController *)m_badRoomLogicController { %log; %orig; }
- (BadRoomLogicController *)m_badRoomLogicController { %log; BadRoomLogicController * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setM_bIsInMainFrame:(_Bool )m_bIsInMainFrame { %log; %orig; }
- (_Bool )m_bIsInMainFrame { %log; _Bool r = %orig; HBLogDebug(@" = %d", r); return r; }
- (void)setM_searchScene:(int )m_searchScene { %log; %orig; }
- (int )m_searchScene { %log; int r = %orig; HBLogDebug(@" = %d", r); return r; }
- (void)setM_shareContacts:(NSMutableArray *)m_shareContacts { %log; %orig; }
- (NSMutableArray *)m_shareContacts { %log; NSMutableArray * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setM_msgReceivingTipsView:(UIView *)m_msgReceivingTipsView { %log; %orig; }
- (UIView *)m_msgReceivingTipsView { %log; UIView * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setGesture:(WXGesture *)gesture { %log; %orig; }
- (WXGesture *)gesture { %log; WXGesture * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setM_LockerTimer:(MMTimer *)m_LockerTimer { %log; %orig; }
- (MMTimer *)m_LockerTimer { %log; MMTimer * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setToolView:(MMInputToolView *)toolView { %log; %orig; }
- (MMInputToolView *)toolView { %log; MMInputToolView * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setM_updateTimeLabelTimer:(MMTimer *)m_updateTimeLabelTimer { %log; %orig; }
- (MMTimer *)m_updateTimeLabelTimer { %log; MMTimer * r = %orig; HBLogDebug(@" = %@", r); return r; }
- (void)setM_backgroundThreadDelegate:(__weak id <BaseMsgContentInBackgroundThreadDelgate> )m_backgroundThreadDelegate { %log; %orig; }
- (__weak id <BaseMsgContentInBackgroundThreadDelgate> )m_backgroundThreadDelegate { %log; __weak id <BaseMsgContentInBackgroundThreadDelgate> r = %orig; HBLogDebug(@" = 0x%x", (unsigned int)r); return r; }
- (void)setM_delegate:(__weak id <BaseMsgContentDelgate> )m_delegate { %log; %orig; }
- (__weak id <BaseMsgContentDelgate> )m_delegate { %log; __weak id <BaseMsgContentDelgate> r = %orig; HBLogDebug(@" = 0x%x", (unsigned int)r); return r; }
具体来分析一句:
- (_Bool )m_bIsInMainFrame { %log; _Bool r = %orig; HBLogDebug(@" = %d", r); return r; }
其中%log; _Bool r = %orig;
表示打印函数的返回值;
r=%orig;
表示r=执行原来的代码得到的返回值。
将hook到的Tweak.xm
打包成.deb
文件安装到手机
在Mac终端中新建一个deb项目,将hook到的这个Tweak.xm
文件,替换这个新deb项目中的Tweak.xm
文件。
然后用theos
打包并安装到手机中。
关于,如何用thoes
打包并安装到手机,请参考我的博客:[iOS HACKING入门]微信注入
注意在打包的时候,可能会出现找不到某个类的提示,这个时候,只需要把这个类从dump出来目标头文件中删除即可,然后重新生成Tweak.xm文件:
~/Desktop/Hacking/WeChat/Headers/BaseMsgContentViewController.h > ~/Desktop/Tweak.x
查看手机日志
安装上一步的deb项目后,手机连Mac,打开Xcode,然后查看设备控制台:
Xcode->Window->Devices

进入设备界面,选择刚刚安装了上一步deb包的设备:

点击左下个的那个箭头,打开日志控制台:

打开控制台:

打开微信,进入群聊界面,用另一个手机在这个群里发送一条消息,再次向群里发消息观察手机控制台输出。
可以看到打印了很多东西,这就是刚刚hook出的头文件,在里面注入了NSLog
,打印了方法的入参以及返回值:

分析日志:
将上一步控制台的日志,全选,粘贴在文本编辑器中,便于分析。
分析发现,有一个方法接收消息的方法被调用了:
addMessageNode: layout: addMoreMsg:
并且就连方法的入参也一起被打印出来了:

分析一下参数:
addMessageNode
对应的参数是一些键值对:
{
m_uiMesLocalID=26,
m_ui64MesSvrID=3286135181021621546,
m_nsFromUsr=7820056698@chatroom,
m_nsToUsr=av*or~6,
m_uiStatus=4,
type=1,
msgSource="<msgsource>
<silence>0</silence>
<membercount>3</membercount>
</msgsource>"
}
其中type
是消息类型,我们用别的手机在这个群里发一个红包,查看控制到日志,找到红包消息的type是:49

layout
:对应的参数是BOOL
类型,值为YES
;
addMoreMsg
:对应的参数也是BOOL
类型,值为NO
;
至此,我们已经锁定了注入入口函数:
addMessageNode: layout: addMoreMsg:
但是,这个不是我们真正要hook的函数!
因为,如果在群聊界面BaseMsgContentViewController
中hook这个接收消息的函数,会存在很大的局限性:
只有进入到群聊界面才能抢红包
为了在聊天列表界面也能抢到红包,接下来再做更加深入的探究。
请关注我的[iOS Hacking]系列文章,将会不定期更新!
作者:CGPointZero
链接:https://www.jianshu.com/p/582edd6e4805
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
[iOS Reverse]logify日志追踪,锁定注入口-控制台查看的更多相关文章
- 【转】iOS应用崩溃日志分析
作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...
- logstash搭建日志追踪系统
前言 开始博客之前,首先说下10月份没写博客的原因 = =. 10月份赶上国庆,回了趟老家休息了下,回来后自己工作内容发生了点改变,开始搞一些小架构的东西以及研究一些新鲜东西,当时我听到这个消息真的是 ...
- iOS应用崩溃日志分析
转自raywenderlich 作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应 ...
- 【转】iOS应用崩溃日志揭秘
这篇文章还可以在这里找到 英语 If you're new here, you may want to subscribe to my RSS feed or follow me on Twitter ...
- 循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置
日志,是软件运行过程中,对各类操作中重要信息的记录. 日志跟踪,不管对于怎么样的项目来说,都是非常重要的一部分,它关系到项目后期的维护和排错,起着举足轻重的作用.项目开发过程中,对日志的记录规则,也将 ...
- iOS获取崩溃日志
重要提示: 此文档不再更新.有关Apple SDK的最新信息,请访问文档网站. 来源: https://developer.apple.com/library/archive/qa/qa1747/_ ...
- iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)
CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.XcodeColors是用于控制台着色的工具,配合着CocoaLumberjack用有更好的效果,不废话, ...
- iOS应用崩溃日志揭秘
这篇文章还可以在这里找到 英语 Learn how to make sense of crash logs! 本文作者是 Soheil Moayedi Azarpour, 他是一名独立iOS开发者. ...
- iOS应用崩溃日志分析 iOS应用崩溃日志揭秘
转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF ...
随机推荐
- Java基础学习总结(74)——Java常见笔试题及答案汇总
1. 下面哪些是合法的标识符?(ABE )--标识符 A. $persons B. TwoUsers C. *point D. this E. _endline 2. 下面程序运行的结果是( D )- ...
- js两个整数之间求和
const GetSum = (a, b) => { let min = Math.min(a, b), max = Math.max(a, b); return (max - min + 1) ...
- 使用javacv注意点
由于Android开发需要,使用JavaCV,一开始我配置windows上的Javacv,发现总是出问题,说找不到dll文件.最终发现Opencv库必须解压在C盘根目录下才行. 这个有点坑爹,另外要注 ...
- webpack教程——css的加载
首先要安装css的loader npm install css-loader style-loader --save-dev 然后在webpack.config.js中配置如下代码 意思是先用css- ...
- HDU 4514
真是神奇,G++TLE,C++500MS... 判环有一个图论知识就是,m>=n时必有环.如果以m的范围建图,会MLE. 然后,利用拓扑排序再来判定是否有环,因为有些景点可能是孤立的.同时,在拓 ...
- zoj2676 Network Wars(0-1分数规划,最大流模板)
Network Wars 07年胡伯涛的论文上的题:http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html 代码: #include < ...
- MySQL命令行登陆
环境介绍 OS:CentOS6.X & Win2003 & Win2008 MySQL版本号:5.5.x 除了经常使用的MySQL管理工具,还有MySQLclient命令行工具经常被用 ...
- [NetworkFlow]网络流建模相关
流 网络流问题本质上是线性规划问题的应用之中的一个,线性规划问题的标准形式是给出一组等式约束和不等式约束.要求最优化一个线性函数. 在流问题中,变量以流量的形式出如今问题中,我们给出一个流网络(以有向 ...
- luogu2152 [SDOI2009]SuperGCD
要你求两个非常大的数字的GCD. 不要想复杂,用高精度整更相减损术即可. #include <cstdio> #include <cstring> #include <a ...
- Android和H5交互-基础篇
hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的.Android中是如何和H5交互的? 1.webView加载页面 我们都知道在Android中是通过webV ...