标签:输出 汇编语言 自定义 ring win32 touch 概述 strong 功能
今天我们来学习以下内容:
我们在学习逆向开发之前,我们要了解一个基本的逆向原理。首先我们是逆向iOS系统上面的APP,那么我们知道,一个APP安装在手机上面的可执行文件本质上是二进制文件,因为iPhone手机本质上执行的指令是二进制,是由手机上的CPU执行的,所以逆向开发是建立在分析二进制上面。
由0和1组成的机器指令(说白了是电信号)
我们所写的代码最终跑在机器上的是什么东西?是机器语言,是一堆的0,1,也叫做指令。
使用助记符代替机器语言,也称为符号语言
C\C++\Java\OC\Swift,更加接近人类的自然语言
比如C语言:
我们的代码在终端设备上是这样的过程:
越底层越单纯!真正的程序员都需要了解的一门非常重要的语言,汇编!
目前讨论比较多的汇编语言有
我们iPhone里面用到的是ARM汇编,但是不同的设备也有差异.因CPU的架构不同.
架构 | 设备 |
---|---|
armv6 | iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touc |
armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
arm64 | iPhone5S 以后 iPhoneX , iPad Air, iPad mini2以后 |
举个例子:
做个小练习 * 一个CPU 的寻址能力为8KB,那么它的地址总线的宽度为____ * 8080,8088,80286,80386 的地址总线宽度分别为16根,20根,24根,32根.那么他们的寻址能力分别为多少____KB, ____MB,____MB,____GB? * 8080,8088,8086,80286,80386 的数据总线宽度分别为8根,8根,16根,16根,32根.那么它们一次可以传输的数据为:____B,____B,____B,____B,____B, * 从内存中读取1024字节的数据,8086至少要读____次,80386至少要读取____次.
答案:
* 13
* 64KB 1MB 16MB 4GB
* 1B 1B 2B 2B 4B
* 512 256
内存地址空间的大小受CPU地址总线宽度的限制。8086的地址总线宽度为20,可以定位220个不同的内存单元(内存地址范围0x00000~0xFFFFF),所以8086的内存空间大小为1MB
0x00000~0x9FFFF:主存储器。可读可写
0xA0000~0xBFFFF:向显存中写入数据,这些数据会被显卡输出到显示器。可读可写
0xC0000~0xFFFFF:存储各种硬件\系统信息。只读
学习进制的障碍:
很多人学不好进制,原因是总以十进制为依托去考虑其他进制,需要运算的时候也总是先转换成十进制,这种学习方法是错误的.
我们为什么一定要转换十进制呢?仅仅是因为我们对十进制最熟悉,所以才转换.
每一种进制都是完美的,想学好进制首先要忘掉十进制,也要忘掉进制间的转换!
1 + 1 在____情况下等于 3 ? 十进制由10个符号组成: 0 1 3 2 8 A B E S 7 逢十进一,如果这样定义十进制: 1 + 1 = 3!就对了!这样的目的何在?传统我们定义的十进制和自定义的十进制不一样,那么这10个符号如果我们不告诉别人这个符号表,别人是没办法拿到我们的具体数据的!用于加密!十进制由十个符号组成,逢十进一,符号是可以自定义的!!
做个练习: 八进制运算 2 + 3 = __ , 2 * 3 = __ ,4 + 5 = __ ,4 * 5 = __. 277 + 333 = __ , 276 * 54 = __ , 237 - 54 = __ , 234 / 4 = __ . 实战四则运算: 277 236 276 234 + 333 - 54 * 54 / 4 -------- -------- -------- --------
八进制加法表:
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 = 2 1+2 = 3 2+2 = 4 1+3 = 4 2+3 = 5 3+3 = 6 1+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 = 12 1+6 = 7 2+6 = 10 3+6 = 11 4+6 = 12 5+6 = 13 6+6 = 14 1+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 = 1 1*2 = 2 2*2 = 4 1*3 = 3 2*3 = 6 3*3 = 11 1*4 = 4 2*4 = 10 3*4 = 14 4*4 = 20 1*5 = 5 2*5 = 12 3*5 = 17 4*5 = 24 5*5 = 31 1*6 = 6 2*6 = 14 3*6 = 22 4*6 = 30 5*6 = 36 6*6 = 44 1*7 = 7 2*7 = 16 3*7 = 25 4*7 = 34 5*7 = 43 6*7 = 52 7*7 = 61
二进制: 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 写到 1111 0000 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 这就是十六进制了 //十六进制古时候就有了,古秤,半斤八两
数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最多宽度的数据会被丢弃。
输入以下代码:
#import <UIKit/UIKit.h> #import "AppDelegate.h" int test(){ int cTemp = 0x1FFFFFFFF; return cTemp; } int main(int argc, char * argv[]) { printf("%x\n",test());//ffffffff @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
我们可以看到1是存不进去的,int类型占4个字节(如下图)
计算机中常见的数据宽度:
那么计算机存储数据它会分为有符号数和无符号数.那么关于这个看图就理解了!
无符号数,直接换算! 有符号数: 正数: 0 1 2 3 4 5 6 7 负数: F E D B C A 9 8 -1 -2 -3 -4 -5 -6 -7 -8
练习 现在有10进制数 10个符号分别是:2,9,1,7,6,5,4, 8,3 , A 逢10进1 那么: 123 + 234 = ____ 十进制: 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进制然后查表!但是如果是其他进制.我们就不能转换,要直接学会查表 现在有9进制数 9个符号分别是:2,9,1,7,6,5,4, 8,3 逢9进1 那么: 123 + 234 = ____ 十进制: 0 1 2 3 4 5 6 7 8 自定义: 2 9 1 7 6 5 4 8 3 92 99 91 97 96 95 94 98 93 12 19 11 17 16 15 14 18 13 72 79 71 77 76 75 74 78 73 62 69 61 67 66 65 64 68 63 52 59 51 57 56 55 54 58 53 42 49 41 47 46 45 44 48 43 82 89 81 87 86 85 84 88 83 32 39 31 37 36 35 34 38 33 922
内部部件之间由总线连接
通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算
假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
但是,mov指令不能用于设置pc的值,ARM64没有提供这样的功能
ARM64提供了另外的指令来修改PC的值,这些指令统称为转移指令,最简单的是bl指令
bl指令 -- 练习 现在有两段代码!假设程序先执行A,请写出指令执行顺序.最终寄存器x0的值是多少? _A: mov x0,#0xa0 mov x1,#0x00 add x1, x0, #0x14 mov x0,x1 bl _B mov x0,#0x0 ret _B: add x0, x0, #0x10 ret
标签:输出 汇编语言 自定义 ring win32 touch 概述 strong 功能
原文地址:https://www.cnblogs.com/wangchan/p/8809521.html