• [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-dumpdump出的头文件中目标文件的地址,关于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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    git基本操作及设置
    5-13 多页面打包配置
    笔记待整理
    单例模式在多线程下的多种实现模式
    面试题小练习1106
    求两个字符串的最大共有子串
    单例模式
    静态初始化一个二维数组并将二维数组排序并输出
    java中数组的基本知识
    关于break语句如何结束多重循环的嵌套
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8178485.html
Copyright © 2020-2023  润新知