
SoftIce для начинающих
Программа, которая может все
Xakep, номер #035, стр. 035-053-3
Самыми часто используемыми Win API функциями являются:
MessageBoxIndirect - работа с окном сообщений. Используется в 16-битных приложениях.
MessageBox - работа с окном сообщений. Используется в 16-битных приложениях.
MessageBoxA - то же самое, но 32-битное приложение.
MessageBoxIndirectA - то же самое, что и MessageBoxIndirect, но 32-битное приложение.
GetWindowText - обычная строка ввода типа Windows Edit. Используется в 16-битных приложениях.
GetWindowTextA - то же самое, но 32-битное приложение. Строки используются однобайтовые.
GetDlgItemText - примерно то же, что и предыдущая функция, отличия в деталях. Используется в 16-битных приложениях.
GetDlgItemTextA - то же самое, но 32-битное приложение. Строки используются однобайтовые.
Следует заметить, что GetWindowTextA и MessageBoxA очень часто используются при проверке серийного номера. Перед взломом рекомендую посмотреть свойства ломаемой программы и выяснить ее разрядность (щелкни на ее ярлыке правой кнопкой мыши, появится окно Свойств, там в левом верхнем углу обычно написано "16" или "32 бит", это и есть разрядность приложения).
Практика
Вроде теорию я тебе всю изложил. Теперь практика: классический пример. Возможно, пример немного трудноват, но даже если ты запомнишь хотя бы малую часть, то сможешь почувствовать себя настоящим хирургом-маньяком, ищущим себе все новые и новые жертвы. Итак прога-пациент называется TaskLock. Будем ловить на GetWindowTextA (команда ":bpx getwindowtexta"). Ты можешь проверить, установилась ли точка останова командой ":bl". В результате увидишь что-нибудь типа: "00) BPX USER32!GetWindowTextA C=01". Далее жми F5. Продолжим. Попробуй ввести какое-нибудь значение в окне регистрации и нажми OK. Ты получишь дурацкое сообщение о том, что код был неправильным. Значит, это была не функция GetWindowTextA. Попробуем GetDlgItemTextA. Удали старый брейкпоинт ":bc 0" (0 - это номер брейкпоинта в списке брейкпоинтов) и установи новый ":bpx getdlgitemtexta". Вводи номер заново. Теперь ты в SoftICE, в самом начале функции GetDlgItemTextA. Чтобы попасть туда, откуда она была вызвана, нажми F11. Теперь ты внутри модуля SGLSET.EXE. Сейчас ты уже можешь запретить реакцию на вызов функции ":bd 0".
Первая строка в окне кода выглядит так: "CALL [USER32!GetDlgItemTextA]"
Чтобы посмотреть строчки над ней, нажимай Ctrl+Up ("стрелка вверх") до тех пор, пока не увидишь нижеприведенный кусок кода. Если ты ничего не понимаешь в Ассемблере, я добавил комментарии, которые могут помочь.
RET ; Конец функции
PUSH EBP ; Начало другой функции
MOV EBP, ESP ; ...
SUB ESP, 0000009C ; ...
PUSH ESI ; ...
> LEA EAX, [EBP-34] ; EAX = EBP-34
PUSH EDI ; ...