iOS逆向教程之logify跟踪方法的调用
前言
根据上一篇文章的介绍,我们将App的头文件使用 class-dump 导出后,然后利用 theos 创建逆向的工程,编写 hook 的代码,从而达到修改某些功能的目的。但是有时候某些功能具体调用哪个方法我们不好定位,这时候就用到了 logify 来跟踪函数调用,从而定位到我们需要的函数。
logify 是 theos 的一个组件,logify 可以将一个头文件快速转换成已经包含打印信息的xm文件。当然如果某个类中的方法很少,你完全可以自己手动添加 NSLog 的打印信息,但是某个文件中的方法很多的时候,收到给每个方法添加日志信息,会浪费很多很多时间,logify 便是一个不错的工具。
logify是theos的一个组件,路径是:
/opt/theos/bin/logify.pl
我们以微信的聊天界面为例,假如在当前界面我收到红包消息的时候,我想确定是响应了哪个方法,方便分析抢红包的后续操作。
步骤
我们利用 Reveal 确定出了群聊界面的控制器名称为 BaseMsgContentViewController 并且利用 class-dump 将头文件导出,这个类中的方法特别多,接下来我们利用 logify 把该文件快速转换成已经包含打印信息的xm文件。
// 导出已添加日志信息的xm文件 logify.pl BaseMsgContentViewController.h > Tweak.xm
然后创建 theos工程,用我们刚才生成的 Tweak 替换刚才创建的 theos 项目的Tweak.xm。然后重新编译打包安装。
错误解决
logify.pl 生产的xm文件,有很多时候是编译不通过的,需要进行一些处理。
- 删除 __weak
- 删除 inout
- 删除协议 ,或者在头部声明一下协议,@protocol XXXDelegate
- 删除 HBLogDebug(@" = 0x%x", (unsigned int)r)
- 替换类名为 void * ,比如将 XXPerson * 替换为 void * 因为都是指针类型。或者在头部声明一下,@class XXPerson
根据自己编译的时候报的具体错误,进行适当的修改即可。
日志查看
theos 工程重新打包安装成功后,重新打开微信的聊天界面,然后打开 Xcode -> Window -> Devices and Simulators 即可跟踪方法的调用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
相关推荐
-
汇总ios开发逆向传值的方法
iOS的逆向传值有很多种方法,下面来总结几种常用的传值方式(只贴相关代码): 第一种:代理传值 第二个控制器: @protocol WJSecondViewControllerDelegate <NSObject> - (void)changeText:(NSString*)text; @end @property(nonatomic,assign)id<WJSecondViewControllerDelegate>delegate; - (IBAction)buttonClick
-
ARM汇编逆向iOS 实战
我们先讲一些ARM汇编的基础知识.(我们以ARMV7为例,最新iPhone5s上的64位暂不讨论) 基础知识部分: 首先你介绍一下寄存器: R0-R3:用于函数参数及返回值的传递 R4-R6, R8,R10-R11:没有特殊规定,就是普通的通用寄存器 R7:栈帧指针(Frame Pointer).指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的地址. R9:操作系统保留 R12:又叫IP(intra-procedure scratch),
-
iOS逆向教程之动态调试详解
前言 有时候想更了解别人App的调用流程,就需要在App运行的时候进行动态调试.动态调试指的是将程序运行起来,通过下断点.打印等方式,查看参数.返回值.函数调用流程等. 下面话不多说了,来随着小编一起看看详细的介绍吧 Xcode的动态调试原理 首先了解一下 Xcode 编译和调试器的发展.Xcode 中的编译器发展历程:GCC -> LLVM,调试器的发展历程:GDB -> LLDB . Xcode 调试安装到手机上的应用的原理:Xcode 通过 LLDB 调试器把调试指令发送到手机上的 de
-
iOS通过逆向理解Block的内存模型
前言 正常情况下,通过分析界面以及 class-dump 出来头文件就能对某个功能的实现猜个八九不离十.但是 Block 这种特殊的类型在头文件中是看不出它的声明的,一些有 Block 回调的方法名 dump 出来是类似这样的: - (void)FM_GetSubscribeList:(long long)arg1 pageSize:(long long)arg2 callBack:(CDUnknownBlockType)arg3; 因为这种回调看不到它的方法签名,我们无法知道这个 Block
-
揭开iOS逆向解密的神秘面纱
前言 学习和了解逆向工程,可以帮助我们分析竞品和自己喜欢的APP的开发架构和某些功能的大体实现思路,也可以自己手动对其它APP大刀阔斧进行二次加工,满足自己的需求. 学习iOS逆向一段时间了,这里简单做个总结,揭开iOS逆向的神秘面纱. Mac远程登录iPhone iOS和Mac OS X都是基于Darwin(苹果的一个基于Unix的开源系统内核),所以iOS中同样支持终端的命令行操作. 在逆向工程中,我们经常会通过命令行来操纵iPhone.为了能够让Mac终端中的命令行能作用在iPhone上,
-
iOS通过代理逆向传值的方式详解
前言 在iOS开发中,常见的几种逆向传值方式,有代理(delegate).通知(NSNotification),block等等,本文就给大家分析下,如何理解和快速上手代理模式,并以一个简单的逆向传值为案例,看看代理模式是不是很难. 一.代理模式中的几个概念 讲代理模式之前,首先需要弄清楚两个概念:被代理对象和代理对象.并且需要知道它们之间是靠协议关连起来的. 1.被代理对象 被代理对象往往就是真正有做事意图的那个对象,比如卖房子案例中的想卖房子的房主,保姆婴儿案例中想喝奶的婴儿.但是它们自己做不
-
iOS逆向教程之跟踪函数调用详解
前言 今天学习的是跟踪函数调用,什么意思呢,举个例子,如果想做一个微信自动抢红包的插件,就需要写这么一个功能,当红包来了的时候,自动触发微信的抢红包函数.好,那咱就先找到这个函数. 映射端口 $ sh usb.sh Forwarding local port 10001 to remote port 22 Incoming connection to 10001 另起一终端登录 $ sh login.sh 找到微信安装路径 ps -A|grep mobile 8636 ?? 0:35.91 /v
-
iOS利用Block逆向传值的方式详解
前言 在iOS通过代理逆向传值的方式详解一文中,分析了如何利用代理模式来逆向传值,其实还有一些其他的方式,如通知.Block等,相比较代理,我个人认为反而要简单些,但是需要处理好细节问题,如Block循环引用.还是用前文的案例,本次使用Block来实现,Block的基本知识本文不再赘述. 一.书写规范 Block传值,需要注意的是,谁传值就需要定义Block,捕获方仅仅需要传递Block给传值方,并处理捕获的值. 传值方 1.定义Block用于传值 2.声明一个上述Block属性,这个属性的具体
-
iOS逆向教程之logify跟踪方法的调用
前言 根据上一篇文章的介绍,我们将App的头文件使用 class-dump 导出后,然后利用 theos 创建逆向的工程,编写 hook 的代码,从而达到修改某些功能的目的.但是有时候某些功能具体调用哪个方法我们不好定位,这时候就用到了 logify 来跟踪函数调用,从而定位到我们需要的函数. logify 是 theos 的一个组件,logify 可以将一个头文件快速转换成已经包含打印信息的xm文件.当然如果某个类中的方法很少,你完全可以自己手动添加 NSLog 的打印信息,但是某个文件中的方
-
iOS逆向工程之Hopper中的ARM指令详解
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的.虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢.ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些.当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自
-
iOS开发教程之APP内部切换语言的实现方法
前言 相信大家在iOS开发中都遇到了一个问题,随着APP越来越完善,很多APP都做了国际化,也实现了APP内部切换语言.那么如何实现的呢?下面来一起看看详细的介绍吧 原理 国际化都会走到NSBundle的- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName方法,使用自定义Bundle替换NSBundle,通过
-
iOS开发教程之XLForm的基本使用方法
前言 在iOS开发中,开发"表单"界面,字段稍微多一点的一般都用UITableView来做,而XLForm就是这样一个框架,它是创建动态表格视图最牛逼的iOS库, 用它实现表单功能,非常简单,省心省力.但是很可惜,搜索了很多文章都只是翻译官方文档,很多人在使用该库的时候可能都被官方文档带走远了,不知道如何具体使用.正好最近也要用到这个库,所以写个入门使用文章供大家参考. 以下是这个库一个简单的结构图: 一. 导入项目 使用CocoaPods或者手动导入库文件,本人选择直接导入项目源文件
-
iOS开发教程之Status Bar状态栏设置的方法汇总
前言 我们在很多app中可以看到不同与导航栏的状态栏的颜色,比如下面: 状态栏 个人觉得 iOS 的 Status Bar 状态栏也是一个比较坑的地方,所以还是写一个总结,有遇到这方面问题的朋友可以看一下. 下面话不多说了,来随着小编一起学习学习吧 Status Bar 状态栏的隐藏 1. 通过设置 Info.plist 文件实现状态栏的全局隐藏 在 Info.plist 文件中添加 Status bar is initially hidden 设置为 YES ,这个是隐藏 App 在 Lunc
-
iOS实用教程之Https双向认证详解
前言 年前的时候,关于苹果要强制https的传言四起,虽然结果只是一个"谣言",但是很明显的这是迟早会到来的,间接上加速了各公司加紧上https的节奏,对于iOS客户端来说,上https需不需要改变一些东西取决于---------对,就是公司有没有钱.土豪公司直接买买买,iOS开发者只需要把http改成https完事.然而很不幸,我们在没钱的公司,选择了自签证书.虽然网上很多关于https的适配,然而很多都是已过时的,这里我们主要是讲一下https双向认证. [证书选择]自签 [网络请
-
iOS开发教程之UIView和UIViewController的生命周期详解
前言 iOS开发中,创建View常见的两种方式一个是纯代码,一个是借助于XIB:创建ViewController常见的也有两种方式一个是纯代码,一个是借助于StoryBoard. 通过交流我发现很多童鞋对这些概念都很模糊,于是通过实验写一篇博客供参考. 重写View的如下方法 @implementation YFView -(instancetype)init{ self = [super init]; NSLog(@"%s", __func__); return self; } -(
-
iOS开发教程之WKWebView与JS的交互
前言 iOS8以后,Apple公司推出了WKWebView,对比之前的UIWebView不论是处理速度还是内存性能,都有了大幅度的提升! 那么下面我就分享一下WKWebView与JS的交互. 首先使用WKWebView.你需要导入WebKit #import 然后初始化一个WKWebView,设置代理,并且执行代理的方法.在网页加载成功的时候,我们会调用一些JS代码对网页进行设置. WKWebView的代理一共有三个:WKUIDelegate,WKNavigationDelegate,WKScr
-
iOS开发教程之UIRefreshControl使用的踩坑指南
iOS UIRefreshControl基本用法 - (void) loadRefreshView { // 下拉刷新 _refreshControl = [[UIRefreshControl alloc] init]; _refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"]; [_refreshControl addTarget:self action:@selecto
-
IOS开发教程之put上传文件的服务器的配置及实例分享
1,HTTP常见的方法 GET 获取指定资源 POST 2M 向指定资源提交数据进行处理请求,在RESTful风格中用于新增资源 HEAD 获取指定资源头部信息PUT 替换指定资源(不支持浏览器操作)DELETE 删除指定资源 2,配置服务器的put请求方式: 复制代码 代码如下: 1> n 打开终端p cd /etc/apache2p sudo vim httpd.conf n 在vim中输入p /httpd-dav.conf• 查找httpd-dav.confp 按0将光标移动至行首 p 按
随机推荐
- Spring中的事务管理实例详解
- JDBC连接Sql Server 2005总结
- 使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
- Java中构造、生成XML简明教程
- 解决Oracle批量修改问题
- 初学Python函数的笔记整理
- Android应用读取Excel文件的方法
- Grow heap (frag case) 堆内存过大的深入解析
- 浅析MySQL内存的使用说明(全局缓存+线程缓存)
- 详解原生JavaScript实现jQuery中AJAX处理的方法
- 如何判断用户是否非正常离开聊天室?
- javascript日期格式化方法小结
- 解决ASP(图像)上传漏洞的方法
- JavaScript登录验证基础教程
- JavaScript编程中容易出BUG的几点小知识
- 探索PowerShell(十四) 使用WMI对象的方法
- PowerShell命令中包含空格如何运行?
- js格式化时间小结
- Android自定义view实现圆形、圆角和椭圆图片(BitmapShader图形渲染)
- JavaScript forEach()遍历函数使用及介绍