Как зарегистрировать врЕменное проживание родственника из Эстонии
Серия "Бюрократические квесты"
==================================================================
Tutorial 002
Как зарегистрировать врЕменное проживание родственника из Эстонии
(c) CS:ED
==================================================================
1. Объект взлома.
Когда кто-то, проживающий в Эстонии, приезжает к вам погостить,
вы _обязаны_ зарегистрировать его врЕменное проживание у вас.
Защита построена весьма серьезно и это _не_ для новичков.
Если вы никогда раньше не пытались исследовать подобные ситуации -
не стОит начинать именно с этой. Сначала попробуйте успешно пройти
"Получение нового студенческого" (минимальная сложность, решение задачи
"в лоб") или "Получение вкладыша о гражданстве" (средний уровень,
Tutorial 001) К тому же в этом учебнике рассматиривается наиболее сложный,
профессиональный, вариант программы.
Имейте ввиду, что жесткий взлом для программ такого класса лучше не
применять - слишком велика вероятность проверки, которую вы не заметите,
а потом все ваши пароли достанутся кому надо...
2. Головной модуль, входные параметры.
Первое затруднение при регистрации встречается уже на этом этапе.
В качестве входного параметра имеется "Серый" паспорт (т.е. человек не
является гражданином Эстонии)
Попробуем понять, какой из модулей программы необходимо задействовать
в этом случае.
Итак: Эстония - это зарубежное государство. Следовательно можно
предположить, что нам подходит модуль ОВИР.exe (r:\SpB\Avangardnaja\ОВИР.exe)
Попробуем... Запускаем :
r:\SpB\Avangardnaja\ОВИР.exe /"Серый_паспорт"
Опа ! Нас обломали :(
Сообщение об ошибке:
"Поскольку чел не является гражданином Эстонии, он не является иностранцем
по отношению к РФ"
Смотрим файл Read.me:
[skip]
3.6.7.19 Для регистрации временного проживания родственника, не являющегося
гражданином зарубежного государства необходимо использовать модуль
ЖЭУ из текущего рабочего каталога
[skip]
Так...
Где там оно... ага, вот: ЖЭУ.exe
Ну попробуем:
r:\SpB\MestoGitelstva\ЖЭУ.exe /"Серый_паспорт"
3. Ввод регистрационной информации.
Отлично ! Прога запускается и предлагает ввести регистрационные данные:
1. Заявление о необходимости временной прописки чела
2. Справка формы 9
Самое время ставить бряк-пойнты на процедуры проверки заявлений и справок:
bpx CheckZayav
bpx CheckZayavEx
bpx CheckSpravka
bpx CheckSpravkaEx
Выходим из отладчика и указываем полные пути к требуемым документам.
Register... Оопс ! - мы снова в отладчике, сработал бряк на CheckZayavEx.
Попробуем пройти эту функцию без каких либо вмешательств... - отлично,
получаем 1 и это значит, что с заявлением мы угадали. (Или, что более
вероятно, оно не проверяется процедурой регистрации).
Идем дальше и снова вываливаемся в отладчик, уже на функции CheckSpravkaEx.
Так. Здесь надо быть внимательнее...
Так и есть - проверяется наличие сигнатуры "Председатель ЖСК" в
конце справки.
Ну что ж - убираем глобальные бряки, ставим бряк прямо перед вызовом
CheckSpravkaEx, выходим из отладчика, получаем сообщение программы о
некорректных регистрационных данных и идем получать сигнатуру.
4. Получение сигнатуры "Председатель ЖСК"
Ни в коем случае, никогда, не пытайтесь скорректировать сигнатуры
прямо в памяти !
Как правило у программ, использующих идентификацию подобного рода, очень
изощренная система проверки подлинности сигнатур. В случае обнаружения подделки
вы можете крепко попасть...
К тому же, получение подлинного файла сигнатуры стОит не очень дорого,
если не бесплатно (как в нашем случае).
В крайнем случае можно воспользоваться кейгеном типа "Человек, _хорошо_ умеющий
подделывать подписи", но помните, что это опасно.
Итак, запускаем сначала модуль ЖЭУ и с помощью мастера справок генерим файл
"Справка по форме 9".
Потом снова запускаем модуль ЖСК, но уже с такими параметрами:
r:\SpB\MestoGitelstva\ЖСК.exe /"Справка_9 Get_signatura_predsedatel"
В результате наш файл проверяется на корректность и получает сертификат
подлинности в виде подписи председателя ЖСК.
5. Милиция.
Снова запускаем
r:\SpB\MestoGitelstva\ЖСК.exe /"Серый_паспорт"
(предварительно проверив готовность нашей бряк-точки)
Замечательно - мы в отладчике, проходим CheckSpravkaEx успешно.
И тут... а это еще что за... ?! 8-О
.....
push ebx ; заявление
push esi ; справка по форме 9
call ЛичноеПрисутствие.ВсеЧленыСемьи
test eax,eax
jz 004125a0 ; облом :(
call ЖСК.Registration
....
Это кто же это придумал ?! Один в командировке, другой работает с утра до
вечера... Неужели ничего не выйдет ? На всякий случай проверяем 004125a0
Ага, это уже кое-что:
...
call ЖСК.CheckСобственностьНаКвартиру ; это у нас в порядке
mov esi,eax
call Kernel.Милиция
test esi,esi
jz 00413110 ; полный облом :(
test eax,eax
jz 00413110 ; он же
call ЖСК.Registration ; нам сюда :)
...
Все ясно - чтобы выйти на процедуру регистрации мы должны успешно пройти
процедуру "Милиция".
Прежде чем патчить (напоминаю, это очень опасно и потому нежелательно),
посмотрим, что делается в "Милиции"
push ebp
mov ebp,esp
mov eax,[ebp+16] ; там у нас оказался результат ЖСК.CheckСобственностьНаКвартиру
cmp eax,00000ah ; т.е. все ли в порядке
jne 00435a42 ; что-то не так -> фиг вам, а не регистрация
call Kernel.CheckPassport
На всякий случай зайдем-ка мы в эту функцию...
Ну конечно ! Ей не понравилось, что паспорт на импортном языке !
И с нас требуется либо нотариально заверенный перевод (sic !) либо... облом. :(
Ну что ж, сделать мы тут вроде ничего не можем. Похоже, что обломали нас
по полной программе. Но тут мы вспоминаем, что у нас же есть старый паспорт,
на основании которого, собственно, и делался этот серый. А что если...
6. Милиция. Два паспорта.
Пока мы еще в отладчике, ставим бряк перед вызовом Kernel.CheckPassport,
выходим и запускаемся снова, указав старый паспорт в качестве второго
входного параметра:
r:\SpB\MestoGitelstva\ЖСК.exe /"Серый_паспорт Старый_русский_паспорт"
Ну, по крайней мере до вызова Kernel.CheckPassport мы дошли.
Снова идем внутрь.
Вот блин - наличие двух паспортов вызывает exception ! Ладно хоть, это еще
не окончательный облом - сначала программа делает попытку решить ситуацию
самостоятельно.
Для чего вызывается ЖСК.Exceptions.
Мда... Хрен редьки не слаще:
MessageBox: "Перезапустите программу ЖСК с дополнительным ключом except"
Похоже, скоро командная строка вытянется на пару экранов. :-/
7. ЖСК. Два паспорта.
r:\SpB\MestoGitelstva\ЖСК.exe /except "Серый_паспорт Старый_русский_паспорт"
После целого ряда диких сообщений об ошибках и зависаний до нас доходит,
что этот модуль написан недостаточно аккуратно (видимо разработчики не
рассчитывали, что эта часть программы когда-либо сработает). А раз так... ;)
Находим процедуру, в которой идет попытка решения исключительной ситуации
и видим там кучу вызовов, часть из которых ну _очень_ дальние. Ладно,
против лома... Начинаем жестко ломиться к цели - после каждого вызова
меняем флаги таким образом, чтобы придти к успешному завершению.
Уфф.. Наконец-то ! :)
8. Получение регистрационного номера.
Дальше все идет хорошо и без нашего вмешательства - Kernel.CheckPassport
была последней критичной функцией. Ret... ret.. retf...ret... Все !
MessageBox: "Чел успешно зарегистрирован проживающим в этой квартире на 6 месяцев"
Ух ты ! Мы столько и не просили, вообще-то, нам две недели надо было...
Похоже, что-то мы все-таки перебрали в обработке ексцепшена... Ну и ладно.
Все. К сожалению, без прямого вмешательства в работу проги не обошлось,
но это было в сравнительно безопасном куске.
Цели мы добились - не прошло и нескольких дней, как чел, приехавший к
нам в гости из Эстонии может спокойно жить у нас целых 6 месяцев
(и кого волнует, что он уедет уже через неделю ? :)
=================================================================================
... Была бы голова, а уж с чем бодаться - мы всегда найдем :)
=================================================================================