![]() |
eXeL@B —› Основной форум —› как покрывают быков - обсудим тему?! |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 08 апреля 2006 16:38 · Личное сообщение · #1 вот один забавный прием взлома. 1) прогоняем программу через трейсер, вводим правильный параль (не окончена дата триала) 2) прогоняем программу через трейсер, вводим _не_правильный параль (окончена дата триала) 3) получаем два лога трейсера, которые в чем-то схожи, а в чем-то различны методика взлома сводится к поиску различий: * решение для "богатых" =================== берем любой coverage-инструмент (например, плагин для ида, www.hexblog.com/2006/03/coverage_analyzer.html) или numega coverage или другие инструменты для измерения покрытия. сравниваем покрытие до и после оконочания триала, делаем выводы, мотаем на ус. * решение для "бедных" ================== берем ollybdg, грузим программу (допустим demo-simple.exe), говорим debug -> open or clear trace, view -> run trace; F10 -> log to file; CTRL-11, и дождавшись "enter password" вводим _не_ правильный прароль типа fuck off теперь нажимаем Ctrl-F2 для рестарта дебагера, говорим view -> run trace; F10 -> clore file F10 -> log to file; CTRL-11, и дождавшись "enter password" вводим правильный прароль типа nezumi говорим view -> run trace; F10 -> clore file ок. мы получили два файла, пусть это будет 1.log и 2.log. * как сравнивать файлы ================== берем утилиту windiff (входит в ms vc и еще хрен знает куда), выбираем файлы, говорим [expand] и жем F8 для поиска изменнений. вот, смотрите, что мы нашли: (см. аттач). это и есть тот условный переход, который рулит ;))) в отсуствии windiff (ну что за срань?! юниховый diff намного лучше) с некоторой черезжопицей файлы можно сравнивтаь и FC.EXE. а вообеще, но "науке" надо написать несложную программу, которая берет EIP адреса, пройдеденные файлови ложит их в базу (для ускорения поиска можно использовать двоичное дерево), а затем показывает какие адреса _НЕ_ совпадают в обоих файлах. вот такой прием взлома. мыщъх пользуется им уже давно, но не видел, чтобы он был где-то описан, вот и решил описать. критика, замечания, дополнения - только приветствуются ![]() ![]() |
|
Создано: 08 апреля 2006 22:01 · Личное сообщение · #2 Bad_guy по поводу jx. были у меня схожие идеи. и как ни странно на старых программах они рулили ;) опять-таки через трассер. 1) если бряк выполнился более одного раза - это цикл, не трогаем его 2) если бряк не выполнился, смотрим куда он позывает (условно обозначает этот код trgt) 3) если trgt был покрыт, этот jx отбрасывается 4) оставшиемся jx - подвергается экспериментированию. если не удалось перебрать автоматом ;) тогда анализируем врунчую. по крайней мере мы отсеяли "левые" jx но сейчас стало хуже. сейчас стало встречается куча call eax, где если предварительно грузиться либо из: "хорошей" либо из "плохой" процедуры... и такой метод стал бесполезен... ![]() |
|
Создано: 08 апреля 2006 23:27 · Личное сообщение · #3 А я даже пытался писать свой трейсер. Обрабатывая листинг windasm-а выковыривал все адреса jx с интересующего момента, далее расставлял int3 и потом анализировал путь программы. Предполагал использовать для борьбы с триалами а так же для обнаружения разницы при вводе пароля разной длины и содержания. Даже наивно полагал, что на одной из 10 программ может получится подобрать пароль перебирая по одному символу и смотря на реакцию трейсера. По типу того как сейфы в фильмах вскрывают прослушивая характерный щелчок при проходе нужной цифры... У всех кто слышал всю эту идею это вызывало только смех... Сейчас мне особенно приятно, что такой уважаемый человек успешно пользуется похожим методом. ![]() |
|
Создано: 08 апреля 2006 23:33 · Личное сообщение · #4 elraton Хочу рассказать сразу на грабли, которые изначально не видать при таком способе взлома. 1. Это проги с рандомными значениями, которые например генерят случайную строку при выводе на экран: программы напоминалки и т.п. 2. Огромные циклы, которые нередко встречаются в последнее время. Из-за чего файл принимает гиганские рамеры, гб отлетают на ура. 3. Могу предположить, что полиморфники будут давать кривые листинги, если у них есть привязка ко времени и т.п. 4. Есть проги которые генерят файл в зависимости от времени, это всё конечно можно скриптами обработать, но всё же это лишние напряги. SeDoYHg Вполне рабочий вариант, я так же применял уго на практике и весьма успешно, хотя феназепам не употребляю ![]() Иногда быстрее отрэйсить и сравнить чем лазить по ужасному коду с отладчиком. Любую методику стоит иметь на вооружении ;) Плю с к таму, позволяет быстро локализовать механизм генерации и проверки пароля ;) ----- Подписи - ЗЛО! Нужно убирать! ![]() |
|
Создано: 09 апреля 2006 05:53 · Поправил: Nimnul · Личное сообщение · #5 |
|
Создано: 09 апреля 2006 11:31 · Личное сообщение · #6 nice пишет: Хочу рассказать сразу на грабли, которые изначально не видать при таком способе взлома. 1. Это проги с рандомными значениями, которые например генерят случайную строку при выводе на экран: программы напоминалки и т.п. 2. Огромные циклы, которые нередко встречаются в последнее время. Из-за чего файл принимает гиганские рамеры, гб отлетают на ура. А зачем делать полный трейс? Достаточно по заданному диапазону адресов, где приблизительно происходит искомая проверка, который вычисляется уже при первом исследовании проги в дизассемблере/отладчике. Т.е. для реализации идеи достаточно трейсера, выводящего EIP-ы с воможностью выбора их диапазона для трейса, а затем - ccompare логов. elraton пишет: немного более конкретно: soft-ice ... выдает трассу программы, Вот здесь бы поподробнее - какими средствами? ![]() |
|
Создано: 09 апреля 2006 12:09 · Личное сообщение · #7 |
|
Создано: 09 апреля 2006 12:50 · Личное сообщение · #8 elratonelraton пишет: olly выдает трассу программы Увы. Не помогло - проверка идет либо слишком далеко, либо в генерируемом thread-e. Трасса программы без ключа и без ключа+эмулятор совпадают. А thread-ов у них аж 11 штук. Не исключено, что для проверки генерят спец-thread. А сообщение про демо глубоко зарыто в недрах MFC42. Место-то я нашел, где текст вытаскивают, но оно в DLL, а в программу всплыть не удалось - точнее попал на обработку событий ![]() ========================= Но тем не менее согласен - идея очень здравая. Открыл для себя очередные возможности olly и ищу нужный thread ![]() ![]() |
|
Создано: 09 апреля 2006 16:35 · Личное сообщение · #9 |
|
Создано: 09 апреля 2006 20:09 · Личное сообщение · #10 YDS пишет: И что из того? Ты же не будешь этот лог (логи) руками ковырять. виндовый дифф можно взять здесь www.fsci.fuk.kindai.ac.jp/kakuto/soft.html или здесь unxutils.sourceforge.net/ а вообще - метод "в лоб", довольно старый. Работает, особенно приятно отковыриваются всякие полуполиморфные штуки, ибо при наличии чуточки фантазии видно структуру программы. опятьже всякий мусор на ура вычищается. ![]() |
|
Создано: 10 апреля 2006 04:26 · Личное сообщение · #11 |
|
Создано: 10 апреля 2006 10:41 · Поправил: Nimnul · Личное сообщение · #12 |
|
Создано: 10 апреля 2006 21:19 · Личное сообщение · #13 |
|
Создано: 10 апреля 2006 22:12 · Личное сообщение · #14 |
|
Создано: 11 апреля 2006 00:18 · Личное сообщение · #15 ToBad 1] soft-ice: ======== NuMega SoftIce Symbol Loader->soft-ice inital. setting->History Buffer Size [увеличиваем размер до хрена] :wc; /* отключаем окно кода, если оно было включено, если это не слелать нихрена не получится */ :MACRO NEZUMI="t;NEZUMI;" NEZUMI когда надоесть трассировать, давим esc затем <Ctrl-D> и в лоадере "safe soft-ice history as..." как вриант, можно обойтись без макроса, просто дать t FFFFFFFF только кодовое окно долно быть отключено!!!! 2] olly debug -> open or clear trace view -> run trace F10 -> log to file <Ctrl-F11> view -> run trace F10 -> close file 3] syser information -> run trace list 4) IDA тут два пути. использовать готовый плугин или... скриптовый язык в котом нет команд для работы с отладчиком, но можно прицепить хитрый макрос, хотя отладчик в иде слабоват и для серьезных дел непригоден ;( ![]() |
|
Создано: 11 апреля 2006 00:43 · Личное сообщение · #16 |
|
Создано: 11 апреля 2006 01:17 · Личное сообщение · #17 Asterix пишет: по Ctrl-F11 в олли под NT можно глубоко в дебри системных библиотек уйти, а вот пропускать call'ы Win API олли кажется не умеет, а по Ctrl-F12 он вообще все call'ы обходит угу я 300кб прогу попробовал протрейсить на втором часу работы прога еще не запустилась мне надоело ждать и я отрубил ольку и покилял 200метровый лог ;) скрипт нужен короче 100% ![]() |
|
Создано: 11 апреля 2006 01:33 · Поправил: elraton · Личное сообщение · #18 Asterix Olly 1.10 вот врагмент лога
смотрите! по CTRL-F11 olly входит только в юзерские функции, но пропускает системные библиотеки ![]() |
|
Создано: 11 апреля 2006 01:41 · Личное сообщение · #19 Red Bar0n ну не знаю, что вы такого трейсили... наверное что-то жутко упакованное приложение типа блокнота на P-III 733 чуть тормозят но трейсятся быстро. тут ведь это... возникает подзадача как можно поближе пдобраться к защитному мехнизму и трейсить уже оттуда... большие логи дают именно упакованные программы и всякие там циклы... ну что парни я могу сказать... если мы получаем большой лог, то мы находим этот цикл в отладчике, выходим из него по HERE и гоним лог трейсера дальше... короче, каждый случай требует своего подхода. кто не хочет думать - нехай берет numega coverage там все будет видно визуально ;) кстати, читайте блок ильфака ссылку на который я давал, он там приводит понятие "базового" блока, то есть блока лишеного ветвлений. нам не нужно трассировать кажую инструкцию базового блока, нам достаточно только поставить бряк в его конец ;) это в _сотни_ раз ускоряет работу трейсера и скоращает размер лога чуть ли не на порядок ;) ![]() |
|
Создано: 11 апреля 2006 02:43 · Личное сообщение · #20 |
|
Создано: 11 апреля 2006 03:11 · Личное сообщение · #21 elraton пишет: 1] soft-ice: ======== NuMega SoftIce Symbol Loader->soft-ice inital. setting->History Buffer Size [увеличиваем размер до хрена] :wc; /* отключаем окно кода, если оно было включено, если это не слелать нихрена не получится */ :MACRO NEZUMI="t;NEZUMI;" NEZUMI когда надоесть трассировать, давим esc затем <Ctrl-D> и в лоадере "safe soft-ice history as..." Спасибо ! Буду испытывать. elraton пишет: 4) IDA тут два пути. использовать готовый плугин или... скриптовый язык в котом нет команд для работы с отладчиком, но можно прицепить хитрый макрос, хотя отладчик в иде слабоват и для серьезных дел непригоден ;( Для небольших участков кода внутренний трейсер вполне хорош, причём в настройках есть хорошая опция: Trace over library function. ![]() |
|
Создано: 11 апреля 2006 09:38 · Личное сообщение · #22 Asterix пишет: Олли не заходи в АПИ только под 9х ! Почему только под 9х? У меня ХР про сп2 - тоже пропускает API. Мои настройки в аттаче. ![]() ----- Сколько ни наталкивали на мысль – все равно сумел увернуться ![]() |
|
Создано: 11 апреля 2006 09:49 · Поправил: PE_Kill · Личное сообщение · #23 |
|
Создано: 11 апреля 2006 10:51 · Личное сообщение · #24 |
|
Создано: 11 апреля 2006 12:01 · Поправил: Asterix · Личное сообщение · #25 |
|
Создано: 11 апреля 2006 19:53 · Личное сообщение · #26 |
|
Создано: 11 апреля 2006 19:57 · Личное сообщение · #27 |
|
Создано: 11 апреля 2006 23:35 · Личное сообщение · #28 |
|
Создано: 12 апреля 2006 00:26 · Личное сообщение · #29 Asterix > но вот что делать с циклами... вариант первый: let them be! достаточно выставить большой размер лога (я ставил в айсе с десяток метров и этого хватало), а у ольки он похоже вообще не ограничен. теперь. имеем два Log'a. пишем несложную программку, которая просто-напросто считывает какие адреса были покрыты (вырезает первое число из лога) и кладет в его дазу банных (или самопальное двоичное дервево) то же самое повторяет и с другим логом. затем две дазы сравниваются и находятся адреса, которые есть в одном логе, но нет в другом! вот это и есть то, что нам нужно!!! далее пишется нехитрий скрипт к ида, который в комменатриях отмечает покытие, указаывая на покрытий/непокрытый код чтобы ускорить навигацию, там же в комментариях делается ссылка на "jmp to next not mactch". крррасота!!! единственная прооблема - циклы выборки сообщений. в них можно легко утонуть и не выплыть, поэтому надо научиться игнорировать их. а как?! пока я думаю написать плагин для ольки... который позволит отсеивать все заведомо незначимые функции.... p.s. у кого установлена numega coverage? (или аналогичный инструмент) попробуйте эту идею на ней... мне лень ставить... ====================================== Nimnul > Есть еще один способ локализовать место проверки, > введя два неправильных ключа разной длинны. > В логах будет различие только в том месте где происходят > определенные манипуляции с ним. мужик ты просто гений!!!! разрываю в честь тебя свой хвост на пополам я сам до этого не допер, но сейчас проверил твою идею на практике! и она рулит!!! логи... нет, логи по _коду_ получаются одинаковые, особенно если программа работает по следующему приниципу (я конечено, все очень утрирую) if (CRC32MD5(user_str)!=VALID_CRC) ..... то в любом случае код один и тот же!!!! это только в strcmp мы получаем разницу в логах, но!!! _данные_ будет разные!!! если одной и той же программе скормить один и тот же пароль, то данные в обоих логах трейсера будут одинаковые, а вот если скормить разные пароли, то... данные изменятся!!!! и изменяться они, как нетрудно догадаться в процедуре CRC32MD5. ремакрка: прежде чем это делать, необходимо добиться того, чтобы два прогона с одинаковыми прогонами давали идентичные данные. большой вред вносит системное время, мышь и прочие системные события. поэтому: при старте программе ставим одно и тоже время, отрубаем мышь нахер, а регистрационные данные вводим не руками, а мини-программой, посылающей сообщения окну. все это исключает какое-либо непостоянноство в обработке данных. сейчас проверил этот способ на нескльких программах. невероятно!!! но он работает!!! процедуры проверки пароля разоблачают себя сами!!!! полный улет и большой респект нимнулу. как буду писать об этом в книге, обязательно упомняну, кому принадлежит идея! сейчас вожусь в профилировщиком. если программа проверяет пароль (ключевой файл) мощной криптографической функцией, то время ее выполнение существенно отличается, что разобралачет ее. правда, к поточным шифрам это не относится ;( даже если брать пароли разной длины, прога обычно сама дополняет их нулями до нужного размера... какие еще будут идеи? ![]() |
|
Создано: 12 апреля 2006 03:13 · Личное сообщение · #30 elraton пишет: единственная прооблема - циклы выборки сообщений. в них можно легко утонуть и не выплыть, поэтому надо научиться игнорировать их. а как?! пока я думаю написать плагин для ольки... который позволит отсеивать все заведомо незначимые функции.... дык, ручками, ручками... в ольке, если память не изменяет есть возможность открючить запись лога при трейсе из определенных мест. точнол не скажу как, но точно видел, причем в туторе с сайта самой ольки (что примитивное типа "как отлаживать" - давно было, не помню делается через контекстное меню для отмеченных строк кода) ![]() |
|
Создано: 12 апреля 2006 03:28 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . >> |
![]() |
eXeL@B —› Основной форум —› как покрывают быков - обсудим тему?! |