Исследование и крэк WinRAR 3.10
Привет, снова я. Когда-то давно я ломанул WinRAR 3.0 beta, потом переустановил его, но снова ломать его уже было лень :) Хреново конечно видеть каждый раз наг-окошко: "Зарегистрируйтесь пожалуйста!". Пожалуйста, придется ломать. Денег у меня на это нет. Но помните, труд делает человека богатым! Без труда не выловишь и рыбки из пруда.

Объяснять буду, основываясь на листинге IDA. Кто не знает, что это, то это такой мощный дизассемблер. Достаточно сказать: SoftICE всегда может заменить w32dasm, а IDA не заменит никто. Но и весит он порядочно. Кто еще не скачал, забегите к DeMoNiX'у на reversing.kuilichki.ru - там всегда есть рабочая нормальная ссылка. Примерно должно весит мегабайт 30. Я видел архив и на 25 мегов, и на 15. Но это обрезанные версии, так что лучше уж много, но по полной! Ломать IDA не пытайтесь, лучше кряк возьмите(а я так скачал уже версию с ключом).
Кто таки не может укачать огромный IDA Pro, то используйте w32dasm, но оно не очень хорошо, это грозит вам неправильно понять суть.

Когда проходит 40 дней, WinRAR начинает показывать наг-окно с заголовком "Зарегистрируйтесь пожалуйста!". Берем редактор ресурсов(ExeScope, Restorator или еще что), откроем в нем winrar.exe и смотрим в Dialogs наш наг. Нашли. Он называется REMINDER. Запомнили.
Дизассемблируем теперь этот самый winrar.exe. Ждите, пока он раздизассемблирует до конца. Угу, вот. Когда дождались жмем Alt-T(или в меню Search->text). Пишем там слово REMINDER. Опять ждем, пока найдется. Все теперь мы вот в таком месте:

Код:
.text:0043BAE2 cmp dword_4A7E48, 0
.text:0043BAE9 jnz short loc_43BB38
.text:0043BAEB cmp byte_48F198, 0
.text:0043BAF2 jnz short loc_43BB38
.text:0043BAF4 cmp byte_4AFE58, 0
.text:0043BAFB jnz short loc_43BB38
.text:0043BAFD cmp byte_49710C, 0
.text:0043BB04 jnz short loc_43BB38
.text:0043BB06 mov eax, dword_4A877C
.text:0043BB0B cmp eax, 28h
.text:0043BB0E jg short loc_43BB14
.text:0043BB10 test eax, eax
.text:0043BB12 jge short loc_43BB38
.text:0043BB14 
.text:0043BB14 loc_43BB14: ; CODE XREF: sub_43B4FC+612j
.text:0043BB14 mov byte_48F198, 1
.text:0043BB1B push 0
.text:0043BB1D push offset sub_43F424
.text:0043BB22 push dword_4A57E0
.text:0043BB28 push offset aReminder ; "REMINDER" <<== Мы здесь
.text:0043BB2D push dword_497110
.text:0043BB33 call DialogBoxParamA
.text:0043BB38 
.text:0043BB38 loc_43BB38: ; CODE XREF: sub_43B4FC+5EDj
.text:0043BB38 ; sub_43B4FC+5F6j ...
.text:0043BB38 cmp dword_4A7E48, 0

Вы возможно знакомы с программированием. Я имею ввиду не ТрубоПаскаль, а программирование под Windows(и опять же не Visual Basic и Delphi со своим VCL). Я имею ввиду Windows API. Какая api-функция нужная для создания окна? Я использую DialogBox(...). Здесь используется DialogBoxParamA. Посмотрите в любой api-справочнике, какие параметры передаются этой функции(их пять):
DialogBoxParamA(HANDLE, LPSTR, HWND, LPDATA, DWORD)

Что есть что? Это вы посмотрите в C++Builder'е. Скажу лишь, что LPSTR - это строчка с названием диалога, а в нашем случае это REMINDER.
Вот смотрите:

Код:
.text:0043BB1B push 0
.text:0043BB1D push offset sub_43F424
.text:0043BB22 push dword_4A57E0
.text:0043BB28 push offset aReminder ; "REMINDER" <<== Мы здесь
.text:0043BB2D push dword_497110
.text:0043BB33 call DialogBoxParamA

Пять PUSH'ов? и один из них имеет значение REMINDER, а после этого вызов DialogBoxParamA, то бишь появление наг-окна. То есть вызов DialogBoxParamA будет такой:
DialogBoxParamA(dword_497110, "REMINDER", dword_4A57E0, offset sub_43F424, 0)
Но однако выше стоит несколько условных переходов. И все они прыгают на .text:0043BB38, избегая PUSH'ы и DialogBoxParamA ! Значит, если один из этих переходов сработает, то наг-окна не будет и наши нервы в порядке. Включаем логическое мышление. Раз показывается наг-окно, то ни один из переходов не срабатывает(а срабатывают они при опр. условиях, когда winrar зарегистрирован). Но если переход будет работать в обратном порядке, то прога станет работать как надо. Следовательно, кликаем на любой переход(например на .text:0043BB04 jnz short loc_43BB38). Смотрим в статус-строке 4-ю секцию(при наведении на нее показывается tip'ун Current Position in the input file). Запоминаем этот адрес и в хекс редакторе на этом месте меняем jnz на jz(там стоит 75, мы ставим 74). Если непонятно, как это проделать, то почитайте любую другую мою статью, там я описал как правильно изменять байты в HIEW. Когда вы поменяли байты, наг-окна быть не должно. Если оно есть, то значит вы что-то неправильно сделали.

Теперь осталось убрать в заголовке окна надпись (незарегистрированная копия). Если у вас русская версия, то именно такая надпись там и светится. В редакторе ресурсов откройте Strings и ищите там "незарегистрированная копия". Замените это на какой-нибудь англицкое слово и.. упс. Придется вам снова дизасмить, так как не знает IDA русских слов. Например, Вы сменили на слово "unreggged". Давайте для быстроты засунем прогу в w32dasm. Прописываем в поиске строку "unreggged". Можно было и не менять это слово на англицкое, если у вас w32dasm новее - он поддерживает кириллицу. Оказались в таком месте:

Код:
* Possible StringData Ref from Data Obj ->"%s - WinRAR"
|
:00445B23 68F2FD4800 push 0048FDF2
:00445B28 8D442408 lea eax, dword ptr [esp+08]
:00445B2C 50 push eax
:00445B2D E822B00300 call 00480B54
:00445B32 83C40C add esp, 0000000C
:00445B35 803D0C71490000 cmp byte ptr [0049710C], 00
:00445B3C 757A jne 00445BB8 <<==условный переход
:00445B3E A17C874A00 mov eax, dword ptr [004A877C]
:00445B43 83F814 cmp eax, 00000014
:00445B46 7C05 jl 00445B4D
:00445B48 83F828 cmp eax, 00000028
:00445B4B 7C1D jl 00445B6A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445B46(C)
|

* Possible Reference to String Resource ID=00873: "unreggged"
|
:00445B4D B869030000 mov eax, 00000369
:00445B52 E839A0FCFF call 0040FB90
:00445B57 50 push eax
:00445B58 8D942404020000 lea edx, dword ptr [esp+00000204]
:00445B5F 52 push edx
:00445B60 E877740300 call 0047CFDC
:00445B65 83C408 add esp, 00000008
:00445B68 EB27 jmp 00445B91

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445B4B(C)
|
:00445B6A B928000000 mov ecx, 00000028

* Possible Reference to String Resource ID=00874: "4;O ?>:C?:8 ;8F5=788 >AB0;>AL %d 4=59"
|
:00445B6F B86A030000 mov eax, 0000036A
:00445B74 2B0D7C874A00 sub ecx, dword ptr [004A877C]
:00445B7A 51 push ecx
:00445B7B E810A0FCFF call 0040FB90
:00445B80 50 push eax
:00445B81 8D942408020000 lea edx, dword ptr [esp+00000208]
:00445B88 52 push edx
:00445B89 E8C6AF0300 call 00480B54
:00445B8E 83C40C add esp, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445B68(U)
|
:00445B91 8D8C2400020000 lea ecx, dword ptr [esp+00000200]
:00445B98 51 push ecx
:00445B99 6897FC4800 push 0048FC97
:00445B9E 8D442408 lea eax, dword ptr [esp+08]
:00445BA2 50 push eax
:00445BA3 E864740300 call 0047D00C
:00445BA8 59 pop ecx
:00445BA9 8D542408 lea edx, dword ptr [esp+08]
:00445BAD 03C2 add eax, edx
:00445BAF 50 push eax
:00445BB0 E89FAF0300 call 00480B54
:00445BB5 83C40C add esp, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445B3C(C)
|
:00445BB8 54 push esp
:00445BB9 FF35E0574A00 push dword ptr [004A57E0]

* Reference To: USER32.SetWindowTextA, Ord:0000h
|
:00445BBF E89E4D0400 Call 0048A962
:00445BC4 81C400040000 add esp, 00000400

Привожу очень подробный листинг, чтобы удобно было понять. Если Вы запустите WinRAR, то будет следующее в заголовке окна:
WinRAR - WinRAR(unreggged)
Вот похожая строка - "%s - WinRAR". Если не сработает один условный переход, то к этой строке присоединится гадкое словечко (unreggged) и произойдет SetWindowTextA, то есть то, что будет в заголовке окна. Что мы с этого получаем, думаю ясно. Так что же это за переход такой, который не дает записать в заголовок окна гадость? Это JNE 00445BB8. Его в хекс-редакторе меняем на JE 00445BB8(байты менять с 75 на 74).
Осталось открыть снова бедный winrar.exe еще раз в редакторе ресурсов и подправить в ABOUTRARDIALOG слово "40-дневная копия" на что-нибудь из "Cracked by bi0w0rM" и т.д.

Ну вот, я все подробно описал, теперь грех не научиться ломать. Главная ошибка многих - ломка вслепую. Ломайте вдумчиво, понимайте, что к чему.

PS: Хоть наг-окно теперь не показывается и не мозолит глаза, в проге есть возможность использовать электронную подпись. Это уже не сломать, поэтому придется обойтись без нее. Но мне она никаким боком не нужна, эта гребанная эелектронная подпись!  :pardon: