Cracking for Newbies #2
Автор      : wOODY^dRN
Перевод    : Cluster^t53
Инструменты: SoftIce, w32dasm

Давайте поговорим о том как нам обращаться с программами, имеющими различные 
методы защиты.

Как победить nag'и:
-------------------

Есть несколько способов подавления nag-screen'ов и несколько видов самих nag'ов.

**Окно с кнопкой:

Попробуйте поставить брейкпойнт на на messageboxa. Если он сработает, то нажмите 
F12 ... теперь, когда nag появится, нажмите кнопку OK (или любую другую, которая 
там присутствует) - в СофтАйсе снова сработает брейк. Проверьте, в том ли файле 
вы находитесь ... если нет, то нажимайте F12, пока не окажетесь там.

Если вы в правильном файле, то справа в текущей строчке увидите вызов функции. 
Поднимитесь выше ... видите je/jne? да? вернитесь к ним или перепрыгните на них. 
Не видите je/jne ... жмите F12 ... скролльте выше, видите их? Если нет - делайте 
это, пока не увидите, а затем пропачьте je/jne. Заработало? Если нет - читайте 
дальше.

Если не получается с messageboxa - пробуйте getdlgitemtexta или getwindowtexta, 
повторяя аналогичные действия.

**Окно без кнопки

Ничего из вышеперечисленного не помогло... Ладно, тогда попробуем другой подход. 
Запустите программу и ждите появления nag'а. Есть? ага ... заходим в СофтАйс и 
набираем hnwd. Мы должны увидеть хэндлы окон, что-нидь например этого:

 0080(0)     2057   32  MSGSRV32   #32769 (desktop)  179F:00005622
 05D0(1)     52AF   32  IEXPLORE   Auto-Suggest Drop 140F:00000FC6

и так далее ... жмем Enter, пока не увидим нашу программу. Например, если ваша 
программа calc.exe, то увидим что-то вроде этого:

 0314(1)     3D27   32  CALC       SciCalc           484F:00000786

0314 - это хэндл окна, именно то, что мы используем для брейка. Вызов типа 
окно/окно делает несколько проверок, например, движения мыши, в фокусе ли окно и 
много других вещей. Но что нам надо знать, так это команду при закрытии окна. И 
это - WM_DESTROY. Отлично ... чтобы поставить брейкпойнт по хэндлу, мы 
используем комманду bmsg (breakpoint on window message). Наберите 'bmsg 0314 
WM_DESTROY'. Если вы наберете просто 'bmsg 0314', то брейк будет срабатывать 
каждый раз когда вы будете двигать мышью над окном, и каждый раз когда оно в 
фокусе ... и при всех других совершаемых коммандах/проверках. Но с WM_DESTROY 
брейк сработает только при закрытии окна. Теперь жмите F12, пока не окажетесь в 
нужном файле и ищите выше je/jne'ы ...

**Splash Screen'ы

Этот вид nag'ов обычно представляет собой окно без никаких кнопок, только с 
некоторыми назойливыми текстами. Первое, что вы должны сделать – это записать 
текст окна и его заголовка. Это может представлять из себя как что-то вроде 
этого:

+-------------------+
|ІPlease±Register±!°|
+-------------------+
| Register this nag |
|    only $200      |
+-------------------+

Теперь открываем наш любимый hex-редактор и ищем этот текст. Нашли? Скроллим 
вверх и ищем следующие байты FF FF FF 80 ... заменяем 80 на 90 и – nag уходит в 
небытие.

Как победить отключенные возможности:
------------------------------------

Программисты обычно ленивы ;) включая и меня ;) ... они часто делают функцию, 
которая отображает «Это возможность только для зарегистрированных 
пользователей!» или что-то наподобие этого. Вследствие этого обычно нам 
необходимо всего лишь пропатчить одно место.

**С помощью w32dasm:

Если вы новичок, то лучше сначала использовать w32dasm, поэтому загружаем его и 
начинаем искать текст. Если нашли его, то скрольте вверх до je/jne'н. Во многих 
случаях защита просто вот такая:

call <address>
test eax,eax
je   <address>

Она вызывает код, ответственный за регистрацию и возвращающий в eax 1 либо 0. 
Затем она test'ирует eax, чтобы узнать, содержит ли он ноль и если нет, то 
отобразить «Эта возможность ...»

Теперь можно войти в вызов и сделать так, чтобы он возвращал 0 в любом случае, 
или поменять je на jne или за'nop'ить его.

В Pascal'е это может выглядеть так:

begin
  check_if_registered;
  if registered=true then do_feature else display_nag;
end.

Этот вид защиты нормален! и *очень* легко ломаем.

**С помощью SoftIce:

Но вы также можете использовать СофтАйс для этого, просто поставьте брейк на 
оконные комманды (getwindowtexta, messageboxa, getdlgitemtexta и т.д.) и при 
срабатывании нажимайте F11 для перехода в вызывающий участок и проверки его на 
je/jne'ы.

Как победить серийники:
-----------------------

Тяжело писать об этом виде защиты, т.к. разница между методами получения 
серийников очень велика. Но *есть* несколько «одинаковых» способов сравнения 
неправильного серийника с правильным.

**Memory echo:

Будьте внимательны, когда видите код такого вида:

mov bl,[esi]
mov bh,[edi]
cmp bl,bh
jne ...

Сначала он помещает один байт хорошего серийника в esi, затем он помещает байт 
«плохого» (?) серийника в edi и сравнивает их. Если они не сходятся, то серийник 
неправильный.

Все что вам надо сделать – это набрать 'd esi' и серийник будет правильным. Еще 
один код, делающий эту же вещь:

mov ecx,length_of_valid_serial
repz cmpsw
je ...

Он помещает в ecx количество сравниваемых байтов и сравнивает строку ds:esi 
(правильный серийник) с es:edi (наш серийник). Просто наберите 'd esi' и 
серийник будет правильным.

Еще один код, перемещающий серийники:

push ecx
shr ecx,2
repz movsd
pop ecx
and ecx,3
repz movsv
xor dx
xor ax

Он сохраняет ecx, находит число копируемых слов и копирует их в es:di. ecx 
возвращается из стека и копируется в es:di.

Когда вы закончите с repz movsd напечатайте 'd ds:si' и вы должны увидеть
серийник и имя, ну или то, что вы там написали. Теперь напечатайте 'd es:edi'
и вы увидите место, куда ваша информация будет скопирована. Например
1243:00000000. Теперь напишите 'page 1243:00000000' и выскочит сто-то такое:

04D23000   C73B3000    P A U RW   System

Теперь вам нужно узнать из скольки байт состоит серийный номер, или вы можете
догадаться! Посомтрите в файл справки программы, может там что-нибудь есть об
этом.

напишите 'bpr 30:04d23000 30:04d2300A RW'

Это для 10-ти байтогово pwd, 04d23000+10 (10 = 0Ah) = 04d2300A.
Всегжа используйте селектор 30!

Теперь F5 и пусть sice снова выскочит... и снова F5 ... и теперь sice прервётся,
когда будет происходить чтение серийника. Умно, да?

Наверное это всё на сегодня... хочу сказать спасибо +orc и josephco за кое-какую
информацию.

-wOODY^dRN