概述
base64反汇编
文章目录
- base64反汇编
- 1.C语言代码(base64加密)
- 2.base64反汇编
- 3.对比分析
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.对比分析
另外两个尾数==的处理,其实也差不多,就不贴了……
欢迎大家留言交流。
最后
以上就是呆萌小笼包为你收集整理的base64反汇编base64反汇编的全部内容,希望文章能够帮你解决base64反汇编base64反汇编所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复