Автозамена ключей Nod32 (запись #2)

Как же давно я не писал в блог, просто какой-то ужас. Я уже даже забыл, что собирался завершить цикл постов про автоматическую установку ключей для антивируса 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» так как иначе он будет защищать себя и не даст заменить свои настройки в реестре.

    • Телевизор
    • Февраль 10th, 2011 3:49дп

    Мммм…. как эта слащава программка выглядит,
    У меня похожая ситуация…
    Буду Вам очень признателен если выложите дистрибутив

    • Max
    • Март 6th, 2011 12:32дп

    Сервер обновления http://nod.oaziz.net.ua/ не требует наличия ключей. Инструкция по настройки внутри.

      • admin
      • Март 6th, 2011 10:58пп

      Если для домашних компьютеров это можно использовать, то для бизнеса все же безопаснее лицензионный ключ и скачивание обновления с официального сервера

  1. Трэкбэков пока нет.