能力值:
(RANK:760 )
2 楼
PeID 自带kanal插件,基本上都可以分析出来
或者根据Base64的64个字符(包括"=")来区分:)
能力值:
( LV9,RANK:170 )
3 楼
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);
}
能力值:
( LV9,RANK:170 )
4 楼
上面是几年前分析程序时留下来的,源程序也是网上人的,我也用pascal和Delphi写过,但觉得还是保持原先的源程序好.所以就用
之前的了.
原理和实现方法都有了.可以看看了.
能力值:
(RANK:20 )
5 楼
哈哈,我说怎么这么眼熟,原来依稀是俺N年前写的短文和源码。。。:D
能力值:
(RANK:760 )
6 楼
:D :D
能力值:
( LV9,RANK:170 )
7 楼
不算俺抄袭啊! 只是文章已经太久了,已经没有原来的记录了.
你当年不是也发过一个wdl文件的密码程序吗,我写过的也发给你了.
呵呵,我找找我的箱子底,把俺写的pascal发上去吧!
老罗用汇编写的我也可以找到,一并发上去了.
能力值:
(RANK:20 )
8 楼
没说是抄袭,只是看到老东西有点感动哈:D