program getzcm; {$APPTYPE CONSOLE} uses
SysUtils,
Registry,
Windows; var
Reg: TRegistry;
buf: PByteArray;
size: Integer;
mask: array[0..19] of Byte = ($52,$D6,$E2,$E9,$EA,$F0,$CC,$F2,$35,$64,$07,$AD,$82,$C8,$78,$75,$9F,$31,$45,$BC); i: integer;
username, password: string;
begin
try
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly('SOFTWARE\Eset\Nod\CurrentVersion\Modules\Update\Settings\Config000\Settings') then
begin
username := Reg.ReadString('Username');
size := Reg.GetDataSize('Password');
GetMem(buf, size);
Reg.ReadBinaryData('Password', buf^, size); i := 0; while i < size - 1 do
begin
password := password + chr(buf[i] xor mask[i]);
Inc(i, 2);
end; WriteLn('Username: ' + username);
WriteLn('Password: ' + password);
end;
finally
Reg.CloseKey;
Reg.Free;
end;
except
on E: Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
--------------------------------------------------------------------------------------以上是代码原文,我没有学delhpi 看不大懂这是我理解的:
buf: PByteArray;//这个我不知道作什么username := Reg.ReadString('Username'); // 是读注册表的项值
size := Reg.GetDataSize('Password'); //这个是不是读注册表中password值的 字符长度 ?
GetMem(buf, size);//这个我上网查是说分配内存,不明白做什么
Reg.ReadBinaryData('Password', buf^, size); //这个完全不明白这个意思 i := 0; while i < size - 1 do
begin
password := password + chr(buf[i] xor mask[i]); //这个是把 buf[i] 和 mask[i] 进行异或比较取值 不明白buf[i]是什么? 和 mask[i]就是 mask: array[0..19] of Byte = ($52,$D6,$E2,$E9,$EA,$F0,$CC,$F2,$35,$64,$07,$AD,$82,$C8,$78,$75,$9F,$31,$45,$BC);这个 ?? Inc(i, 2); // 这个不清楚
end; WriteLn('Username: ' + username); //这里是写出换算好的值
WriteLn('Password: ' + password); //这里是写出换算好的值我主要是知道这个算法的原理,我学的是易语言,看这个看不懂。希望赐教!!!感激不尽
SysUtils,
Registry,
Windows; var
Reg: TRegistry;
buf: PByteArray;
size: Integer;
mask: array[0..19] of Byte = ($52,$D6,$E2,$E9,$EA,$F0,$CC,$F2,$35,$64,$07,$AD,$82,$C8,$78,$75,$9F,$31,$45,$BC); i: integer;
username, password: string;
begin
try
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly('SOFTWARE\Eset\Nod\CurrentVersion\Modules\Update\Settings\Config000\Settings') then
begin
username := Reg.ReadString('Username');
size := Reg.GetDataSize('Password');
GetMem(buf, size);
Reg.ReadBinaryData('Password', buf^, size); i := 0; while i < size - 1 do
begin
password := password + chr(buf[i] xor mask[i]);
Inc(i, 2);
end; WriteLn('Username: ' + username);
WriteLn('Password: ' + password);
end;
finally
Reg.CloseKey;
Reg.Free;
end;
except
on E: Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
--------------------------------------------------------------------------------------以上是代码原文,我没有学delhpi 看不大懂这是我理解的:
buf: PByteArray;//这个我不知道作什么username := Reg.ReadString('Username'); // 是读注册表的项值
size := Reg.GetDataSize('Password'); //这个是不是读注册表中password值的 字符长度 ?
GetMem(buf, size);//这个我上网查是说分配内存,不明白做什么
Reg.ReadBinaryData('Password', buf^, size); //这个完全不明白这个意思 i := 0; while i < size - 1 do
begin
password := password + chr(buf[i] xor mask[i]); //这个是把 buf[i] 和 mask[i] 进行异或比较取值 不明白buf[i]是什么? 和 mask[i]就是 mask: array[0..19] of Byte = ($52,$D6,$E2,$E9,$EA,$F0,$CC,$F2,$35,$64,$07,$AD,$82,$C8,$78,$75,$9F,$31,$45,$BC);这个 ?? Inc(i, 2); // 这个不清楚
end; WriteLn('Username: ' + username); //这里是写出换算好的值
WriteLn('Password: ' + password); //这里是写出换算好的值我主要是知道这个算法的原理,我学的是易语言,看这个看不懂。希望赐教!!!感激不尽
buf[i]没有值 怎么比较?
begin
password := password + chr(buf[i] xor mask[i]);
Inc(i, 2);
end; 难道是这句? 应该是异或再转换成字符,拼成字符串吧
帮助里GetDataSize的说明,长度xor没有值默认buf[i]=$00 ,这个是我懵的 呵呵
我就不明白 mask: 有这个值 array[0..19] of Byte = ($52,$D6,$E2,$E9,$EA,$F0,$CC,$F2,$35,$64,$07,$AD,$82,$C8,$78,$75,$9F,$31,$45,$BC);
buf[i]没有值 怎么比较?
怎么个异或比较的 没有值啊异或,二进制运算.可逆运算.1 xor 1=0, 0 xor 0=0, 1 xor 0=1, 0 xor 1=1.
a xor b的运算方法:将a,b 转化为2进制数,再进行对比,每个数位上的0或1如果相同,那么结果就取0,如果不同就取1,将得到的结果转化为原来进制的数,就是结果.
buf[1]就是这段内存第二个字节
...这些都太基础了和具体语言没有关系,都是计算机原理,楼主还是多看看书,多找找资料吧。