Base64 解码特征
signed int __cdecl base64_decode(BYTE *p_str_base64, int str_len, int p_out_bytes, int p_bytes_get)
{
signed int result; // eax@3
int v5; // [sp+0h] [bp-1Ch]@11
int sum; // [sp+4h] [bp-18h]@7
int suma; // [sp+4h] [bp-18h]@17
signed int i; // [sp+8h] [bp-14h]@7
int j; // [sp+8h] [bp-14h]@17
signed int bits_count; // [sp+Ch] [bp-10h]@7
int n_output_bytes; // [sp+10h] [bp-Ch]@4
unsigned int v12; // [sp+14h] [bp-8h]@4
signed int f_dontoutput; // [sp+18h] [bp-4h]@4
if ( p_str_base64 && p_bytes_get )
{
v12 = (unsigned int)&p_str_base64[str_len];
n_output_bytes = 0;
f_dontoutput = p_out_bytes == 0;
while ( (unsigned int)p_str_base64 < v12 && *p_str_base64 )
{
sum = 0;
bits_count = 0;
for ( i = 0; i < 4 && (unsigned int)p_str_base64 < v12; ++i )// 每4个字符换3个字节
{
v5 = sub_15E88A0((char)*p_str_base64++); //v5等于base64字符对应的数
if ( v5 == -1 )
{
--i;
}
else
{ // 应该是base64算法
sum = v5 | (sum << 6); // 2^6=64 高位编码在前
bits_count += 6; //
}
}
if ( !f_dontoutput && n_output_bytes + bits_count / 8 > *(_DWORD *)p_bytes_get )
f_dontoutput = 1;
suma = sum << (24 - bits_count);
for ( j = 0; j < bits_count / 8; ++j )
{
if ( !f_dontoutput )
*(_BYTE *)p_out_bytes++ = ((unsigned int)byte_FF0000 & suma) >> 16;
suma <<= 8;
++n_output_bytes;
}
} // while
*(_DWORD *)p_bytes_get = n_output_bytes;
if ( f_dontoutput )
result = 0;
else
result = 1;
}
else
{
result = 0;
}
return result;
}
附上base64 table:
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
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
|