Как же давно я не писал в блог, просто какой-то ужас. Я уже даже забыл, что собирался завершить цикл постов про автоматическую установку ключей для антивируса Nod32.
Итак, что осталось сделать. А всего лишь программу, которая бы забирала ключи с сервера (отдающий их скрипт уже написан) и устанавливала в систему. Для начала хочу объявить функцию для нормального отображения русского языка при получении страницы:
function RussianToUnicode(S: String): String;
var
Wrd: Word;
pW,pR: PWord;
len: integer;
begin
pW:=@S[1];
len:=Length(S);
SetLength(Result,len);
pR:=@Result[1];
while Len<>0 do
begin
Wrd:=pW^;
case Wrd of
$C0..$DF,$E0..$FF:pR^:=Wrd+50;
else pR^:=Wrd;
end;
inc(pW);
inc(pR);
dec(Len);
end;
end;
Укажем константы и переменные:
const
serv = 'your-server.com';
pcid = '75434347623';
var
can: boolean;
keynod, hashnod: string;
На форму кинем TButton и TIdHttp. Для TButton в событии OnClick пропишем следующее:
// получаем ключ (ну или хотя бы пытаемся)
try
if (can) then temp:=RussianToUnicode(idHTTP.get('http://'+server+'/key4nod.php?type=2&pcid='+pcid));
except
// в случае ошибки - снимаем флажок
can:=false;
end;
// если нет новых ключей, снимаем флажок
if (temp = 'Нет новых ключей') then can:=false;
if (can) then keynod:=temp; // запоминаем ключ
// получаем хеш пароля (ну вообще это не хеш, а видимо зашифрованный пароль
// и сохраненный в бинарном виде - главное, что на разных компах этот "хеш"
// не меняется (по крайней мере на проверенных мной трех компах)
try
if (can) then temp:=RussianToUnicode(idHTTP.get('http://'+server+'/key4nod.php?type=5&pcid='+pcid+'&key='+keynod));
except
// надоели уже проверки, но что же поделать...
can:=false;
end;
// бинарный код получили - можно продолжать
if (can) then hashnod:=temp;
if (can) then
begin
codes:=TStringList.Create;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
i:=0;
temp:='';
while Pos(' ', hashnod)>0 do
begin
temp:=Copy(hashnod, 1, Pos(' ', hashnod)-1);
Delete(hashnod, 1, Pos(' ', hashnod));
Buf[i]:=StrToInt(temp);
inc(i);
end;
// и пытаемся установить ключ в систему (должно быть выключено SelfDefendece)
try
Reg.OpenKey('SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile', True);
Reg.WriteString('Username', keynod);
Reg.WriteBinaryData('Password', Buf, SizeOf(Buf));
Reg.CloseKey;
Reg.Free;
except
ShowMessage('Ошибка при установке ключа');
end;
codes.Destroy;
end;
Ну вот как-то так это и будет. Программа передает серверу id устройства, получает от него ключ в случае наличия такового, получает хеш ключа, формирует его в необходимом для записи в реестр в бинарном виде и затем производит непосредственно запись.
Да, чуть не забыл о самом главном. У антивируса должен быть снять флажок напротив пункта «Self-Defendece» так как иначе он будет защищать себя и не даст заменить свои настройки в реестре.