逆向环境搭建

最近重拾逆向,整理一下最新实战方法,这篇主要整理了需要配置的环境和安装的软件,后面会陆续介绍相关的使用和其他相关概念 越狱 把家里的一台闲置6sPlus拿来作为越狱机了,系统为iOS11.4.1,没有仔细研究目前不同的系统版本越狱后会有什么差异,个人建议还是尽量找一个可越狱的最高系统版本,防止以后随着Depoyment Target版本升高而无法安装App Store包 基本概念 完美越狱 iphone重启后软件依然正常使用,iOS9.1之后再无完美越狱 不完美越狱 iphone重启后软件无法正常使用,需要重新越狱,当然现在使用的主流越狱工具app都自带一键重新越狱,也并不麻烦 工具 * 爱思助手 刚开始尝试的是爱思助手,里面有一键越狱工具,目前支持iOS10-12.1.2,内部使用的是electra工具来进行的越狱,按照操作指引,越狱成功! 接下来就是痛苦的时刻了,装afc2报错,cycript报错,Cydia Substrate报错,直接原地爆炸,各种找资料,找解决办法,…

Arm64汇编

这篇主要介绍常见ARM64寄存器、汇编指令,对于我们在调试、分析程序时有一定的帮助 寄存器 通用寄存器 * 64bit: x0 ~ x28 * 32bit: w0 ~ w28 (属于x0 ~ x28得低32位) * x0 ~ x7通常用来存放函数参数,更多得参数用堆栈来传递 * x0通常用来存放函数得返回值 程序计数器 * pc(PRogram Counter) * 记录CPU当前指令的地址 * 类似8086汇编的ip寄存器 堆栈指针 * sp(Stack Pointer) sub sp, sp, #0x60 ; =0x60 * fp(Frame Pointer),也就是x29,和sp配合确定函数栈空间 链接寄存器 * lr(Link Register),也就是x30 * 存放着函数的返回地址 程序状态寄存器 * cpsr(Current Program Status Register)…

iOS动态调试

什么是动态调试 通过动态下断点的方式,动态调试程序的方法,查看程序的内存信息、参数、调用堆栈等信息的一种调试方法 LLDB 什么是LLDB LLDB is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project, such as the Clang expression parser and LLVM disassembler.  LLDB is the default debugger in Xcode…

sizeof与MemoryLayout

sizeof 在C语言中,可能会经常与sizeof打交道,用来计算数据占用内存大小。在C中sizeof即可以作用于类型也可以作用于某个实际的变量,并返回其在内存中的尺寸size_t。 在Swift 3以前,也有sizeof,不过与C中的运算符不同,它经过了一层包装,变成了一个只接受类型的方法,而接受具体值的则为另一个方法: sizeofValue func sizeof<T>(_: T.Type) -> Int func sizeofValue<T>(_: T) -> Int 不过sizeofValue接受的虽然是具体值,但是返回的是这个值的实际大小,而不是其内容的大小。所以与C中用sizeof拿来计算数组内容在内存中占据的尺寸不一样: // C char bytes[] = {1, 2, 3}; sizeof(bytes); // 3 int bytes[] = {1,…

Swift中的指针

Apple 期望在 Swift 中指针能够尽量减少登场几率,因此在 Swift 中指针被映射为了一个泛型类型,并且还比较抽象。这在一定程度上造成了在 Swift 中指针使用的困难,特别是对那些并不熟悉指针,也没有多少指针操作经验的开发者 (包括我自己也是) 来说,在 Swift 中使用指针确实是一个挑战。在这篇文章里,我希望能从最基本的使用开始,总结一下在 Swift 中使用指针的一些常见方式和场景。这篇文章假定你至少知道指针是什么,如果对指针本身的概念不太清楚的话,可以先看看这篇五分钟 C 指针教程 (或者它的中文版本),应该会很有帮助。 初步 在 Swift 中,指针都使用一个特殊的类型来表示,那就是 UnsafePointer<T>。遵循了 Cocoa 的一贯不可变原则,UnsafePointer<T> 也是不可变的。当然对应地,它还有一个可变变体,…

iOS内存用量分析

前言 我们在查看iOS应用内存时,最常见的手法就是查看左边的Debug Navigator。不知你是否也曾困惑于这个内存究竟包括哪些部分,或者使用Allocations模版观察内存时发现无法和Debug Navigator显示的内存匹配上,这篇文章将带你解答这些疑惑。 Debug Navigator VS Allocations 我们运行一个很简单的iOS App,我只在ViewController中放置了一个View,然后对比下Debug Navigator 和 Allocations给出的内存用量。 可以发现,Debug Navigator给出的是79.3M,而Allocations统计的所有堆和相关VM加起来才38.72M,相差的还是很多的。在之前的文章中我有介绍关于Allocations和VM Tracker的深入理解,其实Allocations中主要包含的是所有MALLOC_XXX VM Region和部分App进程创建的VM Region。非动态的内存,以及部分其他动态库创建的VM Region并不在Allocations的统计范围内。比如主程…

Swift性能相关

由于Swift4已经趋于稳定,最新的项目开始使用Swift开发,之前只是在实验中用过Swift,并未进行深入研究和应用到实际开发,而且还有一些疑惑,这几天查阅相关资料之后做了一些总结 Swift中的类型 * 平凡类型 有些类型只需要按照字节表示进行操作,而不需要额外工作,我们将这种类型叫做平凡类型 (trivial)。比如,Int 和 Float 就是平凡类型,那些只包含平凡值的 struct 或者 enum 也是平凡类型 struct AStruct { var a: Int } struct BStruct { var a: AStruct } //AStruct和BStruct都是平凡类型 * 引用类型 对于引用类型,值实例是一个对某个对象的引用。复制这个值实例意味着创建一个新的引用,这将使引用计数增加。销毁这个值实例意味着销毁一个引用,这会使引用计数减少。不断减少引用计数,最后当然它会变成 0,并导致对象被销毁。但是需要特别注意的是,我们这里谈到的复制和销毁值,只是对引用计数的操作,而不是复制或者销毁对象本身 struct…

vConsole预研

介绍 一个轻量、可拓展、针对手机网页的前端开发者调试面板 Github传送门:https://github.com/Tencent/vConsole 功能 * 查看 console 日志 * 查看网络请求 * 查看页面 element 结构 * 查看 Cookies 和 localStorage * 手动执行 JS 命令行 * 自定义插件 理解 前端同学在开发Browser端时,能使用Chrome自带一键F12检查功能来方便调试,但是在移动端就没这么方便了。可能也有其他类似支持安卓调试的Chrome插件等辅助使用,但是个人感觉都没有vConsole直接在手机上使用这么直观、简单。对于vConsole框架,简单来说,就是为了方便前端在移动端调试时而开发的一套控制台系统,能够直接在移动设备一键展示打印日志、网络请求、查看Cookie等功能,最库被编译压缩成一个vconsole.min.js文件,前端使用时直接引入该文件即可。 实验和演示 为了演示和实验前后端交互和使用方法,深入了解整个流程,直接一部刨到问题的 祖坟。我用Java简单写了一个本…