![]() |
eXeL@B —› Вопросы новичков —› Один из методов взлома по Крису Касперскому |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 06 сентября 2019 13:12 · Личное сообщение · #1 Здравствуйте, ув. Профессионалы! В общем понравился один прием взлома описанный Крисом Касперским. Суть метода в следующем: 1. Прогнать трейсером программу с правильным паролем. Сохранить лог в файл_1 2. Прогнать трейсером программу с неправильным паролем. Сохранить лог в файл_2 3. Сравнить два лога и найти место, где программа отклонилась от исходного маршрута про сам метод прочитать можно, например, здесь: https://exelab.ru/F/action=vthread&forum=1&topic=4492 Теперь осталось проверить как это все работает на практике: 1. Подопытной зверюшкой взял cracme от CrueHead'а. В этом крэкми: - если Логин будет содержать в себе цифры, то получите подряд два плохих сообщения - иначе одно плохое сообщение 2. Делаю лог трассировки программы с правильным Логином (не содержащим цифр): - открываю крэкми в OllyDbg 2.01 -> открываю окно run trace -> Ctrl + F11 - вызываю окно ввода рег. данных -> Ввожу правильный Логин (без цифр) и любой пароль (кнопку ОК еще не нажимаю) - в окне run trace очищаю лог (чтобы не было ничего лишнего, когда нажму кнопку ОК) и даю команду на сохранение лога в txt-файл - нажимаю кнопку ОК по форме с рег. данными -> появляется одно плохое сообщение -> OK (по сообщению) -> в окне run trace выбираю stop log - 1-й лог готов 3. Проделываю аналогичные действия с неправильным Логином (содержащим цифры): - появляется 1-е плохое сообщение -> ОК -> 2-е такое же сообщение -> OK - и дальше как обычно: окно run trace -> ПКМ -> стоп лог - 2-й лог готов 4. Далее при помощи плагина Compare в Notepad++ делаю их сравнение. Но оба лога на удивление полностью одинаковые!!! Сама цель создания Темы: - это разобраться в описанном методе и научиться находить отличия в алгоритме выполнения программы при помощи трассировки Круто конечно, если кто-нибудь поможет разобраться с трассировкой в OllyDbg и данным крекми. Но в принципе я не зациклен только на одном инструменте. Если кто-то уже имел успешный опыт в описываемом способе, но при помощи др. инструментов, то буду рад, если поделитесь своим опытом. Крекми и сделанные логи трассировки выкладываю здесь ![]() ![]() |
|
Создано: 09 сентября 2019 03:33 · Поправил: difexacaw · Личное сообщение · #2 |
|
Создано: 10 сентября 2019 15:45 · Поправил: rukop84 · Личное сообщение · #3 SDK, захотел повторить Ваши действия из видео-руководства: - скачал самый первый крекми как на видео; - разбил видео-инструкции по работе с визором на составляющие шаги; - и застрял в следующем: - после шага 5.1 у меня выскакивает Плохое сообщение (Wrong serial!). А на видео оно появляется аж на шаге 6.3. Тестирование провожу на OllyDbg_2.01 в ОС Win_7_32-bit. Может надо еще произвести какие-то доп. настройки в OllyDbg или в самом визоре? Составляющие шаги по работе с визором: Шаг 1. Скопировать 'crackme.exe' в папку с визором, переименовать в 'app.exe' Шаг 2. Запустить на исполнение 'Ij.exe' Шаг 3. В OllyDbg: 3.1 присоединиться к запущенному процессу (File -> Attach -> app.exe) 3.2 запустить программу на выполнение (Debug -> Run или F9) Шаг 4. В крэкми: - ввести любые Имя_пользователя и Пароль Шаг 5. 5.1 в крэкми: клик по кнопке cHECK 5.2 в OllyDbg: клик по окну дампа 5.3 активировать крекми (поместить в фокус) и еще раз нажать на кнопку cHECK Шаг 6. 6.1 в окне дампа перейти по адресу [30003008] 6.2 установить значение флага G_ON равным 1 6.3 активировать крекми -> нажать кнопку 'cHECK' -> дождаться Плохого сообщения (Wrong serial!) Шаг 7. 7.1 OllyDbg -> Pause 7.2 и дальше из Окна дампа в Окно дизассемблера следуют ручные переходы по измененным значениям и уже непосредственный анализ кода Хочется еще разобраться и в самой логике Шага 5. Ну, например, понятна логика в следующем: - визором построить карту исполнения каждой функции программы с правильным паролем; - затем с неправильным паролем (где будет уже другой маршрут выполнения программы); - и визором подсветить адреса, где маршрут отклонился А в видео-руководстве по логике программа "бежит" по одному и тому же маршруту, но изменения в адресах есть, откуда это и как оно получилось? ![]() |
|
Создано: 10 сентября 2019 16:37 · Личное сообщение · #4 |
|
Создано: 10 сентября 2019 16:59 · Поправил: sty · Личное сообщение · #5 |
|
Создано: 10 сентября 2019 17:08 · Личное сообщение · #6 rukop84 Я там кнопку не отпускаю, а есчо вывожу из фокуса окно пару раз, это нужно что бы все события гуя скипнулись, иначе в лог пойдут мышиные движения и прочие события. ----- vx ![]() |
|
Создано: 10 сентября 2019 17:52 · Личное сообщение · #7 sty пишет: Тут, видимо, для понятия принципа работы, взят крекми с заранее известными данными (пароль и т.п.). P.S. Кстати, тема же по методу К.К., а у Криса же там не крекми, а программа до окончания пробного периода и после. Точно! ![]() ![]() |
|
Создано: 10 сентября 2019 18:02 · Личное сообщение · #8 difexacaw пишет: Я там кнопку не отпускаю Ура-а-а-а, получилось!!! Ну, теперь вроде бы все пазлы сошлись Также еще хотел уточнить про смысл остальных опций визора. В инструменте их всего 5: - G_ON - G_IN - G_Cn - G_Un - G_Cp Вопрос в следующем: - для обычного пользователя и практического применения имеет ценность только первый из них (флаг G_ON)? Остальные флаги для того, кто не собирается слишком глубоко погружаться в царство Ядра не нужны, так? ![]() |
|
Создано: 10 сентября 2019 18:53 · Личное сообщение · #9 rukop84 Там сравнение карт в пару десятков строк, тоесть совсем просто. Для таких простых семплов не нужно выделять код во временных буферах, либо есчо как то смотреть на адреса(eg переход из временных буферов в основной образ). Поэтому остался флаг g_in от прошлых сборок, там протекторы крутились ![]() > по логике программа "бежит" по одному и тому же маршруту, но изменения в адресах есть, откуда это и как оно получилось? Проверка ведь один раз выполняется, при нажатии на ввод. Вот эти блоки обработки и выделяются. Если процедуры проверки ключа вызываются повторно, то они не будут видны. Если повторно ввод выполнить, то лог пустой будет. ----- vx ![]() |
|
Создано: 10 сентября 2019 19:28 · Поправил: rukop84 · Личное сообщение · #10 difexacaw пишет: > по логике программа "бежит" по одному и тому же маршруту, но изменения в адресах есть, откуда это и как оно получилось? этот вопрос отпал после того, как Вы ответили про то, что не отпускаете кнопку.... И тогда получается все очень просто. Пазл сошелся: 1. До установки флага: строится карта исполнения, где помечается каждая функция 2. После установки флага: происходит сравнение трасс Вот и все, противоречий вроде бы никаких нет Др. словами, я не знал раньше, что кнопка нажимается только один раз ![]() |
|
Создано: 11 сентября 2019 20:26 · Личное сообщение · #11 |
|
Создано: 12 сентября 2019 12:02 · Личное сообщение · #12 |
|
Создано: 17 сентября 2019 14:32 · Поправил: rukop84 · Личное сообщение · #13 В общем очень долго и много эксперементировал со штатным трейсером OllyDbg 2.01 и скорее всего буду продолжать тесты, так как не до конца еще все ясно. Например: - почему он пишет трассу, но при этом пропускает ключевые участки (ради которых собственно запись трассы и велась). Чувствую, что это связано как-то с событиями GUI о которых говорил Профессор Ядра difexacaw - и как настроить трейсер, чтобы он гарантированно записывал то, что от него требуется Мастер Medsft, извиняюсь, к Вашему инструменту еще не успел подобраться Сформулирую еще раз цели и задачи создания Темы, так как это все как-то размылось в ходе обсуждения. Исходные данные: п.1) cracme от TrueHead'a п.2) Login_1: 'RKP', Password_1: '12345' -> появится одно плохое сообщение п.3) Login_2: 'RKP98', Password_2: '12345' -> будет два плохих сообщения (т.к. логин содержит цифры) п.4) Login_3: 'Assa', Password_3: 'A764' -> будет хорошее сообщение (т.к. это правильные данные) п.5) Инструменты, предложенные участниками форума: _____- штатный трейсер OllyDbg 2.01 _____- визор от Профессора Ядра difexacaw _____- Tracer 1.03 от Мастера Medsft _____- плагин для IDA Pro, предложенный участником VOLKOFF Постановка Задачи: 1) записать трассы с данными из п.2) и п.3). Сравнить их, найти в коде первую развилку 2) записать трассы с данными из п.2) и п.4). Сравнить их, найти в коде первую развилку 3) проделать вышеописанные действия с помощью инструментов из п.5) 4) определить инструменты, которым вообще "по зубам" подобного рода задачи Что уже проделано: ----------------------------------------------------------------------------------- Визором проделан пункт задачи 1): difexacaw пишет: Если ввести с цифрами то из изменений одно ветвление CC 40138B:4013AC Развилка найдена неверно, элементарная проверка в коде программы это подтверждает ----------------------------------------------------------------------------------- Штатным трейсером OllyDbg 2.01 проделан пункт задачи 1): найденная развилка: 00401387-0040139C, сделал скрин: Развилка найдена верно. Простой тест с заменой условного перехода на безусловный это подтверждает ----------------------------------------------------------------------------------- ![]() |
|
Создано: 17 сентября 2019 14:58 · Поправил: ClockMan · Личное сообщение · #14 |
|
Создано: 17 сентября 2019 15:13 · Поправил: rukop84 · Личное сообщение · #15 ClockMan, задать диапазон трассировки - это кажется первое, что я проверял, когда проводил свои тесты. Все равно он не пишет то, что требуется. На текущий момент в OllyDbg 2.01 вроде бы нашел такую удачную комбинацию: 1. это как ты уже озвучил, задать жесткий диапазон (Trace -> Set protocol -> (+)Protocol only the following memory ranges: 00401000..00402000 2. запустить крекми, ввести логин и пароль (кнопку OK еще не нажимать) 3. поставить OllyDbg на паузу и затем уже с паузы запускать сочетанием ctrl+F11 4. нажать на кнопку ОК Вот тогда вроде бы он пишет маршрут как от него хотят!!! ![]() |
|
Создано: 17 сентября 2019 15:22 · Личное сообщение · #16 |
|
Создано: 17 сентября 2019 20:01 · Личное сообщение · #17 Ув., MultiMan'ы, а плавный переход к принципу действия визора от difexacaw или PINа будет? А то может быть у вас цель в трассировщике OllyDbg найти PIN? ![]() Если что, то можно объедениться с Калькулятор можно взять x32 от WinXP. ![]() |
|
Создано: 17 сентября 2019 20:28 · Поправил: difexacaw · Личное сообщение · #18 rukop84 > Развилка найдена неверно, элементарная проверка в коде программы это подтверждает Пруф со скринами желательно. Дий пилился года и обкатан на всех известных протекторах под 86. Возможно какие то опции выключены, короче нужны подробные данные. Скорее всего это какой то у вас косяк, так как тулз не универсален, выше я приводил пример. Он используется не как инструмент с гуем, а компилирутся-запускается-вновь компилится после поправок необходимых. Тот билд с которого был снят видос собран с включённым трансляторм адресов, но с выключенными ловушками на память. Управление теоретически может уйти из под визора при активном отладчике, так как он манипулирует контекстами(асинхронная загрузка контекста в цпу) удалённо. Ты используешь системный отладчик, визор уровня нэйтив юзермод с ним не совместим в принципе. Это как бы вообще замена отладчику. После того как отладчик получит сообщение апп становится не предсказуемым. Используй либо это, либо отладчик. Совместить их не получится. Я им только память смотрю, так удобно. Добавлено спустя 25 минут rukop84 ![]() Работает как часы. Это вообще не предназначено для школьников, где можно мышем втыкать, это дико. Решил пытаться реализовать идею сравнения карт - реализуй самостоятельно, кодь код. Ты же не можешь готовое заюзать, так как кнопок нет, это просто дичь какая то ![]() Почему в этом случае что то в логе отличается - мне глубоко пофиг, другой билд. Я через это тысячи семплов прогнал. Добавлено спустя 53 минуты sty Собирается фильтрующая события либа, в данном случае для обработки карты код вообще приметивен: Code:
Визор крутит апп и вызывает фильтр. Его можно написать да хоть на вба, это скажется лишь на общем профайле. Если же человек не может десяток элементарных строк написать и собрать, то о чём вообще может быть речь. ----- vx ![]() |
|
Создано: 17 сентября 2019 21:25 · Поправил: sty · Личное сообщение · #19 difexacaw пишет: Дий пилился года difexacaw, а можете описать принцип действия вашего визора ( дий)? Что там инжектится и как формируется выход нужных данных (ну или "выхлоп" )? И еще хотел спросить у того кто в теме. Возможно ли, в принципе, получение "чистой" трассы? Ну т.е. запустил приложение, поработал, а потом включаешь какую-нибудь трассировку или логирование и получаешь "чистую" трассу кода, который назначен на обработку конкретной кнопки или пункта какого-либо меню. ![]() |
|
Создано: 17 сентября 2019 21:37 · Поправил: difexacaw · Личное сообщение · #20 sty Там не эмуляция, а прямое выполнение. Блок отправляется в буфер на выполнение, ядерные вызовы перехватываются, так оно крутится. Обычно блок из одной инструкции, тогда включается адресная трансляция(через этот механизм можно смещать сегменты, те реализовать анклавы). Загрузка блока из множества инструкций показала свою бесполезность. Сам мотор работает как отдельный двиг, который вызывает три нотифи в модулях фильтрации. Да и вообще я же показывал сурки. Пин трассу не снимает, он блоки копирует в буфера, там их фиксит и выполняет, при этом есчо и в вирт машине. Под пин запускается блокнот и простые апп, это не предназначено для апп с защитой, что бы там протекторы крутить. ----- vx ![]() |
|
Создано: 17 сентября 2019 22:21 · Личное сообщение · #21 difexacaw пишет: Пин трассу не снимает, он блоки копирует в буфера, там их фиксит и выполняет, при этом есчо и в вирт машине. Тут тогда, видимо, нужно с терминологией определиться. Я под трассой подразумеваю последовательность выполненных инструкций в коде, а уж где они выполняются, в ВМ или еще где, это дело десятое. Главное чтобы это было достоверным. difexacaw, а на второй мой вопрос в посте №19 у вас есть мнение? Возможно ли, в принципе, получение "чистой" трассы? ![]() |
|
Создано: 17 сентября 2019 23:37 · Поправил: rukop84 · Личное сообщение · #22 difexacaw пишет: > Развилка найдена неверно, элементарная проверка в коде программы это подтверждает Пруф со скринами желательно. Да, все очень просто. Скрины не нужны, просто следите за ходом рассуждений. Когда Вы проводили тест, то: - трасса_1 (с одним плохим сообщением) была: 'difexacaw' + 'любой пароль' - трасса_2 (с двумя плохими сообщениями) была: 'difexacaw98' + 'любой пароль' - результатом стало то, что визор выдал Вам всего одну единственную развилку, которую Вы и написали: "из изменений одно ветвление CC 40138B:4013AC" Теперь как очень просто делается проверка полученного результата: - просто изменяется условный переход на безусловный и делается тест. То есть, если результат правильный, то теперь при вводе данных 'difexacaw98' + 'любой пароль' мы должны получить не два плохих сообщения, как раньше, а одно (так как программа теперь будет бежать по одной и той же трассе). А ЭТОГО НЕ ПРОИСХОДИТ!!! Правильный найденный адрес развилки будет такой: 00401387-0040139C (можете проверить сами) ![]() |
|
Создано: 18 сентября 2019 11:02 · Поправил: difexacaw · Личное сообщение · #23 rukop84 > что визор выдал Вам всего одну единственную развилку, которую Вы и написали: "из изменений Из изменений" значит что разница между двумя логами, вот я есчо раз посмотрел. Без цифр: Code:
С цифрами: Code:
Разница в последовательности [30003048]: 401387.40139C -- 40138B.4013AC. Читать нужно внимательно, если сам поленился проверить. Добавлено спустя 34 минуты rukop84 Попробуй что нибудь посложнее, этот же семпл накрытый obsidium ![]() ![]() ![]() ----- vx ![]() |
|
Создано: 18 сентября 2019 12:01 · Личное сообщение · #24 difexacaw пишет: Разница в последовательности [30003048]: 401387.40139C -- 40138B.4013AC. Читать нужно внимательно, если сам поленился проверить. Профессор Ядра difexacaw, вот у Вас и ошибка. Причем ошибка в самом подходе (в концепции): - Вы сопоставляете строку №08 со строкой №08, а так делать нельзя (результат получиться некорректным). - разные трассы имеют разное количество шагов. И в одном маршруте одна и та же развилка может находиться на шаге №08, а в другом маршруте - на шаге с совсем др. номером Правильно найденный переход без цифр будет: 401387 - 40139C Правильно найденный переход с цифрами будет: 401387 - 401389 Даже не знаю как Вам еще объяснить. Ну, вроде бы и так все очевидно. Ну, не верите мне - просто сделайте тест, как я писал в предыдущем сообщении (с заменой условного перехода на безусловный) ![]() |
|
Создано: 18 сентября 2019 12:04 · Личное сообщение · #25 |
|
Создано: 18 сентября 2019 13:05 · Личное сообщение · #26 |
|
Создано: 18 сентября 2019 13:10 · Личное сообщение · #27 |
|
Создано: 18 сентября 2019 13:11 · Поправил: rukop84 · Личное сообщение · #28 выдвину такую гипотезу: - если ошибок нигде нет, то Ваш инструмент определяет не первую развилку по которой программа изменяет маршрут, а развилку которая следует за первой Добавлено спустя 3 минуты difexacaw пишет: Покажи где именно он это выдал. да, Вы же сами писали в своем сообщении ![]() |
|
Создано: 18 сентября 2019 13:39 · Личное сообщение · #29 rukop84 > Правильно найденный переход без цифр будет: 401387 - 40139C Это ветвление заканчивает цикл. Собственно само тело цикла выделено есчо до этого ветвления. > Правильно найденный переход с цифрами будет: 401387 - 401389 401387 -> 401389 это не ветвление, а передача управления на следущую за ним инструкцию(условие не выполняется). Тоесть конец строки не достигнут. Правильный переход с цифрами 40138B -> 4013AC. Выше я же пояснил с двумя логами для непонятливых. Хорошо, давай на пальцах": Code:
С цифрами будет 40138B -> 4013AC. Без цифр будет 401387 -> 40139C. Как оно и выведено в лог ![]() ----- vx ![]() |
|
Создано: 18 сентября 2019 13:58 · Поправил: Isaev · Личное сообщение · #30 rukop84 пишет: Здравствуйте, ув. Профессионалы! В общем понравился один прием взлома описанный Крисом Касперским. Суть метода в следующем: 1. Прогнать трейсером программу с правильным паролем. Сохранить лог в файл_1 2. Прогнать трейсером программу с неправильным паролем. Сохранить лог в файл_2 3. Сравнить два лога и найти место, где программа отклонилась от исходного маршрута (1) Что-то я никак не уловлю суть... если мы знаем правильный пароль, что взламывать то? (2) elraton это и был Крис? (3) Если даже ограничиться прогами с триалом, то вылетим мы на первой проверки, которых потом может быть ещё десяток, но до них мы трейсом никогда не дойдём и не узнаем где они были ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 18 сентября 2019 14:25 · Поправил: rukop84 · Личное сообщение · #31 Чувствую, что непонимание возникло в терминологии. Вот как меня учили: - "ветвление" или "развилка" (на языке ДРАКОН) - это любой условный переход, где: ---- 1) если выполняется условие, то программа следует по одному маршруту; ---- 2) если не выполняется, то по другому маршруту Это и есть развилка!!! А у Вас термин "ветвление" - это что-то иное!!! Профессор Ядра difexacaw, а лог Вы с помощью визора сделали? (если да, то как включается эта опция) И еще вопрос: - есть ли возможность с помощью визора делать сравнения трасс с перезапуском программы? Например: 1) снять визором трассу_1; 2) закрыть все программы, сделать какие-то изменения в системе; 3) снять визором трассу_2; 4) сравнить трассу_1 и _2 Добавлено спустя 15 минут Isaev пишет: (1) Что-то я никак не уловлю суть... если мы знаем правильный пароль, что взламывать то? правильный и неправильный пароль - это всего лишь пример, листочки дерева. А корешки - это описание самой концепции и применение ее в реальных жизненных ситуациях, где: - имеются два разных маршрута выполнения программы - надо их сравнить - найти первое отличие в маршруте выполнения (развилку) Isaev пишет: (2) elraton это и был Крис? У Криса Касперского точно такое есть, кажется в книге "Основы дизассемблирования". Если кто-то у кого-то скопипастил, то это их трудности Isaev пишет: (3) Если даже ограничиться прогами с триалом, то вылетим мы на первой проверки, которых потом может быть ещё десяток, но до них мы трейсом никогда не дойдём и не узнаем где они были Одна концепция - решает одни задачи, характерные именно для нее. Др. задачи - решаются с помощью др. подходов, инструментов и т.д. ![]() |
<< . 1 . 2 . 3 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Один из методов взлома по Крису Касперскому |
Эта тема закрыта. Ответы больше не принимаются. |