我是靠谱客的博主 呆萌小笼包,这篇文章主要介绍base64反汇编base64反汇编,现在分享给大家,希望可以做个参考。

base64反汇编

文章目录

  • base64反汇编
    • 1.C语言代码(base64加密)
    • 2.base64反汇编
    • 3.对比分析

1.C语言代码(base64加密)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<stdio.h> #include<string.h> #include<stdlib.h> void jiami(char x,char y,char z); char s[100]; int i,j; char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int main() { int len; char str[100]; printf("base64需要加密的字符串:"); gets(str); len=strlen(str); for(i=0,j=0;i<=len-3;i+=3,j+=4) { jiami(str[i],str[i+1],str[i+2]); } if(len%3==1) { s[j]=a[str[len-1]>>2]; s[j+1]=a[str[len-1]<<4&0x3f]; s[j+2]='='; s[j+3]='='; } if(len%3==2) { s[j]=a[str[len-2]>>2]; s[j+1]=a[(str[len-2]<<4|str[len-1]>>4)&0x3f]; s[j+2]=a[(str[len-1]<<2)&0x3f]; s[j+3]='='; } printf("n加密之后:"); puts(s); printf("n"); system("pause"); return 0; } void jiami(char x,char y,char z) { s[j]=a[x>>2]; s[j+1]=a[(x<<4|y>>4)&0x3f]; s[j+2]=a[(y<<2|z>>6)&0x3f]; s[j+3]=a[z&0x3f]; }

2.base64反汇编

这里我就只贴出base64位运算的反汇编,即上述C语言jiami(char x,char y,char z)这个函数的汇编。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
00401280 >/> 55 PUSH EBP 00401281 |. 8BEC MOV EBP,ESP 00401283 |. 83EC 40 SUB ESP,0x40 00401286 |. 53 PUSH EBX 00401287 |. 56 PUSH ESI 00401288 |. 57 PUSH EDI 00401289 |. 8D7D C0 LEA EDI,DWORD PTR SS:[EBP-0x40] ; 三个参数分别x,y,z 0040128C |. B9 10000000 MOV ECX,0x10 00401291 |. B8 CCCCCCCC MOV EAX,0xCCCCCCCC 00401296 |. F3:AB REP STOS DWORD PTR ES:[EDI] 00401298 |. 0FBE45 08 MOVSX EAX,BYTE PTR SS:[EBP+0x8] 0040129C |. C1F8 02 SAR EAX,0x2 ; x算数右移两位(填充符号位),取高四位 0040129F |. 8B0D CCAE4200 MOV ECX,DWORD PTR DS:[j] 004012A5 |. 8A90 307A4200 MOV DL,BYTE PTR DS:[EAX+a] ; a是码表首地址,加eax偏移,即查表 004012AB |. 8891 E0AE4200 MOV BYTE PTR DS:[ECX+s],DL ; 记录,s是输出地址,ecx即对于偏移,记录加密过后的结构 004012B1 |. 0FBE45 08 MOVSX EAX,BYTE PTR SS:[EBP+0x8] 004012B5 |. C1E0 04 SHL EAX,0x4 ; x逻辑左移4位,取低二位 004012B8 |. 0FBE4D 0C MOVSX ECX,BYTE PTR SS:[EBP+0xC] 004012BC |. C1F9 04 SAR ECX,0x4 ; y算数右移4位,取高四位 004012BF |. 0BC1 OR EAX,ECX ; 逻辑或or运算,将前面两个数合并 004012C1 |. 83E0 3F AND EAX,0x3F ; 与0x3f(0011 1111)逻辑与,即取这个 合并的数 的低六位 004012C4 |. 8B15 CCAE4200 MOV EDX,DWORD PTR DS:[j] 004012CA |. 8A80 307A4200 MOV AL,BYTE PTR DS:[EAX+a] ; 查表 004012D0 |. 8882 E1AE4200 MOV BYTE PTR DS:[EDX+0x42AEE1],AL ; 记录,edx+地址,这个地址对应起始地址,已经自增了(+1)。 004012D6 |. 0FBE4D 0C MOVSX ECX,BYTE PTR SS:[EBP+0xC] 004012DA |. C1E1 02 SHL ECX,0x2 ; 将y逻辑左移2位,取低四位 004012DD |. 0FBE55 10 MOVSX EDX,BYTE PTR SS:[EBP+0x10] 004012E1 |. C1FA 06 SAR EDX,0x6 ; z算数右移6位,只取高2位。 004012E4 |. 0BCA OR ECX,EDX ; 逻辑或or运算,将两数合并 004012E6 |. 83E1 3F AND ECX,0x3F ; 与0x3f(0011 1111)逻辑与,即取这个 合并的数 的低六位 004012E9 |. A1 CCAE4200 MOV EAX,DWORD PTR DS:[j] 004012EE |. 8A89 307A4200 MOV CL,BYTE PTR DS:[ECX+a] ; 查表 004012F4 |. 8888 E2AE4200 MOV BYTE PTR DS:[EAX+0x42AEE2],CL ; 记录,eax+地址, 004012FA |. 0FBE55 10 MOVSX EDX,BYTE PTR SS:[EBP+0x10] 004012FE |. 83E2 3F AND EDX,0x3F ; z直接和0x3f(0011 1111)与运算,取低六位 00401301 |. A1 CCAE4200 MOV EAX,DWORD PTR DS:[j] 00401306 |. 8A8A 307A4200 MOV CL,BYTE PTR DS:[EDX+a] ; 查表 0040130C |. 8888 E3AE4200 MOV BYTE PTR DS:[EAX+0x42AEE3],CL ; 记录,eax+地址 00401312 |. 5F POP EDI 00401313 |. 5E POP ESI 00401314 |. 5B POP EBX ; 以上记录的数,都存储与内存,即不需返回值 00401315 |. 8BE5 MOV ESP,EBP 00401317 |. 5D POP EBP 00401318 . C3 RETN

3.对比分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYczemH3-1586698318415)(E:/Typora/image/1586698114415.png)]

另外两个尾数==的处理,其实也差不多,就不贴了……


欢迎大家留言交流。

最后

以上就是呆萌小笼包最近收集整理的关于base64反汇编base64反汇编的全部内容,更多相关base64反汇编base64反汇编内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(114)

评论列表共有 0 条评论

立即
投稿
返回
顶部