现有加密二进制文件一份,按规则进行解码
A. 转码后文件由0x1b, 0x4c开头
B. 跳过源文件前六个字节,每两个字节为一个循环节
C. 获取初始key,由md5("Hello" + 文件名)的前8位构成
D. 对初始key进行如下操作: (高4位 * 0x41A70000 & 0x7fff0000 + 低4位 * 0x41A7 + (高4位 * 0x41A7) >> 15)
E. 获得变换后的key,并右移15位获得小节key,与源文件7,8字节(即第一个循环节)进行异或,获得解密结果
F. 后面每个循环节,由当前变换后的key计算小节key与源文件进行异或,获得解密结果
#include<cstdlib>
using namespace std;
unsigned int getkey(unsigned int key)
{
unsigned int num=key;
num=num>>16;
key=(num*0x41a70000&0x7fff0000)+(key&0x0ffff)*0x41a7+((num*0x41a7)>>15);
//key=key>>15;
return key;
}
int main()
{
char hz[6][10]={0x07,0x08,'\0'};
printf("%s",hz);
unsigned int key;
key=0x105169c3;
char ch[2];
int a=0;
char str;
FILE * fp=fopen("d:\\assert.lua","rb"); //输入重定向,输入数据将从in.txt文件中读取
FILE * fp1=fopen("d:\\result.txt","a+"); //输出重定向,输出数据将保存在out.txt文件中
if(fp == NULL||fp == NULL)
{
printf("文件打开失败\n");
return 0;
}
int num;
while((num=fread( &str, sizeof( char ), 1, fp )),num!=0)
{
a++;
if(a<=6)
{
fwrite( &str, sizeof( char ), 1, fp1 );
//key=getkey(key);
continue;
}
if(a&1)
{
ch[0]=str;
//key=getkey(key);
// if(a==7)
// {
// printf("%x\n",str);
// }
}
else
{
ch[1]=str;
unsigned int newkey;
key=getkey(key);
newkey=key>>15;
if(a==8)
{printf("%x\n",newkey);}
char low[2];
//char high[2];
low[0]=newkey&0x00ff;
low[1]=(newkey>>8)&0x00ff;
//high[0]=(newkey>>16)&0x00ff;
//high[1]=((newkey>>16)>>8)&0x00ff;
low[1]^=ch[0];
low[0]^=ch[1];
fwrite( &low[1], sizeof( char ), 1, fp1 );
fwrite( &low[0], sizeof( char ), 1, fp1 );
//if(a==8)
//printf("%s%s\n",low[1],low[0]);
}
}
fclose(stdin);//关闭文件
fclose(stdout);//关闭文件*/
return 0;
}
A. 转码后文件由0x1b, 0x4c开头
B. 跳过源文件前六个字节,每两个字节为一个循环节
C. 获取初始key,由md5("Hello" + 文件名)的前8位构成
D. 对初始key进行如下操作: (高4位 * 0x41A70000 & 0x7fff0000 + 低4位 * 0x41A7 + (高4位 * 0x41A7) >> 15)
E. 获得变换后的key,并右移15位获得小节key,与源文件7,8字节(即第一个循环节)进行异或,获得解密结果
F. 后面每个循环节,由当前变换后的key计算小节key与源文件进行异或,获得解密结果
G. 最终输出文件
#include<iostream>
#include<cstdio>#include<cstdlib>
using namespace std;
unsigned int getkey(unsigned int key)
{
unsigned int num=key;
num=num>>16;
key=(num*0x41a70000&0x7fff0000)+(key&0x0ffff)*0x41a7+((num*0x41a7)>>15);
//key=key>>15;
return key;
}
int main()
{
char hz[6][10]={0x07,0x08,'\0'};
printf("%s",hz);
unsigned int key;
key=0x105169c3;
char ch[2];
int a=0;
char str;
FILE * fp=fopen("d:\\assert.lua","rb"); //输入重定向,输入数据将从in.txt文件中读取
FILE * fp1=fopen("d:\\result.txt","a+"); //输出重定向,输出数据将保存在out.txt文件中
if(fp == NULL||fp == NULL)
{
printf("文件打开失败\n");
return 0;
}
int num;
while((num=fread( &str, sizeof( char ), 1, fp )),num!=0)
{
a++;
if(a<=6)
{
fwrite( &str, sizeof( char ), 1, fp1 );
//key=getkey(key);
continue;
}
if(a&1)
{
ch[0]=str;
//key=getkey(key);
// if(a==7)
// {
// printf("%x\n",str);
// }
}
else
{
ch[1]=str;
unsigned int newkey;
key=getkey(key);
newkey=key>>15;
if(a==8)
{printf("%x\n",newkey);}
char low[2];
//char high[2];
low[0]=newkey&0x00ff;
low[1]=(newkey>>8)&0x00ff;
//high[0]=(newkey>>16)&0x00ff;
//high[1]=((newkey>>16)>>8)&0x00ff;
low[1]^=ch[0];
low[0]^=ch[1];
fwrite( &low[1], sizeof( char ), 1, fp1 );
fwrite( &low[0], sizeof( char ), 1, fp1 );
//if(a==8)
//printf("%s%s\n",low[1],low[0]);
}
}
fclose(stdin);//关闭文件
fclose(stdout);//关闭文件*/
return 0;
}