本程序参考了 愚自居 的 16位汇编 我校神州数码客户端解密
算法简介:
1.从密文字符串中一次取字符
第一次放入ah
第二次放入al
2.对于ah,检测是否是>=41H(A的ascii码)
如果条件成立,则减37H
否则与30H异或
左移四位
3.对于al,检测是否是>=41H
如果条件成立,则减37H
否则与30H异或
4.将al与ah相加,并与这一轮所对的密钥异或,放入明文字符串
5.如果没有遇到字符串结束符,转向步骤1,进行下一轮
结束:在明文字符串中写入字符串结束符
实现如下
#include
<
cstdlib
>
#include < iostream >
using namespace std;
int main( int argc, char * argv[])
... {
char key[20]=...{0x0B,0x1E,0x49,0x60,0x0F,0x78,0x27,0x5E,0x25,0x02,0x77,0x2A,0x55,0x20,0x35,0x7A,0x1B,0x0E,0x59,0x47};
char code[21]; //保存密文
char pass[21]; //保存明文
char code_t[255];
cout<<"请输入密文(注意大小写):";
cin>>code;
int i(0),j(0),k(0);
int ah,al;
while(code[i]!=0)
...{
if(k==0)
...{
ah=code[i];
if(ah>='A')ah=ah-0x37;
else ah^=0x30;
ah=ah<<4;
k++;
}
else
...{
al=code[i];
if(al>='A')al=al-0x37;
else al^=0x30;
//不移位了?
al=al+ah;
ah=key[j];
al^=ah;
pass[j++]=al;
k=0;
}
i++;
}
pass[j]=0;
cout<<"密码明文:"<<pass<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
#include < iostream >
using namespace std;
int main( int argc, char * argv[])
... {
char key[20]=...{0x0B,0x1E,0x49,0x60,0x0F,0x78,0x27,0x5E,0x25,0x02,0x77,0x2A,0x55,0x20,0x35,0x7A,0x1B,0x0E,0x59,0x47};
char code[21]; //保存密文
char pass[21]; //保存明文
char code_t[255];
cout<<"请输入密文(注意大小写):";
cin>>code;
int i(0),j(0),k(0);
int ah,al;
while(code[i]!=0)
...{
if(k==0)
...{
ah=code[i];
if(ah>='A')ah=ah-0x37;
else ah^=0x30;
ah=ah<<4;
k++;
}
else
...{
al=code[i];
if(al>='A')al=al-0x37;
else al^=0x30;
//不移位了?
al=al+ah;
ah=key[j];
al^=ah;
pass[j++]=al;
k=0;
}
i++;
}
pass[j]=0;
cout<<"密码明文:"<<pass<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
再次感谢 愚自居 所做的分析工作,没有他的汇编逆向算法,这个程序是写不出来的
我只是将他的汇编算法用C++重新实现了一遍而已
特此致谢