联众密码的逆向算法
//作者:姜堰市合作银行-姚佩云 www.jynx.com.cn [email protected]
//首发大富翁论坛(www.delphibbs.com)blog,转载请尊重作者成果,保留此信息
闲来无事,每天上联众,联众的密码经过加密后保存在本地注册表里,看看是怎么加密的。下了个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;