用户
搜索
  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 58 天

    连续签到: 2 天

    [LV.5]常住居民I

    版主

    Rank: 7Rank: 7Rank: 7

    18

    主题

    65

    帖子

    1651

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2015-11-20

    i春秋签约作者

    发表于 2018-1-10 10:25:29 13101
    本帖最后由 icq5f7a075d 于 2018-1-10 10:31 编辑

    本文原创作者:icq5f7a075d,本文属i春秋原创奖励计划,未经许可禁止转载!
    本文如果出现错误,欢迎指出,感激不尽!
    本文中的所有程序请在虚拟机中运行。
    参考资料:
    《加密与解密 第三版》

    1. Base64
    1.1. Base64介绍
    Base64实际上是一种编码算法。其使用含有65个字符的ASCII字符集,并用6个进制位表示一个可显示字符。Base64编码表:
    索引
    对应字符
    索引
    对应字符
    索引
    对应字符
    索引
    对应字符
    0
    A
    17
    R
    34
    i
    51
    z
    1
    B
    18
    S
    35
    j
    52
    0
    2
    C
    19
    T
    36
    k
    53
    1
    3
    D
    20
    U
    37
    l
    54
    2
    4
    E
    21
    V
    38
    m
    55
    3
    5
    F
    22
    W
    39
    n
    56
    4
    6
    G
    23
    X
    40
    o
    57
    5
    7
    H
    24
    Y
    41
    p
    58
    6
    8
    I
    25
    Z
    42
    q
    59
    7
    9
    J
    26
    a
    43
    r
    60
    8
    10
    K
    27
    b
    44
    s
    61
    9
    11
    L
    28
    c
    45
    t
    62
    +
    12
    M
    29
    d
    46
    u
    63
    /
    13
    N
    30
    e
    47
    v
    14
    O
    31
    f
    48
    w
    15
    P
    32
    g
    49
    x
    16
    Q
    33
    h
    50
    y
    Base64编码中一共有64个可打印字符"A-Za-z0-9+/"
    我们前文说Base64使用含有65个字符的ASCII字符集,为什么编码只有64项呢?第65个字符为“=”,用于对字符串的特殊处理。
    1.2. Base64编码过程
    ASCII中一个字符8bit,而Base646bit表示一个可见字符,也就是说3ASCII字节可以由4Base64字符来表示。
    Base64进行数据编码时,将第一个字节放置于24位缓冲区的高8位,第二个字节放置于中间8位,第三个字节放置于低8位。如果对少于3个字节的数据进行编码,相应的缓冲区将被置0。然后对24位缓冲区以6位为一组作为索引,高位优先,从字符串“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/”中取出相应的元素作为输出。如果仅有一个或两个字节输入,那么只使用输出的两个或三个字符,其余的用“=”填充。
    解码则是编码的逆过程。首先得到Base64字符串的每个字符在Base64码表中的索引,然后将这些索引的二进制连接起来,重新以bit为一组进行分组。
    2. 程序逆向
    本次分析的程序是《病毒分析实战篇1》(想要附件的在这里下:https://bbs.ichunqiu.com/thread-32134-1-1.html中的病毒程序,这里仅分析该病毒程序Base64解码的过程,病毒程序的其他行为请参阅病毒分析实战篇1
    程序在进行Base64解码时,首先初始化数组,存放Base64字符集:
    图片1.png
    每次取一个字符,判断其在字符集中的位置,其位置就是6bit的有效数据:
    图片2.png
    Base64解码的过程,是将46bit的数据转化为38bit的数据,前面的操作中成功获取16bit的数据,接下来将其存放在缓冲区中,并将缓冲区左移6bit,为下一个6bit数据的存放开辟空间:
    图片3.png
    如此循环,每次取一个字符获得6bit数据,每4个为一组解密出3个有效字节。
    该程序只实现了Base64解码的过程,Base64加密的过程类似,不过是逆过程,将38bit数据转化为46bit数据。
    3. 编码实现
    该程序实现的是上述病毒程序中Base64解码过程:
    [AppleScript] 纯文本查看 复制代码
    #include <iostream>
    #include <string.h>
    using namespace std;
    //解码 
    //ASCII "4jNnIiz7AYsUqF0fDZcYbNM3KpD+iW2Pt6bpEf6tEToOJMYNFoB5Vt6K"
    char Base64_init(char c){
            char table[66]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
            //char m;
            char i=0x00;
            for(;i<65;i++){
                    if(c==table[i])
                            return i;
            }
            printf("ERROR1!");
            return -1;
    }
    int main()
    {
            char cipher[100]="4jNnIiz7AYsUqF0fDZcYbNM3KpD+iW2Pt6bpEf6tEToOJMYNFoB5Vt6K";
            char temp[100], message[100]="\0";
            int i,j,k;
            for(i=0;i<strlen(cipher);i++){
                    temp[i]=Base64_init(cipher[i]);
            }
            if(i%4!=0)
            {
                    printf("ERROR2:%d,%d!",i,strlen(cipher));
                    return -1;
            }
            for(j=0;j<i/4;j++){
                    
                    message[3*j]=(temp[4*j]<<2)|(temp[4*j+1]>>4);
                    message[3*j+1]=(temp[4*j+1]<<4)|(temp[4*j+2]>>2);
                    message[3*j+2]=(temp[4*j+2]<<6)|(temp[4*j+3]);                
            }
            for(k=0;k<strlen(message);k++)
            {
                    printf("\\x%x,",message[k]&0x0FF);
            }
    
            return 0;
    }
    


    本帖被以下淘专辑推荐:

    发表于 2018-1-11 17:20:29
    学习了!
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册