Автор: DarkSlider <darkslider@list.ru>
Это моя первая статья поэтому прошу особо не пинать.
Я видел статьи о том как ламать WinRar но там для начинающих к коим и я наверно отношусь, сложновато. Вот вариантик попроще, для меня во всяком случае.
Цель:
WinRar 3.22
Инструменты:
Windasm – дизасеммблер
Hiew – HEX-редактор
Restorator – редактор ресурсов.
У меня WinRar английская версия поэтому текст на инглише, но полностью совпадает с руским вариантом. Итак начнем. Я копал WinRar очень долго, но сразу напишу то что понаходил, не вдаваясь во все тупики в которые я влезал по самое немогу.
Сначала я просмотрел ресурсы WinRara Restoratorom. И нашел очень интересные строки в String ресурсе № 55:
870 Registration failed 871 Thank you for support 872 Correct registration 873 evaluation copy 874 only %d days left to buy a license
И это натолкнуло меня на мысль что перед вызовом ресурса 872 должно быть какое-то сравнение (не спрашивайте почему просто должно :) ).
Перед дизасемблированием файла WinRar.exe (да и вообще любого экзешника я обычно создаю файлы *.exx *.w32 прочитал об этом в одном туториале на Инглише) WinRar.exx WinRar.w32.
После создания файлов дизасемблим файл WinRar.w32.
Заходим в String References и находим наш ресурс.
String Resource ID=00872: "Correct registration"
Щелкаем по нему и видим:
* Possible Reference to String Resource ID=00872: "Correct registration" | :0043E2CA B868030000 mov eax, 00000368 :0043E2CF E84424FDFF call 00410718 :0043E2D4 50 push eax * Possible Reference to String Resource ID=00871: "Thank you for support" | :0043E2D5 B867030000 mov eax, 00000367 :0043E2DA E83924FDFF call 00410718 :0043E2DF 50 push eax :0043E2E0 FF35FCC44A00 push dword ptr [004AC4FC] * Reference To: USER32.MessageBoxA, Ord:0000h | :0043E2E6 E8811A0500 call 0048FD6C :0043E2EB EB0B jmp 0043E2F8
Оба ресурса 872 и 871 передаются функции по адресу 00410718. Хорошо, а теперь посмотри что находится чуть выше:
:0043E2B7 E840ECFCFF call 0040CEFC :0043E2BC 8BD8 mov ebx, eax :0043E2BE 881D3CDD4900 mov byte ptr [0049DD3C], bl :0043E2C4 84DB test bl, bl :0043E2C6 7425 je 0043E2ED :0043E2C8 6A30 push 00000030
А выше находится сравнение регистра bl с нулем. Интересно... Меня тут с неизвесно какого раза посетила мысль посмотреть через поиск а где еще изменяется значение по адресу 0049DD3C.
И я пустил на поиск строку:
mov byte ptr [0049DD3C]
Она встречается аж 6 раз:
:0043E2B7 E840ECFCFF call 0040CEFC :0043E2BC 8BD8 mov ebx, eax :0043E2BE 881D3CDD4900 mov byte ptr [0049DD3C], bl
:0043E607 E8F0E8FCFF call 0040CEFC :0043E60C A23CDD4900 mov byte ptr [0049DD3C], al
:00447DC8 E82F51FCFF call 0040CEFC :00447DCD A23CDD4900 mov byte ptr [0049DD3C], al
:0044870F E8E847FCFF call 0040CEFC :00448714 8BD8 mov ebx, eax :00448716 881D3CDD4900 mov byte ptr [0049DD3C], bl
:0044B120 C6053CDD490000 mov byte ptr [0049DD3C], 00
:0045C8C3 E83406FBFF call 0040CEFC :0045C8C8 A23CDD4900 mov byte ptr [0049DD3C], al
Причем самое интересное в том что 5 раз после вызова функции:
call 0040CEFC
И... в 1 и 3 случае из-за команд mov ebx, eax мы получаем не что иное как в 5 случаев из 6-ти перенос значения регистра al в байт по адресу [0049DD3C].
Тогда меня осенило, а что будет если в al будет 1 а не 0 после возврета из функции. Функция имеет такой вид:
* Referenced by a CALL at Addresses: |:0043E2B7 , :0043E607 , :00447DC8 , :0044870F , :0045C8C3 | :0040CEFC 55 push ebp :0040CEFD 8BEC mov ebp, esp :0040CEFF 81C404F0FFFF add esp, FFFFF004 :0040CF05 50 push eax :0040CF06 81C448FDFFFF add esp, FFFFFD48 :0040CF0C 53 push ebx :0040CF0D 56 push esi :0040CF0E 57 push edi :0040CF0F 8885E3FEFFFF mov byte ptr [ebp+FFFFFEE3], al :0040CF15 BE38D74900 mov esi, 0049D738 :0040CF1A B848174900 mov eax, 00491748 :0040CF1F E82C5A0700 call 00482950 :0040CF24 8D95C8FAFFFF lea edx, dword ptr [ebp+FFFFFAC8] * Possible StringData Ref from Data Obj ->"rarreg.*" | :0040CF2A B843104900 mov eax, 00491043 :0040CF2F E839EDFFFF call 0040BC6D :0040CF34 84C0 test al, al :0040CF36 7514 jne 0040CF4C :0040CF38 33C0 xor eax, eax :0040CF3A 8B95E4FEFFFF mov edx, dword ptr [ebp+FFFFFEE4] :0040CF40 64891500000000 mov dword ptr fs:[00000000], edx :0040CF47 E9D0050000 jmp 0040D51C ... * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0040CF47(U), :0040CFB7(U), :0040D0DD(U), :0040D12D(U), :0040D2A5(U) |:0040D350(U), :0040D3C3(U), :0040D461(U), :0040D4F2(U) | :0040D51C 5F pop edi :0040D51D 5E pop esi :0040D51E 5B pop ebx :0040D51F 8BE5 mov esp, ebp :0040D521 5D pop ebp :0040D522 C3 ret
И что же я увидел?
:0040CF38 33C0 xor eax, eax
Зануление eax (и al соответственно) и решил это исправить. Глянул адрес данной строки в WinDasme это C538h.
Открыл файл WinRar.exe при помощи Hiew.
Нажал два раза Enter для перехода в режим ассемблерных кодов. Нажал F5 ввел адрес C538 и переместился на нужную мне команду. Затем нажал F3 для редактирования и F2 для ввода кода на асме. Ввел код mov al,1 или в кодах B001 все сохранил и вышел. При торжественном запуске нет ни НАГа (который меня чуть из себя не вывел ну просто достал уже), ни надписи evaluation copy.
З.Ы. Данная статья написана только в целях обучения. Если вам очень понравился WinRar то лучше его купите. Писал как мог, старался чтоб всем было понятно, потому как сам читаю статьи и не всегда все понимаю.
DarkSlider <darkslider@list.ru>
Материалы находятся на сайте http://cracklab.narod.ru/doc/