iOS逆向教程之动态调试详解

前言

有时候想更了解别人App的调用流程,就需要在App运行的时候进行动态调试。动态调试指的是将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等。

下面话不多说了,来随着小编一起看看详细的介绍吧

Xcode的动态调试原理

首先了解一下 Xcode 编译和调试器的发展。Xcode 中的编译器发展历程:GCC -> LLVM,调试器的发展历程:GDB -> LLDB 。

Xcode 调试安装到手机上的应用的原理:Xcode 通过 LLDB 调试器把调试指令发送到手机上的 debugserver, debugserver 再与相应的 APP 进行交互,达到调试的效果。

debugserver 一开始是存放在Mac的Xcode里面,路径:

/Applications/Xcode.app/Contents/Developer/Platforms
/iPhoneOS.platform/DeviceSupport
/9.1/DeveloperDiskImage.dmg
/usr/bin/debugserver

当 Xcode 识别到手机设备时,Xcode 会自动将 debugserver 安装到手机上。

Xcode 调试的局限性:一般情况下,只能调试通过 Xcode 安装的APP,无法调试其它APP。

给debugserver赋予权限

默认情况下 /Developer/usr/bin/debugserver 缺少一定的权限,只能调试通过Xcode安装的App,如果希望调试其它App,需要对 debugserver 重新签名,签上可以调试其它App的权限。

需要的两个权限为:get-task-allow 和 task_for_pid-allow

iPhone上的 /Developer 目录是只读的,无法直接对 /Developer/usr/bin/debugserver 文件签名,需要先把 debugserver 复制到Mac。

通过 ldid 命令导出文件以前的签名权限:

$ ldid -e debugserver > debugserver.entitlements

debugserver.entitlements 这个文件其实是个 plist 文件,在这个文件中加上上面提到的两个权限后,再通过 ldid 命令对文件重新签名。

$ ldid -Sdebugserver.entitlements debugserver

然后将已经签好权限的 debugserver 放到 /usr/bin 目录,便于找到 debugserver 指令。

debugserver附加到某个APP进程

$ debugserver *:端口号 -a 进程
  • *:端口号:使用iPhone的某个端口启动debugserver服务(不是保留端口)
  • -a进程:输入APP的进程信息(进程ID或者进程名称)

Mac远程连接iPhone上的debugserver服务

启动LLDB:

// 在终端输入
$ lldb

连接debugserver服务

(lldb) process connect connect://手机IP地址:debugserver服务端口号

使用LLDB的c命令让程序先继续运行

(lldb) c

到此,就可以远程调试别人的App了。

常用的LLDB指令

给ViewController的test方法设置断点

breakpoint set -n "-[ViewController test]"

查看指令用户使用 help 指令: help breakpoint 等。

打印线程的堆栈信息: thread backtrace

很多命令不在这里赘述,请参考:http://lldb.llvm.org/lldb-gdb.html

ASLR

获取 ASLR 的偏移量:

image list -o -f

打印结果的第二列前面的地址就是我们需要的 ASLR 的偏移量offset。

假如我们想给某个类中的test方法添加断点,那么通过 Hooper 工具找到该方法的第一个内存地址,假如为0x010101,然后地址加上我们得到的 ASLR 的偏移量就是该方法的实际地址。然后通过该地址给方法下断点。

breakpoint set -o 0x010101+offset

到此就给该方法添加了断点,之后当程序调用该方法的时候,会停在该断点出。

结语

练习 lldb 的各种指令时,推荐先在 Xcode 上练习各种用法,因为会有提示和直观的输出结果,更容易我们理解。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 基于ios逆向过程中lldb调试技巧(推荐)

    假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器.假如你正在使用老一点版本的xcode的话,你又GDB调试器.他们有一些基本的相同的命令,因此假如你的xcode使用的是"(gdb)"提示,而不是"(lldb)"提示的话,你也能够更随一起做,而没有问题. "po"命令是"print object&qu

  • iOS中CPU线程调试的高级技巧分享

    前言 最近在开发直播,发现CPU性能被打满后导致CPU降频,发热严重,然后卡顿- 为了定位这个问题我们花费了至少 3天的时间 一点一点跟踪CPU的线程代码,当遇到C++的thread的时候没有符号表,只能看见一坨对象地址,除此以外连个方法名都没有的时候真是手足无措.本篇介绍一个高级调试 方法,使用符号表和相关 指令寻踪 相关代码调用,写的不好 大佬们请轻喷.代码相关过程感谢同事 陈豪的大力支持. Talk is cheap show me the code 我们的实现思路是找到动态库的首地址调用

  • IOS Xcode调试常用命令和断点整理

    IOS Xcode调试常用命令和断点 Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令.而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧. 调试命令 在上图中,右侧绿色区域就是Log 输出区,在 Log 输出区可以使用一些命令,来辅助调试. 那有哪些调试命令呢? 想要看所有的调试命令,可以在上图的右侧区域输入help,就会列出所有的调试命令. 本文就介绍几个使用频率比较高的,其他就查看后,自行了解

  • 详解Xcode 9 设置 iOS无线真机调试

    本篇文章主要介绍了Xcode 9 设置 iOS无线真机调试,分享给大家,具体如下: 环境要求: 至少Mac OSX 10.12.6 iOS 11 Xcode 9 第一种情况 在笔者写作之前,Mac 和 iPhone 通过wifi连接的是同一个路由器,也即同一个局域网,这种情况需要的操作相对简单. 接下来进行操作: 1. "自己的工程" -> windows -> Device and Simulators ,打开设备和模拟器界面 Device and Simulators

  • iOS常用调试方法之静态分析详解

    前言 在iOS项目开发过程中,常用到静态分析(Analyze).断点(BreakPoint)和控制台(Console)进行代码调试.本篇文章介绍Xcode常用调试方法之"静态分析". 本文来自360奇舞团QiShare团队投稿. 一.简介 Xcode的静态分析功能是在程序未运行的情况下,对代码的上下文语义.语法.和内存情况进行分析,可以检测出代码潜在的文本本地化问题(Localizability Issue).逻辑问题(Logic error).内存问题(Memery error).数

  • iOS开发中如何优雅的调试数据库详解

    背景 写代码难免出现bug. 储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.相信大家应该都有所体会,我们在开发的时候,数据库的操作一直是一个很棘手的问题,后来发现Android下面有一个第三方的库还挺好用的,就模仿它搞了个iOS的,可以方便的通过浏览器查看.添加.删除.修改数据库.下面话不多说了,来一看看详细的介绍吧. 历史状况 我们来回想一下调试的过程: 如果在模拟器中调试: 找到模拟器应用中数据库的文件位置 拷回到一个比较方便打开的地方 安装一个数据库操作软件 打开数据库文件 s

  • iOS 真机调试微信小程序

    平时开发小程序可以在开发者工具中进行调试,开发者工具提供了类似 Chrome DevTools 的调试面板,对于前端开发者来说入门门槛比较低. 小程序开发完成之后,我们需要在真机上进行测试,真机调试方面小程序开发者工具有预览.远程调试和设置体验版本三大部分功能.除了这三种方式之外,我们还可以使用真机远程调试,在 iOS 上可以通过实现 Safari 调试代码,安卓中可以安装 X5 内核的 inspect 版本,开启 Chrome remote debug 模式.使用真机调试不仅可以发现开发者工具

  • 详解使用Xcode进行iOS设备无线调试

    设备环境:Mac OSX 10.12.5.iOS11.Xcode9 PS:这是WWDC2017的新功能,iOS11以上,Xcode9这是刚性要求.这个功能不好找,就记下来了 手机连接上Xcode,打开Xcode菜单:Windows->Device and Simulators.找到连接上的设备,把Connect via network选项打勾. 之后Xcode将会转一会圈圈,耐心等待一会就成功了,此时拔掉数据线,可以看到左侧的设备连接列表上手机仍在. 运行我们的项目,在设备列表中不出意外会看到我

  • iOS逆向教程之动态调试详解

    前言 有时候想更了解别人App的调用流程,就需要在App运行的时候进行动态调试.动态调试指的是将程序运行起来,通过下断点.打印等方式,查看参数.返回值.函数调用流程等. 下面话不多说了,来随着小编一起看看详细的介绍吧 Xcode的动态调试原理 首先了解一下 Xcode 编译和调试器的发展.Xcode 中的编译器发展历程:GCC -> LLVM,调试器的发展历程:GDB -> LLDB . Xcode 调试安装到手机上的应用的原理:Xcode 通过 LLDB 调试器把调试指令发送到手机上的 de

  • 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

  • python进阶教程之动态类型详解

    动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念相关. 动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的.常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量.而在Python中,这些是对象. 对象是储存在内存中的实体.但我们并不能直接接触到该对象.我们在程序中写的对象名,只是指向这一对象的引用(

  • IOS 静态方法与动态方法详解

    IOS 静态方法与动态方法详解 1.问题提出 iOS中有静态方法与动态方法,那么两种方法的异同是什么? 2.问题分析 因为每个对象都由相应的数据结构与方法相构成,一个程序可能有多个属于同一个类的对象,而每个对象的数据结构应该是不一的,但方法是相同的,若为每个对象开辟内存空间来存储方法,必然是对内存空间极大的浪费.因此apple是通过类对象与元类来解决这个问题的. 从根本来说,c++.objective-c.java都发源于c语言,因此这些语言实际上可以理解了经过封装的c语言,所以它们更加方便使用

  • Svg.js实例教程及使用手册详解(一)

    什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 SVG 是万维网联盟的标准 SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体 简介: SVG.js是一个轻量级的JavaScript库,允许你轻松操作SVG和定义动画. SVG(Scalable Vector Graphics,可缩放矢量图形)是基

  • iOS指纹登录(TouchID)集成方案详解

    TouchID指纹识别是iPhone 5S设备中增加的一项重大功能.苹果的后续移动设备也相继添加了指纹功能,在实际使用中还是相当方便的,比如快捷登录,快捷支付等等.系统提供了相应框架,使用起来还是比较方便的.使用LAContext对象即可完成指纹识别,提高用户体验. 提示:指纹识别必须用真机测试,并且在iOS8以上系统. TouchID API使用 1.添加头文件 #import 2.判断系统版本 //首先判断版本 if (NSFoundationVersionNumber < NSFounda

  • IOS之WebSocket框架Starscream案例详解

    传统的网络技术 (也就是 Berkeley sockets) 被认为是可靠和稳定的.但是 Berkeley socket 在某些 web 技术,比如代理和防火墙下不太好使.WebSocket 出现于 2011 年,是一种在客户端和服务端之间建立双向通讯的新技术.WebSocket 比起多个 HTTP 请求来说更有效率并允许长连接. 在 iOS 上使用 WebSocket 并不是那么容易.iOS 和 Mac 库 Starscream 的出现,极大地简化了 WebSocket 的创建和使用. 注:本

  • jmeter接口测试教程及接口测试流程详解(全网仅有)

    目录 一.Jmeter简介 二.Jmeter安装 三.设置Jmeter语言为中文环境 四.Jmeter主要元件 五.Jmeter元件的作用域和执行顺序 六.Jmeter进行接口测试流程 七.Jmeter进行接口测试流程步骤详解 八.Jmeter接口测试必定用到的扩展阅读 一.Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试. Jmeter具备高移植性,可以实现跨平台运行. Jmeter可以实现分布式负载. Jmeter采用

  • Swift进阶教程Mirror反射示例详解

    目录 元类型与.self AnyObject AnyClass Any type(Of:) self self在方法里面的作用 Self Swift Runtime Mirror Mirror的基本用法 Mirror的简单应用-JSON解析 Mirror源码解析 Enum Metadata探索 还原TargetEnumMetadata 还原TargetEnumDescriptor 相对偏移指针 打印枚举中的属性 Struct Metadata探索 获取结构体的属性 swift_getTypeBy

  • vue系列之动态路由详解【原创】

    开题 最近用vue来构建了一个小项目,由于项目是以iframe的形式嵌套在别的项目中的,所以对于登录的验证就比较的麻烦,索性后端大佬们基于现在的问题提出了解决的方案,在看到他们的解决方案之前,我先画了一个比较标准的单系统的解决方案. 本文目录: 一: 设想 二: 讨论 三:实现 四:总结 一: 设想 简单解释下上图就是: 首先前端从cookie获取token,如果没有token就跳转到登录页面登录,登录验证之后生成token存在数据库中并返回给前端:前端将这个token保存下来,为了让在浏览器新

随机推荐