base64反汇编

base64反汇编

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

#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)这个函数的汇编。

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)]

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


欢迎大家留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值