美文网首页
iOS逆向编程第二篇:基本汇编(2)

iOS逆向编程第二篇:基本汇编(2)

作者: 大雄記 | 来源:发表于2018-04-22 23:28 被阅读65次

    一、进制

    1.学习进制的障碍

    很多人学不好进制,原因是总以十进制为依托去考虑其他进制,需要运算的时候也总是先转换成十进制,这种学习方法是错误的。
    我们为什么一定要转换十进制呢?仅仅是因为我们对十进制最熟悉,所以才转换。
    每一种进制都是完美的,想学好进制首先要忘掉十进制,也要忘掉进制间的转换!

    2.进制的定义
    • 八进制由8个符号组成:0 1 2 3 4 5 6 7 逢八进一
    • 十进制由10个符号组成:0 1 2 3 4 5 6 7 8 9 逢十进一
    • N进制就是由N个符号组成:逢N进一
    3.进制的延伸

    进制是由符号集合组成的。例如:十进制由十个符号组成,逢十进一,符号是可以自定义

    如果自定义十进制是由(0、1、3、2、8、A、B、E、S、7)这10个符号组成的情况下,1 + 1 就会等于3,不会再是算错的情况下才等于3了。

    这样的目的何在?
    传统我们定义的十进制和自定义的十进制不一样。那么这10个符号如果我们不告诉别人这个符号表,别人是没办法拿到我们的具体数据的。如果我们需要加密某一串数据,自己定义一种进制,是不是就达到加密的效果了呢?

    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
    

    实战四则运算

       277         236         276         234
    +  333       -  54       *  54       /   4
    --------    --------    --------    --------    
    

    参考十进制的乘法口诀进行换算,就能快算得到答案了。

    5.二进制的简写形式
           二进制: 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 这就是十六进制了

    6.自定义进制符号练习
    • 现在有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
    

    二、数据的宽度

    数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最多宽度的数据会被丢弃。
    例如看看如下代码中的int类型值为多少?

    #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]));
        }
    }
    

    上述代码中,定义了一个int类型值,并将0x1FFFFFFFF赋值给它,但是int类型的最大值为:0x7FFFFFFF,所以这个int类型的部分值会被丢弃。

    1.计算机中常见的数据宽度
    • 位(Bit):1个位就是1个二进制位(0或者1)。
    • 字节(Byte):1个字节由8个Bit组成(8位),内存中的最小单元Byte。
    • 字(Word):1个字由2个字节组成(16位),这2个字节分别称为高字节和低字节。
    • 双字(Doubleword):1个双字由两个字组成(32位)。

    取值范围
    为了以后开发中能够方便查找,并正确的使用数据类型,下面是部分数据类型的取值范围:

    类型 范围
    int -2147483648~2147483647
    unsigned int 0~4294967295
    short -32768~32767
    unsigned short 0~65535
    long -2147483648~2147483647
    unsigned long 0~4294967295

    存储空间
    下面列出的是常用数据类型占用的存储空间

    数据类型 16位编译器 32位编译器 64位编译器
    char 1byte 1byte 1byte
    int 2byte 4byte 4byte
    float 4byte 4byte 4byte
    double 8byte 8byte 8byte
    short int 2byte 2byte 2byte
    unsigned int 2byte 4byte 4byte
    long 4byte 4byte 8byte
    unsigned long 4byte 4byte 8byte
    long long 8byte 8byte 8byte

    那么计算机存储数据它会分为有符号数和无符号数.那么关于这个看图就理解了!

    无符号数,直接换算!
    有符号数:
    正数:  0    1    2    3    4    5    6    7 
    负数:  F    E    D    B    C    A    9    8
          -1   -2   -3   -4   -5   -6   -7   -8
    

    相关文章

      网友评论

          本文标题:iOS逆向编程第二篇:基本汇编(2)

          本文链接:https://www.haomeiwen.com/subject/xzvhlftx.html