Сейчас на форуме: Magister Yoda, vasilevradislav (+5 невидимых) |
eXeL@B —› Крэки, обсуждения —› Как обойти проверку целостности кода в секции |
Посл.ответ | Сообщение |
|
Создано: 01 октября 2013 11:20 · Поправил: RebelNeo · Личное сообщение · #1 Доброе время суток! Есть программа, редактор карт GPSMapedit http://geopainting.com/download/mapedit2-0-77-1.zip . С регистрацией как бы уже понятно и решено, мало того, были открыты "недокументированные" фичи в программе, но это уже через прямой патч или лоадер и вот беда, при прямом патчинге или через лоадер прога теряет регистрацию. Как отловить этот затык хз, т.к. это явно не банальный CRC32, никаких окон не появляется, лишь при открытии любого файла в эбауте меняется надпись с зарегистрированной копии на не зарегистрированную и соответственно далее версия не работает как зарегенная. Т.е. изменение хоть одного байта в секции .text и прога теряет регистрацию |
|
Создано: 01 октября 2013 11:27 · Личное сообщение · #2 |
|
Создано: 01 октября 2013 11:30 · Поправил: Dr0p · Личное сообщение · #3 Маршрутизируйте. Обычно в модуле нет относительных ветвлений за пределы модуля, если это конечно не аверский патч или шим. Копируем всю кодосекцию в буфер. В этой копии модифицируем код как необходимо. Далее мониторим событие до вызова модифицированного кода, тут есть стопицот возможностей, например перехватить какую либо апи, быть может в секции данных есть ссылка на код, которую можно изменить, можно фолты юзать. Когда мы получим управление, то фиксим Eip на дельту баз секций - модифицированный код исполняется, оригинальная секция не затронута. Основа кстате сокрытия у нас |
|
Создано: 01 октября 2013 11:45 · Личное сообщение · #4 |
|
Создано: 01 октября 2013 17:52 · Поправил: kunix · Личное сообщение · #5 Dr0p Звучит довольно нереально, если у человека нет либы для переделки копии кода на новый адрес загрузки. Учтите, речь идет о EXE без reloc-ов. Я бы сделал проще - перехватил бы какую-то апи, вызываемую из функции X, в этой апи правил бы адрес возврата на мой код, и патчил X. В моей коде, вызываемом при возврате X, восстанавливал бы патч X. Если в X нет вызова проверки целостности - то все ок. [everyone] А какие вообще есть способы проверить целостность секции кода? Пока на ум приходят: 1) Прямое чтение юзермодными инструкциями 2) ReadProcessMemory 3) shared секция кода, проверка делается в другом процессе с тем же EXE (может даже rundll32 можно загрузить). Кстати, по опыту знаю, что на shared секцию кода reloc-и применяются не один раз Может еще можно замапить секцию кода в другое место через аналоги MapViewOfFile и там прочесть? Вообще, в WinNT можно замапить некоторый виртуальный адрес на еще один адрес без помощи своего кода в кернелмоде? Первый адрес получен не через CreateFileMapping, естессно. В WinCE 5.x в юзермоде работает VirtualSetAttributes. |
|
Создано: 01 октября 2013 18:59 · Личное сообщение · #6 |
|
Создано: 01 октября 2013 19:07 · Поправил: kunix · Личное сообщение · #7 Crawler пишет: tls callback. Если я еще не впал в маразм, то TLS callback-и срабатывают рано, еще до аттача отладчика, так? Т.е. это скорее способ вызвать код до отладчика, а что уже в том коде делать - другой вопрос. Этот способ обламывается, если патчить в памяти процесса не сразу. Crawler пишет: А еще можно считать контрольную сумму секции и использовать ее в программе как значение для условных переходов Так у меня вопрос, как эту сумму считать? Надо же байты получить как-то, причем незаметно. |
|
Создано: 01 октября 2013 20:50 · Личное сообщение · #8 kunix пишет: Надо же байты получить как-то, причем незаметно незаметно из ринг3 - никак. по крайней мере, мне такие незаметности не попадались kunix пишет: перехватил бы какую-то апи, вызываемую из функции X, в этой апи правил бы адрес возврата на мой код, и патчил X. В моей коде, вызываемом при возврате X, восстанавливал бы патч X. Если в X нет вызова проверки целостности - то все ок а если есть? мало того, нужный нам кусок кода декриптится незадолго до вызова, потом снова криптится (veh). это не к топику. вспомнилась тут одна шняжка интересная. решал с помощью DrX и анти-антидебага с get/setcontext, на мой взгляд не красиво получилось ----- От многой мудрости много скорби, и умножающий знание умножает печаль |
|
Создано: 01 октября 2013 22:41 · Личное сообщение · #9 |
|
Создано: 02 октября 2013 03:02 · Личное сообщение · #10 GPSMapedit содержит в себе самопальную ВМ и довольно злостную. Один из лучших крекеров команды TSRh ее ломал очень плотно, сломал, а потом все-таки скрытая проверка вылезла и пришлось доламывать. Так что, удачи! Dr0p пишет: Когда мы получим управление, то фиксим Eip на дельту баз секций - модифицированный код исполняется, оригинальная секция не затронута. Для проверок целостности, которые используют относительное смещение не подходит. Е8 00 00 00 00 никто не отменял. P.S. Защита достойная, чтобы ее разобрать, хотя сам я сабж не смотрел. |
|
Создано: 02 октября 2013 03:53 · Личное сообщение · #11 |
|
Создано: 02 октября 2013 11:26 · Поправил: kunix · Личное сообщение · #12 int А что в ней злостного? Скорее всего, там эмулируются инструкции x86, просто записанные иначе. Надо лишь посидеть на жопе ровно и разобрать обработчики всех опкодов. Кстати крекер не поделится дизассемблером для той VM? Dr0p Оно может и сработает. Но при условии, что 1) Обращения к данным идут по абсолютной адресации. 2) Пункт 1 в применении к байтам кода. Ибо если контрольная сумма считается относительно текущего EIP - нутыпонел. |
|
Создано: 02 октября 2013 12:18 · Поправил: Dr0p · Личное сообщение · #13 kunix Возможна ситуация, где берётся текущий адрес(например возврата) и исходя из него выполняется верификация. В таком случае следует взять место под контроль после проверки, либо если расстояние не большое(в пределах десятков тысяч инструкций), то потрейсить, либо проэмулить(то, что юзает VMBE) код до нужного места. Метода маршрутизацией называется потому что это обход "маршрута"(графа), который не линеен обычно. Тоесть обычно выполняется бактрейс(разворачивается стек - аля стековая маршрутизация, если CurrentNL > TargetNL), затем трассируется(если CurNL < TarNL) и так многократно. Иногда поточная маршрутизация используется - например один поток синхронно зацикливается при доступе к ресурсу, второй поток переключает его контекст на копию проекции. Обычно никакие самопроверки не мешают. Маловероятно что это не сработает на сабже. Тут давно принципы описаны http://exelab.ru/faq/IDP Кстате раз я вспомнил про идп, то напомню вам что модель памяти плоская в нт, тоесть код может располагаться по разным линейным адресам, но смещение будет одинаково. Жаль что это на x64 не робит |
|
Создано: 02 октября 2013 12:18 · Личное сообщение · #14 Dr0p Относительных за пределы нет. Но есть еще такие понятия как switch-таблицы, vtable и прочее. Без релоков, подчеркиваю, нет 100% надежности все это не поломать. А если не трогать, управление кодом просто уйдет обратно в оригинальную секцию и все. kunix пишет: А что в ней злостного? В том, что ее сломать не просто. Не факт, что у него был для нее дизассемблер. А вообще его сейчас что-то не видно. |
|
Создано: 02 октября 2013 12:23 · Поправил: Dr0p · Личное сообщение · #15 int > switch-таблицы Есно, по ссылке вернёмся в оригинал. Но место выбирается минимально близкое. Именно посему это не автоматизируется. В LWE юзается такой способ - кодосекция нтдлл переносится в буфер и там исполняется. Робит, если код не побит патчами(именно посему мой кряк и слетал у некоторых). Далее я пофиксил мотор, секцию грузим с диска. Всё чудесно робит. А там свичей и прочих деталей побольше будет чем в обычной софтине. Кстате NXSEH обходится через маршрутизацию. Посморите реализацию ;) Code:
- ZwQueryVirtualMemory пропатчен в буфере, оригинальный код не тронут. Для недетекта. |
|
Создано: 02 октября 2013 12:52 · Поправил: kunix · Личное сообщение · #16 Dr0p, мне вас сложно понимать.. ладно. Блин, если мы захватываем управление внутри функции X (через перехват API или иначе), то кто мешает протрассировать функцию X (не трассируя вызовы других функций, и подменяя адреса возврата), подменяя нужные инструкции (или эмулируя их подмену)? На mapedit это должно сработать, там с виду просто все в X. Инлайнового ассемблера, которым можно было бы задетектить трассировку, не видно. Проверок адреса возврата скорее всего тоже нет. RebelNeo Я боюсь, после этих обсуждений, в следующей версии горячие места будут под VM. | Сообщение посчитали полезным: dosprog |
|
Создано: 02 октября 2013 12:59 · Поправил: Dr0p · Личное сообщение · #17 kunix http://exelab.ru/faq/SFC При понижении NL код незачем трассировать, выполняется бактрейс(как в коде выше). Далее может быть повышение NL, тогда мы сохраняем в тлс соответствующий адрес и загружаем линк на свой стаб. Вот если по этому адресу валидация - тогда придётся трейсить. А трейс не хардверный(TF), а эмуляция(VMBE). Тоесть если встречается инструкция допустим Ret, то извлекаем адрес со стека и эмулим по нему расположенную инструкцию. Это позволяет не парится про антидебаг. Короче, не вижу проблемы.) |
|
Создано: 02 октября 2013 13:02 · Личное сообщение · #18 kunix пишет: боюсь, после этих обсуждений, в следующей версии горячие места будут под VM. вы бы что ли сам екзе поизучали прежде чем демагогию здесь разводить и там кроме вирутальной машины в самом екзе, есть прыжки из виртуальной машины в другой модуль который в ресурсах, и там тоже не все просто да и сам екзе кусками под vm, по пол функции |
|
Создано: 02 октября 2013 13:05 · Поправил: kunix · Личное сообщение · #19 reversecode пишет: вы бы что ли сам екзе поизучали прежде чем демагогию здесь разводить Ну вроде поизучал. Я имел ввиду, что патченные места из X в следующей версии будут под VM. reversecode пишет: и там кроме вирутальной машины в самом екзе, есть прыжки из виртуальной машины в другой модуль который в ресурсах, и там тоже не все просто Покажите. |
|
Создано: 02 октября 2013 13:10 · Личное сообщение · #20 |
|
Создано: 02 октября 2013 13:47 · Личное сообщение · #21 RebelNeo пишет: http://geopainting.com/download/mapedit2-0-77-1.zip Code:
----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. | Сообщение посчитали полезным: kunix |
|
Создано: 02 октября 2013 14:21 · Личное сообщение · #22 |
|
Создано: 02 октября 2013 17:19 · Поправил: dosprog · Личное сообщение · #23 >>версия дальше не работает как зареганная... а в чём сама-то суть недобитости этой MapEdit 2.0.77.1 ? Ну, пишет она "[зарегистрированная версия]" в эбауте, ну не пишет "[не зарегистрирована]" поверх карты при максимальном увеличении её масштаба. А какие там ещё "некоторые особенности", по которым можно определить "нерегистрированность" ? P.S. - кое-что я уже вижу и сам (после открытия файла). Хорошо бы полный перечень чудес. |
|
Создано: 03 октября 2013 11:38 · Личное сообщение · #24 |
|
Создано: 03 октября 2013 15:14 · Личное сообщение · #25 |
eXeL@B —› Крэки, обсуждения —› Как обойти проверку целостности кода в секции |
Эта тема закрыта. Ответы больше не принимаются. |