⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ain.txt

📁 关于黑客的论坛的下载资料
💻 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 + -