0x01 算法表达式总结
str2=(str1[i+1]>>2&0x1f|((str1&0x7)<<2))^0x15;
0x02 简单分析步骤:
首先查了下壳,发现查壳类型不同,疑为自写壳。
运行程序查看程序行为:
大致推断为通过用户名校验密码用调试器进行分析
0x03 调试器分析步骤
通过对用户名下内存断点,进行断点跟踪
通过内存断点跟踪找到内存地址为 0040741E算法起始部分
在IDA中的显示以及反编译代码
通过对整个程序段分析知道:
1.首先对输入的用户名字符串尾部追加一个首字符
2.之后对该字符串分组,分组方式为字符串中每个字符都与他后面的字符组成一
个分组
3.对该分组中的每一个字符处理,处理方式为
0x01 对第二个字符HEX进行算术右移2位得到的值与0x1F 逻辑与运算得到
值1
0x02 第一个字符HEX值 与0x7 逻辑与 得到的值 再进行算术左移2位的得到
的值再与上文值1进行逻辑或运算 得到的值再与0x15进行逻辑异或运算得到
的值的DEC为 当前分组在密码表中对应的字符
密码表为:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMTVMPROTECT310
算法代码
[C] 纯文本查看 复制代码 #include <stdio.h>
#include <string.h>
int main()
{
char str1[20]={0};
char str2[20]={0};
char str3[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMTVMPROTECT310";
int len=0,flag=0;
printf("请输入用户名");
scanf("%s",str1);
len=strlen(str1);
for(int i=0;i<len;i++)
{
if(i==len-1)
{
str2=(str1[0]>>2&0x1f|((str1&0x7)<<2))^0x15;/*(((str1[0]>>2)&0x1f)|(str1&0x7<<2))^0x15;*/
}
else
{
str2=(str1[i+1]>>2&0x1f|((str1&0x7)<<2))^0x15;/*(((str1[0]>>2)&0x1f)|(str1&0x7<<2))^0x15;*/
}
}
for(i=0;i<len;i++)
{
printf("%c",str3[str2]);
}
printf("\n");
return 0;
}
================================
超过10位正式会员同意,转正成功。
管理05
|