首页
社区
课程
招聘
怎么识别出是BASE64的注册算法
2004-11-22 15:12 6382

怎么识别出是BASE64的注册算法

2004-11-22 15:12
6382
这个也有检测的工具吗?
如果不知道算法是无法写注册机的

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 1
打赏
分享
最新回复 (7)
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
cnbragon 18 2004-11-22 17:53
2
0
PeID 自带kanal插件,基本上都可以分析出来
或者根据Base64的64个字符(包括"=")来区分:)
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2004-11-22 18:30
3
0
Base64不能算加密方法吧, 我觉得叫它编码方法可能更合适.
老罗写过base 64的程序,看过算法就觉得比较简单了.

类base64编码算法在共享软件注册机制中的应用
       --blowfish  (是几年前的文章了,nig加了一点例子)

在软件的注册机制中,类似base64的编码算法就常被用到,其特点是实现简单,编码容易,并且对那些对软件注册机制很“感兴趣”的人有一定的难度和迷惑作用。首先让我们先来看一看什么是base64的编码算法。

base64编码算法是将输入内容按顺序每3个字节分成一组(不足3个字节用字节0补充),这样就可以构成3X8=24(3个字节,每个字节由8个二进制位构成)个二进制位(bit),其中第一字节的最高位在左侧,而第三字节的最低位在右侧,然后再将这24个二进制位(bit)分成4组,每组6个二进制位(bit),再用这4组6个二进制位(bit)转成数值(<64,因为二进制中6位能表示的值为最大为2的6次方)去查表转换,可以查到4个可显示的字符. 这样就将3个字节编码为4个可显示字符。

    我们用例子来说明一下:设输入的3个字节是B(42H) C(43H) D(44H)
十六进制      42         43         44
  二进制   01000010   01000011   01000100  每个字节是8个二进制位
6bit编组   010000  100100  001101  000100
  十进制     16      36      13      04

    那么输入的3个字节将被编码为表中的第16,36,13,4个字符。
    编码算法所使用的表共有65个字符,最后一个字符为'=',有特殊用途,一会儿再说明,表格如下:
---------------------------------------------------------------------
                   base64编码表
                ====================
数值 编码   数值  编码   数值 编码      数值  编码
00    A     17    R      34    i        51     z
01    B     18    S      35    j        52     0
02    C     19    T      36    k        53     1
03    D     20    U      37    l        54     2
04    E     21    V      38    m        55     3
05    F     22    W      39    n        56     4
06    G     23    X      40    o        57     5
07    H     24    Y      41    p        58     6
08    I     25    Z      42    q        59     7
09    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     (pad)     =
15    P     32    g      49    x
16    Q     33    h      50    y
------------------------------------------------------------------
查表得出输入的三个字节B(42H) C(43H) D(44H)将被编码为QkNE。

    前面说过,base64编码要求是3个字节一组。有时候输入内容的长度不一定正好是3的整数倍,所以需要作特殊处理.这里对三种可能的情况进行分析:

1. 最后一组输入正好3个字节
    无需特殊处理.

2. 最后一组输入只有两个字节
    这种情况需要补一个0字节,以凑成3个字节一组.将它们分成4个6bit的组之后,最右的6 bit不包含有用信息,所以不用查表转换,直接将其转换为一个'='字符.

    我们用例子来说明一下:
十六进制      42         43      补字节0
  二进制   01000010   01000011   00000000
6bit编组   010000  100100  001100  000000
  十进制     16      36      12     '='直接转换

3. 最后一组输入只有一个字节
    这种情况需要补充两个0字节.将它们分成4个6 bit的组之后,最右的两个6 bit都不包含有用信息,直接转换为两个'='号.

    我们用例子来说明一下:
十六进制      42        补字节0       补字节0
  二进制   01000010     00000000      00000000
6bit编组   010000  100000  000000       000000
  十进制     16      32    '='直接转换  '='直接转换

另外,base64算法规定,编码算法输出的每行不能超过76个可显示字符。
    根据以上描述的编码算法可知base64的解码也是相当简单的。经base64编码之后长度变长33%。通过变换码表中字符的不同顺序,也可以达到“乱码”的目的。
   
附: base64编码的简单程序
#include <stdio.h>
//表格
unsigned char table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu\ vwxyz0123456789+/";
main(int argc,char **argv )
{
  unsigned char a[3];
  FILE *in;
  int k;
  int length;
  if(argc<2) in=stdin;
  else { in=fopen(argv[1],"rb");
         if(in==NULL) { printf("Error open %s\n",argv[1]);
           exit(-1);
         }
       }
  k=0;
  length=0;
  while(! feof(in))
  {  a[k++]=fgetc(in);     //从输入文件中读入一个字节
     if(k>=3)              //已经读入三个字节,则作为一组进行编码
     {
        putchar(table[ (a[0]>>2)  & 0x3F ]);
        putchar(table[ ((a[0]<<4) | (a[1]>>4)) & 0x3F ]);
        putchar(table[ ((a[1]<<2) | (a[2]>>6)) & 0x3F ]);
        putchar(table[ a[2] & 0x3F ]);
        length +=4;
        if(length>=76) { putchar('\n'); length=0;} //输出行长度不超过76
        k=0;
     }
  }
  if(k==1) {  putchar(table[ (a[0]>>2) & 0x3F ]); //最后一组只有一个字节
putchar(table[ (a[0]<<4) & 0x3F ]);
putchar('=');
putchar('=');
           }
  else if(k==2)                                  //最后一组只有两个字节
  {  putchar(table[ (a[0]>>2) & 0x3F ]);
     putchar(table[ ((a[0]<<4) | (a[1]>>4)) & 0x3F ]);
     putchar(table[ (a[1]<<2) & 0x3F ]);
     putchar('=');
  }
  putchar('\n');
  fclose(in);
}

雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2004-11-22 18:38
4
0
上面是几年前分析程序时留下来的,源程序也是网上人的,我也用pascal和Delphi写过,但觉得还是保持原先的源程序好.所以就用
之前的了.

原理和实现方法都有了.可以看看了.
雪    币: 3246
活跃值: (339)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
blowfish 2004-11-22 20:55
5
0
哈哈,我说怎么这么眼熟,原来依稀是俺N年前写的短文和源码。。。:D
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
cnbragon 18 2004-11-22 21:37
6
0
:D :D
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2004-11-22 23:52
7
0
不算俺抄袭啊! 只是文章已经太久了,已经没有原来的记录了.
你当年不是也发过一个wdl文件的密码程序吗,我写过的也发给你了.
呵呵,我找找我的箱子底,把俺写的pascal发上去吧!

老罗用汇编写的我也可以找到,一并发上去了.
雪    币: 3246
活跃值: (339)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
blowfish 2004-11-23 00:05
8
0
没说是抄袭,只是看到老东西有点感动哈:D
游客
登录 | 注册 方可回帖
返回