📄 ain.txt
字号:
关于AIN 2.2的PASSWORD
小弟近日在自己的备份文件中找到一个AIN 2.2压缩的文件,也不知是
什么时候压的了,自己加了密码,但忘了.虽不是什么重要的东西,但却激发
自己对AIN密码的兴趣.AIN的PASSWORD最长可是60字符(简直痴线),可能是
DOS下最长的了.按User's guide中的说法,可能的组合为 2.8e14, "hence,
if you forgotten the password,you may regard the information as
lost--BY AIN",但通常输密码只用4-8个字符,对此我们还是可解出来的.
在下才疏学浅,未能完全解决问题,望有兴趣或已解决的战友提供帮助.
AIN 的文件由三部分组成:
1,文件头,24字节,记录AIN的开关参数,密码校验和,日期时间等.
2,文件压缩数据,不定长
3,文件尾,被压缩文件信息(可能不对),不定长,与被压缩文件个数有关.
利用文件头数据,可用穷举法(笨!)来计算出密码.
BTW:古龙有云:最笨的方法,往往是最有效的方法.
如有以下文件头:
① ② ③ ④ ⑤ ⑥
21 12 00 80 33 78 00 00 01 00 62 64 26 22 36 00
^^^^^^^^^^^ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ^^^^^
⑦ ⑧
00 00 F8 15 00 00 E5 56
^^^^^ ~~~~~ ~~~~~
①AIN开关参数
②密码校验和
③被压缩文件数
④时间
⑤日期
⑥文件尾开始字节
⑦文件尾校验和
⑧以上22字节校验和
以下方法是用所有可能的字符串去计算密码校验和,问题来了!合适的字串不
只有一个!如你输入的PASSWORD是kiss,则uppj,pncu,ljjy等都可过得AIN的第
一关.但在解压文件时告诉你CHECK SUM(校验和)出错.那AIN应还有办法确定这
唯一的密码.可惜我已实追不出来了,或还有什么更好的方法,望新月的各路高手
不吝赐教,多谢.
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//以下的first和last分别为密码的范围,最保险当然是1-255,但通常密码都不外
//是字符,数字.(0是AIN PASSWORD是结束标志)
#define first 'a'
#define last 'z'
union DATA
{
unsigned int buf[48];
unsigned char cbuf[96];
}data,temp;
//密码串保存空间
unsigned int i=0,j=0,sum=0;
unsigned int code(void);
void main()
{
unsigned char c_flag=1;
unsigned char ct=1;
while(!temp.cbuf[9]) //只计算10位,有需要可设到最大值59,计到爆机!
{
for (j=first;j<=last;j++)
{
temp.cbuf[0]=j;
for (i=0;i<0x60;i++) //密码串必须清零
data.cbuf[i]=0;
strcpy(data.cbuf,temp.cbuf);
if (code()==0x7833) //此处0x7833即上例中第5,6字节.
printf("=%s\n",temp.cbuf);
}
ct=1;
c_flag=1;
while (c_flag==1) //产生测试用的字串
{
if (temp.cbuf[ct]==last)
{
temp.cbuf[ct]=first;
c_flag=1;
}
else
{
temp.cbuf[ct]=(temp.cbuf[ct]==0)?first:++temp.cbuf[ct];
c_flag=0;
}
++ct;
}
}
}
unsigned int code(void)
{
//置初值:
//设置一长度为96的缓冲区(data.buf),将密码的第一,二字分别放在BX,DX寄存器
//AX寄存器中置初值0x1234
asm {
mov ax,0x1234
xor bx,bx
mov bl,byte ptr temp.cbuf[0]
xor dx,dx
mov dl,byte ptr temp.cbuf[1]
}
//AIN SAY:要重复此计算9次
for (i=0;i<9;i++)
{
asm {
mov cx,0x60
mov si,offset data.buf
}
//计算密码的校验和,步骤一:60个字符自加,XOR,注意用的是带进位加法
//BTW:好象不久前有位网上的朋友问serial No的计算方法,似乎此法也蛮可以.
begin:
asm{
mov di,dx
mov bp,bx
add dx,1
adc bx,di
adc ax,bp
dec cx
jz exit
xor [si],ax
add si,2
dec cx
jne begin:
}
exit:
}
//步骤二:将上述60字节分成三组整型值(16位):0,6,12...一组;2,8,14...一组;
//4,10,16...一组.各自用带进位加法得三整型值,再将此三个值相加,即得密码
//校验和.压缩后的文件数据,还要和此三整型值作XOR运算,因此以正确的校验
//和所得之字串作密码,在解压时还是会提示CRC错.
asm{
mov si,offset data.buf
mov cl,1
xor dx,dx
mov bx,dx
mov ax,bx
}
start:
asm{
add si,6
inc cl
add ax,[si-2]
adc bx,[si-4]
adc dx,[si-6]
cmp cl,0x10
jbe start
mov sum,ax
add sum,bx
add sum,dx
}
return sum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -