Урок 3 - Взлом программы HandMap

  1. HandMap
  2. Взлом
  3. Debuffer
  4. XOR и хранение информации о регистрации

HandMap

HandMap
Рис. 1
HandMap - это самая известная и популярная программа для хранения и просмотра карт на PDA. Для Америки таких карт полным-полно, для Италии есть, а для России пока не очень. Впрочем, на spbmap.da.ru есть карты Москвы и Питера. И, что самое главное, в то время как американские карты обычно стоят денег, российские совершенно бесплатные.

Глюков в программе есть достаточно, но с ними приходится мириться из-за отсутствия реальной альтернативы. Quo Vadis не позволяет создавать свои карты, а остальные программы пока очень слабы...

7 июня вышла новая версия этой программы, 3.1. Её-то и надо сломать. Не вполне ясно, правда, что это за версия. На сайте она обозвана 3.1, поле version в самой программе показывает то же самое, а вот в окошке About гордо красуется надпись 3.2b. Вот и думай, что хочешь после этого...

Взлом

HandMap - incorrect
Рис. 2
Начнём её ломать с того, что попробуем зарегистрировать и найдем нужные формы.

Думаю, что вы без труда смогли найти нужные формы. Это два ресурса:

Talt03e8.bin
Talt044c.bin

Обратите внимание, что на этот раз мы имеем дело не с tFRM, а с Talt. Впрочем, особой разницы здесь нет. Ну ладно, приступим к поиску нужного фрагмента в программе.

Уфф! Целых семь мест в программе содержат $3e8. Можно, конечно, долго думать, но мы пойдем другим путём. Воспользуемся одной замечательной программкой Debuffer, написанной Pam Sessoms. Программка эта представляет собой обыкновенный дебаггер. Мы поставим debugger break'и во всех семи местах, будем смотреть, когда HandMap будет вылетать в debugging mode и какой код в это время выполняется.

Debuffer

Пользоваться ею несложно. По всем семи адресам, где вы нашли ссылки на $3e8, поставьте команду 4e48. Это вызов дебаггера. Запустите дебаггер и эмулятор. Теперь загрузите HandMap в эмулятор и запустите её. Практически сразу же в окошке дебаггера появится приглашение командной строки.

Debuffer позволяет делать очень многие вещи, нужные взломщику и автору программ. Сейчас мы всего лишь посмотрим код, который сейчас выполняется. Сделать это очень просто:

pc @ 10 dis

Для подробного описания синтаксиса команд debuffer читайте его документацию. А пока вам нужно знать, что такая команда выводит следующие десять инструкций программы. Теперь вы легко можете найти, какой же из вызовов дебаггера сработал, а значит, какой кусок программы нас не интересует. Поменяйте вызов дебаггера на то, что было в этом месте программы в начале, перегрузите HandMap. После того, как HandMap по крайней мере загрузится, идите в меню About и пытайтесь зарегистрироваться. Нас интересует тот вызов дебаггера, что поставлен в программе сразу же после ввода кода.

Надеюсь, что теперь вы его нашли. Команда по адресу 0000b15a - это то, что мы искали.

0000b142   2f0a					MOVE.L	A2,-(A7)
0000b144   4ebafc14				JSR	L1736
0000b148   222efffc				MOVE.L	-4(A6),D1
0000b14c   b380					EOR.L	D1,D0
0000b14e   2b40fc5c				MOVE.L	D0,-932(A5)
0000b152   4aadfc5c				TST.L	-932(A5)
0000b156   504f					ADDQ.W	#8,A7
0000b158   670c					BEQ	L1768
0000b15a   3f3c03e8				MOVE.W	#1000!$3e8,-(A7)
0000b15e   4e4fa192				TRAP	#15,$A192 = sysTrapFrmAlert
0000b162   544f					ADDQ.W	#2,A7
0000b164   600a					BRA	L1769
0000b166   3f3c044c			L1768	MOVE.W	#1100!$44c,-(A7)
0000b16a   4e4fa192				TRAP	#15,$A192 = sysTrapFrmAlert
0000b16e   544f					ADDQ.W	#2,A7
0000b170   4267				L1769	CLR.W	-(A7)

Самым простым кажется поменять условный переход по адресу 0000b158 на безусловный. Да, это действительно самое простое. Можете так и сделать. :)

XOR и хранение информации о регистрации

Когда вы попробуете зарегистрировать HandMap, он вас поблагодарит. Но только когда вы попробуете загрузить какую-нибудь карту, он скажет Invalid map ver., а если вы выйдети и снова войдете, то предупредит вас, что версия у вас всё равно evaluation... Но не надо беситься и стучать стилусом. :) Надо просто разобраться, в чем же причина того, что HandMap себя так ведёт.

Давайте ещё раз посмотрим на код. Ясно, что после того, как мы направили программу по правильному пути с помощью безусловного перехода, её выполнение должно быть одинаково и в случае правильного кода, и неправильного. Значит, она успела что-то сделать до того, как мы вмешались. Или, наоборот, не сделать. Видимо, информация о регистрации должна где-то храниться, а HandMap ничего туда не записала. Ищем, где она это делает...

Ага! Чуть выше, в 0000b14c программа должна при правильной регистрации поместить в D0 нолик. А отсутствие нолика означает, что программа всё такая же evaluation. Вообще, если где-то есть команда EOR (это операция "исключающего или" - XOR, одна из побитовых операций), значит кто-то работает с кодами или паролями. Следующая команда размещает результат (это должен быть нолик) где-то далеко, а потом все проверки работают именно с этим сохраненны числом. Для того, чтобы "по настоящему" зарегистрировать программу, надо записать нолик туда, куда положено. Сделать это можно, например, так:

0000b14c   7000					MOVEQ	#0,D0

...или так:

0000b14c   4280					CLR.L	D0

Ясно, что в первом случае мы записываем ноль в D0, а во втором очищаем D0 (результат тот же). (Спасибо Timothy Lyangouzov, из письма которого я это взял.)

Урок 2 - SwissClock Урок 4 - MobileDB
TopList

Copyright © PalmPot.
Последнее обновление 13.07.2000.