联众密码的逆向算法公布

 更新时间:2008年04月14日 19:51:39   作者:  
闲来无事,每天上联众,联众的密码经过加密后保存在本地注册表里,看看是怎么加密的。下了个ollydbg,一路跟踪,发现算法极其简单,给出Delphi版本的解密算法(加密部分有兴趣的一起来讨论)。算法比较粗糟,谁帮优化一下:)



function Decode(aValue:String):string;
var
    iValue:array [0..63]of Byte;
    i,j,k,iAL,iCL:Byte;
    Pass:array[0..15]of char;  //密码最长不超过15位
begin
    //str to int
    i:=0;
    j:=0;
    while (1=1) do
    begin
        //这里需要改进
        j:=Pos(' ',aValue);
        if j<=0 then
        begin
            iValue[i]:=strToint(aValue);
            break;
        end;
        iValue[i]:=StrToInt(Copy(aValue,1,j-1));
        inc(i);
        aValue:=copy(aValue,j+1,length(aValue)-j);
    end;

    //xor
    for i:=63 downto 1 do
        iValue[i-1]:=iValue[i-1] xor iValue[i];

    //
    for i:=15 downto 1 do
    begin
        iAL:=iValue[i];
        iCL:=iAL;
        ASM
            MOV AL,iAL
            SAR AL,4
            AND AL,$F
            MOV iAL,AL
        end;    //直接用SHR也可以,不过反汇编是SAR,pascal里没有SAR   
        j:=iAL+$30;
        iAL:=iValue[j];
        iCL:=iCL and $f;
        iCL:=iValue[0]+iCL;
        k:=iCL;
        iCL:=iValue[k];
        iValue[j]:=iCL;
        iValue[k]:=iAL;
    end;

    i:=iValue[0];
    j:=1;
    while iValue[i]<>0 do
    begin
        Pass[j-1]:=chr(iValue[i]);
        Inc(i);
        Inc(j);
    end;

    Result:=Pass;
end;  

相关文章

最新评论