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
test eax,eax je Она вызывает код, ответственный за регистрацию и возвращающий в 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