前言

logify是theos的一个组件,路径是:

  1. /opt/theos/bin/logify.pl

我们还是以微信红包为例子,根据[iOS Hacking]运行时分析cycript得到的入口文件:

  1. BaseMsgContentViewController.h

ssh连接手机

在Mac上打开终端,用ssh连接手机:

  1. ssh root@xx.xx.xx.xx

输入密码:

  1. alpine

关于如何连接手机,请参考我之前的[iOS HACKING入门]微信注入

获取BaseMsgContentViewController.h``中发消息方法的入參

在Mac上新建一个终端窗口,进入终端,按command+N,在新的终端窗口中,cd到桌面或者某个确定的文件夹:

  1. cd ~/Desktop

新建一个Tweak.xm文件,输入命令:

  1. touch Tweak.xm

logify

  1. /opt/theos/bin/logify ~/Desktop/Hacking/WeChat/Headers/BaseMsgContentViewController.h > ~/Desktop/Tweak.xm

前面路径是你用class-dumpdump出的头文件中目标文件的地址,关于class-dump有问题的话,可以参考我的博客:
[iOS Hacking]用class-dump获取头文件

打开生成的刚刚创建的Tweak.xm文件,可以看到刚刚的命令 hook到了这个类所有的方法,
并且在方法中注入了 log,打印了方法的入参和返回值。下面是Tweak.xm的一部分代码:

  1. %hook BaseMsgContentViewController
  2. - (void)setM_badRoomLogicController:(BadRoomLogicController *)m_badRoomLogicController { %log; %orig; }
  3. - (BadRoomLogicController *)m_badRoomLogicController { %log; BadRoomLogicController * r = %orig; HBLogDebug(@" = %@", r); return r; }
  4. - (void)setM_bIsInMainFrame:(_Bool )m_bIsInMainFrame { %log; %orig; }
  5. - (_Bool )m_bIsInMainFrame { %log; _Bool r = %orig; HBLogDebug(@" = %d", r); return r; }
  6. - (void)setM_searchScene:(int )m_searchScene { %log; %orig; }
  7. - (int )m_searchScene { %log; int r = %orig; HBLogDebug(@" = %d", r); return r; }
  8. - (void)setM_shareContacts:(NSMutableArray *)m_shareContacts { %log; %orig; }
  9. - (NSMutableArray *)m_shareContacts { %log; NSMutableArray * r = %orig; HBLogDebug(@" = %@", r); return r; }
  10. - (void)setM_msgReceivingTipsView:(UIView *)m_msgReceivingTipsView { %log; %orig; }
  11. - (UIView *)m_msgReceivingTipsView { %log; UIView * r = %orig; HBLogDebug(@" = %@", r); return r; }
  12. - (void)setGesture:(WXGesture *)gesture { %log; %orig; }
  13. - (WXGesture *)gesture { %log; WXGesture * r = %orig; HBLogDebug(@" = %@", r); return r; }
  14. - (void)setM_LockerTimer:(MMTimer *)m_LockerTimer { %log; %orig; }
  15. - (MMTimer *)m_LockerTimer { %log; MMTimer * r = %orig; HBLogDebug(@" = %@", r); return r; }
  16. - (void)setToolView:(MMInputToolView *)toolView { %log; %orig; }
  17. - (MMInputToolView *)toolView { %log; MMInputToolView * r = %orig; HBLogDebug(@" = %@", r); return r; }
  18. - (void)setM_updateTimeLabelTimer:(MMTimer *)m_updateTimeLabelTimer { %log; %orig; }
  19. - (MMTimer *)m_updateTimeLabelTimer { %log; MMTimer * r = %orig; HBLogDebug(@" = %@", r); return r; }
  20. - (void)setM_backgroundThreadDelegate:(__weak id <BaseMsgContentInBackgroundThreadDelgate> )m_backgroundThreadDelegate { %log; %orig; }
  21. - (__weak id <BaseMsgContentInBackgroundThreadDelgate> )m_backgroundThreadDelegate { %log; __weak id <BaseMsgContentInBackgroundThreadDelgate> r = %orig; HBLogDebug(@" = 0x%x", (unsigned int)r); return r; }
  22. - (void)setM_delegate:(__weak id <BaseMsgContentDelgate> )m_delegate { %log; %orig; }
  23. - (__weak id <BaseMsgContentDelgate> )m_delegate { %log; __weak id <BaseMsgContentDelgate> r = %orig; HBLogDebug(@" = 0x%x", (unsigned int)r); return r; }

具体来分析一句:

  1. - (_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文件:

  1. ~/Desktop/Hacking/WeChat/Headers/BaseMsgContentViewController.h > ~/Desktop/Tweak.x

查看手机日志

安装上一步的deb项目后,手机连Mac,打开Xcode,然后查看设备控制台:

  1. Xcode->Window->Devices
 
 

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

 
 

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

 
 

打开控制台:

 
 

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

 
 

分析日志:

将上一步控制台的日志,全选,粘贴在文本编辑器中,便于分析。
分析发现,有一个方法接收消息的方法被调用了:

  1. addMessageNode: layout: addMoreMsg:

并且就连方法的入参也一起被打印出来了:

 
 

分析一下参数:
addMessageNode对应的参数是一些键值对:

  1. {
  2. m_uiMesLocalID=26,
  3. m_ui64MesSvrID=3286135181021621546,
  4. m_nsFromUsr=7820056698@chatroom,
  5. m_nsToUsr=av*or~6,
  6. m_uiStatus=4,
  7. type=1,
  8. msgSource="<msgsource>
  9. <silence>0</silence>
  10. <membercount>3</membercount>
  11. </msgsource>"
  12. }

其中type是消息类型,我们用别的手机在这个群里发一个红包,查看控制到日志,找到红包消息的type是:49

 
 

layout:对应的参数是BOOL类型,值为YES
addMoreMsg:对应的参数也是BOOL类型,值为NO
至此,我们已经锁定了注入入口函数:

  1. addMessageNode: layout: addMoreMsg:

但是,这个不是我们真正要hook的函数!
因为,如果在群聊界面BaseMsgContentViewController中hook这个接收消息的函数,会存在很大的局限性:

只有进入到群聊界面才能抢红包

为了在聊天列表界面也能抢到红包,接下来再做更加深入的探究。
请关注我的[iOS Hacking]系列文章,将会不定期更新!

  1.  
  2. 作者:CGPointZero
    链接:https://www.jianshu.com/p/582edd6e4805
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[iOS Reverse]logify日志追踪,锁定注入口-控制台查看的更多相关文章

  1. 【转】iOS应用崩溃日志分析

    作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...

  2. logstash搭建日志追踪系统

    前言 开始博客之前,首先说下10月份没写博客的原因 = =. 10月份赶上国庆,回了趟老家休息了下,回来后自己工作内容发生了点改变,开始搞一些小架构的东西以及研究一些新鲜东西,当时我听到这个消息真的是 ...

  3. iOS应用崩溃日志分析

    转自raywenderlich   作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应 ...

  4. 【转】iOS应用崩溃日志揭秘

    这篇文章还可以在这里找到 英语 If you're new here, you may want to subscribe to my RSS feed or follow me on Twitter ...

  5. 循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置

    日志,是软件运行过程中,对各类操作中重要信息的记录. 日志跟踪,不管对于怎么样的项目来说,都是非常重要的一部分,它关系到项目后期的维护和排错,起着举足轻重的作用.项目开发过程中,对日志的记录规则,也将 ...

  6. iOS获取崩溃日志

    重要提示:  此文档不再更新.有关Apple SDK的最新信息,请访问文档网站. 来源: https://developer.apple.com/library/archive/qa/qa1747/_ ...

  7. iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)

    CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.XcodeColors是用于控制台着色的工具,配合着CocoaLumberjack用有更好的效果,不废话, ...

  8. iOS应用崩溃日志揭秘

    这篇文章还可以在这里找到 英语 Learn how to make sense of crash logs! 本文作者是 Soheil Moayedi Azarpour, 他是一名独立iOS开发者. ...

  9. 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 ...

随机推荐

  1. Android第三方文件选择器:aFileChooser

     Android第三方文件选择器:aFileChooser aFileChooser是Android平台上的一个第三方文件选择器,其在github上的项目主页是:https://github.co ...

  2. Spring MVC-控制器(Controller)-多动作控制器(Multi Action Controller)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_multiactioncontroller.htm 说明:示例基于Spring M ...

  3. [E2E] Visual Differing Tests with Puppeteer and PixelMatch

    Take your end to end tests to the next level by comparing your current application's view with an al ...

  4. matlab中怎样加入凝视

    1)方法一 选中你要加凝视的内容,然后选择工具菜单"text|comment"就能够了,假设要把凝视变为语句,相同选中要转变的语句,然后用鼠标选择"text|uncomm ...

  5. 《Google 软件测试之道》摘录

    最近刚刚看完<Google 软件测试之道>,受益颇多,遂记录下: 只有在软件产品变得重要的时候质量才显得重要 第一章:谷歌软件测试介绍 角色介绍 SWE(Software Engineer ...

  6. Android+Jquery Mobile学习系列(8)-保单/生日提醒功能

    其实这个App基本功能早已做完,并且交给老婆试用去了.但由于最近项目要保证稳定,所以持续加班,没有时间写最后一点内容,本节也就简单截图做个说明,不详细叙述实现方式.我会把代码上传到最后一章中,有兴趣的 ...

  7. 比较两个Json对象是否相等

    一个前端同事遇到的面试题,抽空写了写,也算是个积累 1.先准备三个工具方法,用于判断是否是对象类型,是否是数组,获取对象长度 function isObj(object) { return objec ...

  8. Js:弹窗剧中

    js变量设置 var iWidth = $(window).width() * 0.9; var iHeight = $(window).height() * 0.9; - iHeight) / ; ...

  9. angular的directive指令的link方法

    比如 指令标签 <mylink myLoad="try()"></mylink> link:function(scope,element,attr){ el ...

  10. 常用的 Maven 命令

    maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下. -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试: -P 指定 ...