苹果手机清空手机内存方法 | 苹果
365 2023-04-03 03:00:57
对于一个iOS App来说,它其实就是一个安装在手机中的可执行文件,这个可执行文件本质上是二进制文件,它由iPhone手机上的CPU执行。如果我们需要对操作系统、App进行深入了解,以及App的逆向都需要我们熟悉汇编语言
1.1 机器语言
1.2 汇编语言
汇编语言使用助记符代替机器语言,也就是我们常说的汇编指令,例如
汇编指令,是机器指令便于记忆的书写格式,它通过我们的编译器编译后转化成1010的机器指令
1.3 高级语言
高级语言是更接近人类自然语言的编程语言,例如C/C++/Objective-C/Swfit等
小结1
由高级语言编写的代码的运行过程
汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令(注意:汇编指令与CPU架构有关系,不同的CPU架构模式下汇编指令是不一样的,一般不通用,举个例子:我们的iPhone模拟器的CPU架构是x86,iPhone6是ARM64,汇编指令会有区别)
汇编语言可以通过编译得到机器语言,机器语言可以通过反汇编得到汇编语言
高级语言可以通过编译得到汇编语言 \ 机器语言,但汇编语言 \ 机器语言几乎不可能还原成高级语言
1.4、汇编语言的特点
1.5 汇编语言的种类
目前讨论比较多的汇编语言有
我们iPhone里面用到的是ARM汇编,但是不同的设备也有差异.因CPU的架构不同
1.6 学习汇编的用途
对性能要求极高的程序或者代码片段,可与高级语言混合使用(内联汇编)
软件安全
理解整个计算机系统的最佳起点和最有效途径
为编写高效代码打下基础
小结2
作为一个普通iOS开发者,学习汇编可以熟悉软件、程序的执行过程
了解操作系统,了解CPU/内存等硬件
iOS逆向的基础
在汇编中,大部分指令都是和CPU与内存相关的,因此学习汇编指令之前,我们需要了解CPU与内存的知识,不然无法理解汇编指令
2.1 了解CPU
2.2 了解总线
地址总线
寻址能力说明
直观举例:8086的寻址能力是1M,如果内存大小是2M,那么剩余的1M内存CPU无法使用,或者说无法访问到。
数据总线
CPU传输数据说明
一根数据总线,传递一个bit的数据
控制总线
2.3 CPU小结练习
1: 1024=2^10, 8KB = 1024*8 = 2^13, 所以:132:8080: 2^16=2^6*1024=64KB, 8088: 2^20=1024*1024=1MB, 80286: 2^24=16MB, 80386: 2^32=1024*1024*1024*4=4GB3: 8080: 8bit=1Byte, 8088:8bit=1Byte, 8086:2B, 80286:2B, 80386:4B4: 8086: 1024/2 = 512(至少), 80386: 1024/4=256(至少)
2.4 了解内存
各类存储区的逻辑连接
各类存储器的逻辑连接-物理地址对应
内存分类
各类存储器的物理地址情况(8086)
2.5 内存小结
3.1 进制的定义
3.2 进制的计算
通常我们进行进制计算总以十进制为依托去考虑其他进制,需要运算的时候也总是先转换成十进制,但是,其实按照十进制的加法表和乘法表,我们可以写出其他进制的加法表和乘法表,然后按照表进行加减乘除,可以准确得出结果,而不必依赖十进制(像我们做十进制的加减乘除一样)
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 1720 21 22 23 24 25 26 27...1+1 = 21+2 = 3 2+2 = 41+3 = 4 2+3 = 5 3+3 = 61+4 = 5 2+4 = 6 3+4 = 7 4+4 = 10 1+5 = 6 2+5 = 7 3+5 = 10 4+5 = 11 5+5 = 121+6 = 7 2+6 = 10 3+6 = 11 4+6 = 12 5+6 = 13 6+6 = 141+7 = 10 2+7 = 11 3+7 = 12 4+7 = 13 5+7 = 14 6+7 = 15 7+7 = 16
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27...1*1 = 11*2 = 2 2*2 = 41*3 = 3 2*3 = 63*3 = 111*4 = 4 2*4 = 103*4 = 14 4*4 = 201*5 = 5 2*5 = 123*5 = 17 4*5 = 24 5*5 = 311*6 = 6 2*6 = 143*6 = 22 4*6 = 30 5*6 = 36 6*6 = 441*7 = 7 2*7 = 163*7 = 25 4*7 = 34 5*7 = 43 6*7 = 52 7*7 = 61
3.3 二进制的简写形式
二进制: 1 0 1 1 1 0 1 1 1 1 0 0三个二进制一组: 101 110 111 100 八进制: 5 6 7 4四个二进制一组: 1011 1011 1100 十六进制: b b c二进制:从0 写到 11110000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 这种二进制使用起来太麻烦,改成更简单一点的符号:0 1 2 3 4 5 6 7 8 9 A B C D E F 这就是十六进制了
3.4 自己定义进制符号
思考1 + 1 在____情况下等于 3?
如果我们这样定义十进制的10个符号组成: 0 1 3 2 8 A B E S 7 逢十进一
那么这个时候,1 + 1 = 3!就对了!
这样的目的何在
传统我们定义的十进制和自定义的十进制不一样.那么这10个符号如果我们不告诉别人这个符号表,别人是没办法拿到我们的具体数据的!用于加密!
十进制由十个符号组成,逢十进一,符号是可以自定义的!!
练习
十进制: 0 1 2 3 4 5 6 7 8 9自定义: 2 9 1 7 6 5 4 8 3 A 92 99 91 97 96 95 94 98 93 9A 12 19 11 17 16 15 14 18 13 1A 72 79 71 77 76 75 74 78 73 7A 62 69 61 67 66 65 64 68 63 6A 52 59 51 57 56 55 54 58 53 5A 42 49 41 47 46 45 44 48 43 4A 82 89 81 87 86 85 84 88 83 8A 32 39 31 37 36 35 34 38 33 3A 922
那么刚才通过10进制运算可以转化10进制然后查表!但是如果是其他进制.我们就不能转换,要直接学会查表
3.5 进制小结
3.6 计算机中常见的数据宽度
3.7 计算机中数据的存储
#import <UIKit/UIKit.h>#import "AppDelegate.h"int test(){ int cTemp = 0x1FFFFFFFF; return cTemp;}int main(int argc, char * argv[]) { printf("%x\n",test()); @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
xcode内存调试:Debug->Debug workFlow->view memory, 发现高位丢失了
图1:lldb调试
图2:内存调试
经过调试发现,超出数据宽度的高位数据直接被丢弃了,并不是像我们想象的存储在其他地方
补充:关于数据是如何存储的,需要看C语言知识(反码、补码。。。)
CPU内部结构
4.1了解一些AMR64寄存器
X0-X31
ARM64拥有有31个64位的通用寄存器 x0 到 x30,这些寄存器通常用来存放一般性的数据,有时也有特定用途
使用iPhone真机(注意,模拟器的CPU是x86,和真机的架构不一样,寄存器是不同的)运行一个简单的Demo,可以查看CPU寄存器。通用寄存器x0-x28, x29-x30被用作特殊用途了(fp, lr)
w0-w28是这些是32位的,由于64位CPU需要兼容32位CPU,所以可以只使用64位寄存器的低32位. 比如w0的值就是x0寄存器的低32位值通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算,例如假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
CPU首先会将红色内存空间的值放到X0寄存器中:mov X0,红色内存空间 然后让X0寄存器与1相加:add X0,1 最后将值赋值给内存空间:mov 蓝色内存空间,X0
分析下面一段汇编,体验下
``` .text // 表示是代码段 .global _A, _B // 全局的代码段入口 _A: // 入口A mov x27, #0xa0 // #表示立即数,mov表示写入到寄存器 mov x28, #0x00 add x28, x27, #0x14 mov x27, x28 bl _B // bl指令,专门用于操作pc寄存器 mov x27, #0x0 ret _B: add x27, x27, #0x10 ret void A(); int main(int argc, char * argv[]){ A(); // 调用A代码段 return 0; } ```
Xcode调试截图
汇编指令内容在内存中的存储
pc寄存器(program counter)
4.2 寄存器与CPU小总结
对寄存器的理解
高度缓存的了解
AMR中寄存器种类的了解