//作者:姜堰市合作银行-姚佩云 www.jynx.com.cn i_rock_1001@163.com //首发大富翁论坛(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; | |