Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Регистрация WinRAR 3.0 - бесплатно

Автор: Bad_guy
WEB сайт: http://cracklab.narod.ru

Для тех, кто пришёл просто за крэком к WinRAR 3.0:
WinRAR 3.0 Full Rus с крэком - http://cracklab.narod.ru/dload/wrar300full.zip
Сам крэк для WinRAR 3.0 Full Rus - http://cracklab.narod.ru/dload/wrar3fp.zip

Наконец-то мои руки добежали по кнопкам до написания этой статьи, но идея кипела в моей голове уже долгое время, не давая мне есть, спать, ходить, сидеть, ну и так далее... неужели я успокоюсь после написания статьи, наверное НЕТ (идеи распирают голову вот-вот она лопнит, придёться экран вытирать... э-э-э, чего-то меня понесло, пора переходить к делу).

Одним прекрасным днём родилась идея обновить любимый архиватор ВинРАР, я зашёл на сайт rarsoft или rarlab (не помню как он тогда назывался) и, о чудо, увидел, что мне сейчас доступен WinRAR 3.00 beta 4, да ещё и русская версия, я получил вожделенные ~980Kb и, установив, заметил небезизвестное (через букву "ы") окошечко с 40 дневным предложением поюзать UNREGISTERED VERSION. Я не помню такого дня, чтоб я не воспользовался Winrar'ом хотя бы один раз и, естественно, наг окно через пару дней мне надоело и решил "Иванушка-дурачок" снять его НАВСЕГДА (ФОРЭВА - для тех, кто в танке).

Скажу сразу, что для осуществления взлома мне потребовался только отладчик SoftIce, но позже понадобился и шестнадцатиричный редактор (WinHEX) и Delphi, а ещё текстовый редактор Bred, чтобы писать эту статью.

Допустим, вы запустили WinRAR 3.0, увидели всё то же окошко и задумались какой же ставить брэйкпойнт? Я тоже когда-то над этим задумался и что-то придумал, что - сейчас уже выветрилось из головы... попробую вспомнить (засечём время). Прошло 10 минут... напрочь забыл - начал врубаться по-новой. Говоришь, 40 дней - ставим брэйк в SoftIce:


:bpx GetLocalTime

Говоришь - "незарегистрированная версия" в заголовке окна - получай


:bpx SetWindowTextA

Теперь, как сделает программист: Сначала поставит "незарегистрированная версия" в заголовке окна, а потом узнает время - вряд ли, что подтверждается на практике. Попробуем, насколько "солёненький" WinRAR нам попался - запускаем его.


004367B3 - здесь у нас GetLocalTime;
0043FA27 - а здесь SetWindowTextA;

Скорее всего между этими двумя адресами и будет вычисление "зарегистрированности" версии. Сразу после 004367B3 идёт вызов какой-то процедуры, которая возвращает результат в AL в виде 0 или 1, а затем значение AL закидывается в некоторый адрес памяти. Поглядев внимательно внутрь этой процедуры, я заметил, что она начинает проверять файл RARReg.Key (я не сказал: у меня был легальный ключик для 2.9 версии, я его положил первым делом в папку с новым WinRAR 3.0), пока я смотрел процедуру я успел понять, что в принципе она должна как-то возвратить значение AL не 0, а 1, но я пошёл дальше. AL закидывается в некоторый адрес памяти - я заменил значение AL перед этим и "отпустил" программу на выполнение, программа загрузилась как "незарегистрированная", но когда она прервалась по SetWindowTextA при создании НАГ-окна я посмотрел в тот адрес памяти, где должна была быть 1 и увидел там 0 и тут я решил поставить брэйкпойнт на память и посмотреть, что программа всё-таки делает с этой переменной ?


:bpm 48dd1c rw

За всё количество прерываний по этому брэйку, два раза пришлось сменить значение по этому адресу (48dd1c) с 0 на 1 (команда :eb - для тех, кто не знает) и увидел на экране зарегистрированную версию WinRAR 3.0 beta 4 Rus. Посмотрим, где же в память записывается 0, в какой процедуре ? - а в той же, что и в первом случае, значит просто находим место в ней где сделаем, чтобы в AL ВСЕГДА возвращалось значение 1 и будем писать крэк для WinRAR 3.0 beta 4 Rus.

Как оказалось технология та же и для WinRAR 3.0 Full, но я думаю, что с легкостью по этому же принципу можно будет создать кряк и для WinRAR 3.1, 3.2 и может 3.3, ну а потом уж автор WinRAR (мультимиллионер супершароварщик Евгений Рошал или его наёмники) найдут в инете эту статейку и закроет лазейку, а мы постараемся найти другую !

Что-то у меня получилось не внятно как-то, ладно в таком случае дам я вам ещё исходники патчера для WinRAR 3.00 Full (между прочим для минимизации размера написал я его на Delphi без использования VCL, то есть на WinAPI):

PATCHER.DPR


program Patch;

uses windows, messages, shellapi;

const
  ar: array[1..6] of byte = ($E8, $BD, $07, $00, $00, $58);
  ar2: array[1..6] of byte = ($B8, $01, $00, $00, $00, $90);
var
  msg: tmsg;
  win: hwnd;
  bol: boolean;
  i, b: byte;
  f: file of byte;

{$R API.RES}

procedure CreateReg;
var
  f1: textfile;
  str: lptstr;
begin
  Assignfile(f1, 'RarReg.b_g');
  rewrite(f1);
  Writeln(f1, 'RAR registration data');
  Writeln(f1, 'Bad_guy');
  Writeln(f1, 'Advanced GOD Pro version');
  Writeln(f1, 'UID=fd402b81950501fbd1a1');
  Writeln(f1, '6412212250d1a118e384ae1996cdea4f90d100b3dcd53ea5fa77c2');
  Writeln(f1, 'a2a9458b4636334c81d46035c6ab9048e2c5c62f0238f183d28519');
  Writeln(f1, 'aa87488bf38f5b634cf28190bdf438ac593b1857cdb55a7fcb0eb0');
  Writeln(f1, 'c3e4c2736090b3dfa45384e18e9de05c5860c0cbfb4a4cbbe9549e');
  Writeln(f1, 'b4ca3bc23f80d0cde2d91ba211839f05b0a5de11631072687e814d');
  Writeln(f1, 'd0fa0ace9439b90564d3ba7de5413d0824487a50f64e6ea360c858');
  Writeln(f1, 'ee31cdacb655824a7a443ec0da598dfb6e79f305d8bf4260523534');
  closefile(f1);
end;

function SettingsDlgProc(Window: hWnd; Msg, WParam, LParam: Integer): Integer;
  stdcall;
var
  S: string;
begin
  Result := 0;
  case Msg of
    wm_InitDialog:
      begin
        Result := 0;
      end;
    wm_Command:
      begin
        case LoWord(WParam) of
          50:
            begin
              AssignFile(f, 'winrar.exe');
{$I-}
              Reset(f);
{$I+}
              if IoResult <> 0 then
                Messagebox(Win, 'An error ocured while opening file', 'Error',
                  MB_OK)
              else
              begin
                if Filesize(f) = 752640 then
                begin
                  Seek(f, $B26A);
                  bol := true;
                  for i := 1 to 6 do
                  begin
                    Read(f, b);
                    if b <> ar[i] then
                      bol := false;
                  end;
                  if bol then
                  begin
                    Seek(f, $B26A);
                    for i := 1 to 6 do
                      Write(f, ar2[i]);
                    Closefile(f);
                    CreateReg;
                    Messagebox(win, 'Patched succesfully', 'Congratulation',
                      MB_OK);
                  end
                  else
                    Messagebox(win, 'An error ocured while patching', 'Error',
                      MB_OK);
                end
                else
                  Messagebox(win, 'Wrong file size', 'Error', MB_OK);
              end;
            end;
          DestroyWindow(Win);
          Messagebox(Win, PChar('Автор крэка: Bad_guy Выпущен:' +
            '25.07.02 Ограничения: вы не сможете использовать "электронную' +
            'подпись" Адрес программы:' +
            'http://cracklab.narod.ru/dload/wrar300full.zip'), 'About', MB_OK);
          ShellExecute(win, 'open', PChar('http://cracklab.narod.ru/'), nil,
            nil, SW_MAXIMIZE);
        end;
      end;
    wm_Close: DestroyWindow(Win);
    wm_Destroy: PostQuitMessage(0);
  else
    Result := 0;
  end;
end;

procedure RunSettings;
var
  Result: Integer;
begin
  Win := CreateDialog(hInstance, PCHar(101), 0, @SettingsDlgProc);
  Showwindow(Win, SW_SHOW);
  Updatewindow(Win);
end;

begin
  RunSettings;
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.

API.RC


101 DIALOG 0, 0, 266, 95
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUPWINDOW |
WS_DLGFRAME
CAPTION "WinRAR 3.00 Rus Patch by Bad_guy"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "Patch", 50, 13, 73, 59, 14
PUSHBUTTON "Cancel", 51, 188, 73, 65, 14
CTEXT "[-== Bad_guy ==-] \n Remove 40-day limit and NAG-screen \n i'm a genius,
you are a shit", 100, 13, 42, 240, 27, SS_SUNKEN
CONTROL 101, -1, "STATIC", SS_BITMAP | SS_CENTERIMAGE | SS_REALSIZEIMAGE |
SS_SUNKEN, 13, 8, 240, 30
PUSHBUTTON "About", 53, 75, 73, 50, 14
PUSHBUTTON "Our Website", 54, 130, 73, 54, 14
}

Удачи вам в вашей деятельности, чем бы вы ни занимались, Bad_guy.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay