Про Баги и способы их исправления.

Компьютеры, программы, периферия, коммуникации, интернет, программирование и т.п. Ранее назывался Hard-n-Soft.
Сообщение
Автор
Злец
Аватара пользователя
Благодарил (а): 1916 раз
Поблагодарили: 1760 раз

№ 30 Сообщение Злец » 20 фев 2013 20:02

15: novoku пишет:
>> Даже для этой специальности )
>
> Ну в общем то да, если чел решил что белое это черное до дискутировать с ним бесполезняк..

А при чем тут "белое - это черное"?
ИМХО любой, кто представляет, что такое дизассемблер и с чем его едят, скажет то же, что и Burg.
Это Вам еще пока никто не намекнул, что разработчики обычно делают защиту от отладки и дизассемблирования.. Программа с передачей пространства памяти и управления оверлею, прогнанная через скремблер... Это что-то с чем-то. Там просто найти место, где выполняется конкретное действие - уже подвиг.

gn2

№ 31 Сообщение gn2 » 20 фев 2013 20:54

Да дисассемблерный код большой. Но нам там нужно найти определенное место. Допустим выдается "не верный код авторизации". В отладчике SoftIce (сейчас он в Driverstudio) устанавливаем точку прерывания на функции MessageBoxA. Далее с помощью этого отладчика находим откуда была вызвана эта функция.
Далее исследуем как мы попали на ее. И в итоге мы приходим на команду типа JZ (переход если 0) и тогда или меняем условие в предыдущей команде (часто это test или cmp) или заменяем на JNZ. Далее используя например HexEdit и дисассемблерный код вносим постоянные изменения в исполняемый файл.
Для простых защит вскрытие программы дело нескольких минут. Но для хорошо защищенных могут потребоваться и недели. Впрочем это зависит от интуиции хакера и его опыта. Некоторые программы не запускаются если обнаруживают, что работает отладчик SoftIce. Но это очень редкое явление.

Злец
Аватара пользователя
Благодарил (а): 1916 раз
Поблагодарили: 1760 раз

№ 32 Сообщение Злец » 21 фев 2013 19:07

31: gn2:
Угу. А потом оказывается, что MessageBoxA вызывается 100 раз из разных мест, а когда находим нужное место, то оказывается, что кусок с вызовом функции вынесен черт-те куда в хвост программы, а условие проверяется в начале, и переход между ними заныкан в середину.
А насчет редкости защит от работы под отладчиком - это, мягко говоря, не совсем правда. Если программа коммерческая (хотя бы шароварная), она, скорее всего, будет иметь такую защиту.

WhiteCat
Благодарил (а): 2 раза
Поблагодарили: 87 раз

№ 33 Сообщение WhiteCat » 21 фев 2013 19:27

О!!! Я придумал. Это будет полезно не только как разовое задание.
Берёте любую коммерческую программу, которая для своей установки или/и работы требует ввода ключа или наличия аппаратного ключа. Объявляете эту её фичу багом и исправляете его, делая программу свободной и бесплатной :)

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 34 Сообщение Burg » 21 фев 2013 19:39

33: WhiteCat:
Совершая тем самым противоправное деяние...

WhiteCat
Благодарил (а): 2 раза
Поблагодарили: 87 раз

№ 35 Сообщение WhiteCat » 21 фев 2013 20:11

34: Burg:
Зато по теме компьютерная безопасность - 100% пападание :)

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 36 Сообщение Burg » 21 фев 2013 20:16

35: WhiteCat:
ты серьезно не понимаешь, что если ты такое сделаешь и принесешь в качестве дипломной работы тебя как минимум оштрафуют, а как максимум - посадят?

WhiteCat
Благодарил (а): 2 раза
Поблагодарили: 87 раз

№ 37 Сообщение WhiteCat » 21 фев 2013 20:33

36: Burg:
Это была шутка. :)
А вот вполне законный и полезный вариант. Берем свободно выложенные исходники андроида для какого-либо смартфона или планшета (например, Асус их выкладывает в разделе загрузок к каждому своему андроид-устройству). Смотрим по форумам, на что жалуются пользователидевайса. Обычно это что-то типа некорректного алгоритма работы датчика освещённости или приближения, неудовлетворительная автоматическая регулировка яркости экрана и т.п. Ну и исправляем. Всё законно и полезно, если получится многие люди спасибо скажут.

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 38 Сообщение Burg » 21 фев 2013 20:41

37: WhiteCat:
ты это исправлять хочешь в дизасемблированном коде? Насколько я помню именно это было в начальных условиях.

WhiteCat
Благодарил (а): 2 раза
Поблагодарили: 87 раз

№ 39 Сообщение WhiteCat » 21 фев 2013 20:57

38: Burg:
Каков вопрос - таков и ответ. Человек так задачу поставил. Ему объяснили, что это мягко говоря сложно, но он же требует - так извольте получить.
Я вообще считаю, что поставленная им (или кем то для него) задача слишком сложна. Нафиг ковыряться в ассемблере для х86? Гораздо проще взять программу изначально написанную на ассемблере для какого-нибудь простого и хорошо изученного микроконтроллера (MCS-81, PIC, AVR и т.п.), управляющего маленькой простенькой схемкой. Там всё просто. И даже, если программа была написана на языке высокого уровня или с помощью алгоритм-билдера, разобраться в ассемблере там будет гораздо проще. С малого надо начинать, а не сразу в омут с головой твикать и хакать виндовые программы для процессоров х86.

gn2

№ 40 Сообщение gn2 » 22 фев 2013 17:15

32: Злец:
Во первых ты в дисассембелерном коде находишь текст сообщения. Далее ты ищешь все места где этот текст встречается. Но как правило после того как запустишь программу и введешь неправильный код у тебя будет вызван только один MessageBox с сообщением о неверном коде. А вот вызываться он может из разных мест. И если ты установил точку прерывания на MessageBox после ввода кода то только один MessageBox и будет вызван, а не множество. Другой путь отследить работу программы после ввода кода. Можно установить прерывание на функциях типа gettext (GetDldItemText, GetWindowText и др.). Далее установить прерывание по обращению к памяти куда был считан текст (у нас код регистрации) и отслеживать что делается с этим кодом. И в конце концов мы придем к участку кода где либо сравнивается введенный код с шаблоном (крайне редко) либо к алгоритму проверки правильности кода. Тогда на основе этого алгоритма легко написать генератор ключей для программы (keygen) и не потребуется ломать программу.

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 41 Сообщение Burg » 22 фев 2013 17:24

40: gn2:
:facepalm:

gn2

№ 42 Сообщение gn2 » 22 фев 2013 17:30

41: Burg:
А что значит этот смайлик?

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 43 Сообщение Burg » 22 фев 2013 17:46

41: Burg:
он означает что большинство твоих предположений неправильные. Сообщения в виндовом API передаются константами. И они не строковые. Код сообщения, которое должен вывести MessageBox - передается специальной функции, которая по коду выдает строковую константу.
А так как ты написал, конечно можно писать. Но так только лабораторные и пишут. А боле-менее серьезные программы имеют несколько генераторов строк по коду.

И опять же повторюсь, все это до включения оптимизации и различных миксеров кода. А уж после них, ты там вообще ничего не найдешь. Тем более строковую константу в чистом виде )

gn2

№ 44 Сообщение gn2 » 22 фев 2013 18:19

43: Burg:
Burg, я вскрыл достаточное количество программ. В SoftIce можно устанавливать прерывания (breakpoint) и на API windows. Например bpx MesageBoxA это команда которая устанвливает прерывание на вызове этой функции. Агрументы для разных MessageBox (MessageBoxA,MessageboxW,MessageBoxEx) передается как параметры и в ассемблере (только адреса некоторых параметоров могут быть в регистрах).
И обращение к функции MessageBoxEx и приводит к выдаче сообщения. Насчет того , что сообщение расшифровывается только перед выводом (в памяти его не найти) усложняет поиск нужной части кода, но тогда ищем этот участок кода другими способами.

gn2

№ 45 Сообщение gn2 » 22 фев 2013 18:27

43: Burg:
SoftIce не требует наличия какой то информации для отладки. Он работает с любым кодом оптимизированным или нет. Правда если он запакован кодировщиком его нужно распаковать. Для упаковщиков обычно на хакерских сайтах появляются и распаковщики.

gn2

№ 46 Сообщение gn2 » 22 фев 2013 19:01

45: gn2:
Утотчнение. распаковщик нужен только, чтобы внести изменения в исполняемый файл. При запуске он распаковывается сам и SoftIce может его вскрыть. Но внести изменения можно только в распакованный файл.

BIL
Аватара пользователя
Не админ нифига
Благодарил (а): 1 раз
Поблагодарили: 7 раз

№ 47 Сообщение BIL » 22 фев 2013 19:06

44: gn2 пишет:
> Burg, я вскрыл достаточное количество программ.

То есть, суть сохранения флагов в стеке, их восстановления в чем-то и манипулирования очевидна?
И изменение одной инструкцией следующей или рядом стоящей инструкции тоже?
Если да, можно рыпаться, но это не уровень студня.

> bpx MesageBoxA это команда которая устанвливает прерывание на вызове этой функции.

Отлично. Теперь мы знаем, что недавно нас ... опозорили. Ну, где-то тут, в пределах мегабайта. Ведь туда наверняка был джамп, а не кол...

> Насчет того , что сообщение расшифровывается только перед выводом (в памяти его не найти) усложняет поиск нужной части кода,

Да чихать на него хотели.
Только дурачок проверит легальность только сравнением с чем-то. Будет вычислено что-то, что потом будет использоваться. Частью которого является контроль правильности. Молодец, что узнал где это. Теперь подбери бит шиссот...

> Он работает с любым кодом оптимизированным или нет.

Только после оптимизации можно килобайт за писят от исследуемого кода улететь только ради того, чтобы сделать итерацию цикла. Так для оптимизатора звезды в коде сложились. И летать так, не перелетать.

Для примера. Два моих последних варианта защиты. Это простенькие - от вшивости...
1. Получаем код лицензии. Преобразовываем его каким-то (любым) способом в 128бит. Младшие 64 сверяем с числом. Если не совпало - ругаемся. Вот она нирвана - нашел и паламал. Правда есть нюанс - если эти 64 бита сошлись, дальше идет переход на старшие 64 бита. То есть, куда-то в пределах 4ГБ...
2. Начало примерно такое же. Лицензией преобразуется блок констант. Если в конце блока получилось нужное число - молодец. Если не получилось - твой MessageBoxW. Ты его поймал, преодолел и посчитал. Хрен знает что с этими константами.
Усложним 2й вариант. Точнее, сделаем нормальным. Лицензии нет. Привязываемся к MAC'у сервера. Тут вообще ничего не хранится у пользователя. Он даже на первый раз не даст чего-то, чтобы удачно алгоритм пройти.
А в коде еще лошение лоха, который тупо в отладчике гуляет или дизассемблирует исполняющим софтом.
И это у меня, по сути, нуба в защите программ. Что говорить о чем-то серьезном?..

Для затравки. Старые трюки из доса. Код выполняется в одном месте. Что-то ему не нравится. Он в стек заносит адрес лошения лоха. Хорошо, для умных лохов еще стописят случайных чисел - нам же сюда не возвращаться. И выполняет переход на адрес пусть того же надоевшего MessageBox. Его радостно отловили и что наблюдаем в стеке?..

Потом вспоминаем как легко нужный код вставить в сегмент кода и родить новый экзешнег.
Короче, сколько лет у этого студента был ассемблер с этой безопасностью? :)

BIL
Аватара пользователя
Не админ нифига
Благодарил (а): 1 раз
Поблагодарили: 7 раз

№ 48 Сообщение BIL » 22 фев 2013 19:14

43: Burg пишет:
> И они не строковые. Код сообщения, которое должен вывести MessageBox - передается специальной функции, которая по коду
> выдает строковую константу.

Сейчас... подожди... это идентификатор строки в ресурсах приложения? :)

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 49 Сообщение Burg » 22 фев 2013 19:17

48: BIL:
ну как бы обычно так делается... так логично и рекомендуется ) Можно конечно каждый раз пихать строковую константу но в условиях мало-мальски приличной проги - это неправильно.

BIL
Аватара пользователя
Не админ нифига
Благодарил (а): 1 раз
Поблагодарили: 7 раз

№ 50 Сообщение BIL » 22 фев 2013 19:25

Дело в том, что строкой может быть просто заXORенный набор байтов, который не легко найти в туловище программы и ее ресурсах. Ну, и в таблице строк тоже, конечно, никто не мешает такой калий хранить...
Да и каждый раз не получится - компилятор-то не пальцем деланный :) Он сообразит, что это одно и то же, и сложит в константу один раз.

gn2

№ 51 Сообщение gn2 » 22 фев 2013 19:36

47: BIL:
Ты работал с SoftIce? И что ты привязался к MessageBox. Это был пример вскрытия простейшей защиты.
<<Только после оптимизации можно килобайт за писят от исследуемого кода улететь только ради того, чтобы сделать итерацию цикла. Так для оптимизатора звезды в коде сложились. И летать так, не перелетать. >>
Нам не надо отслеживать каждую команду цикла. Мы ловим только определенные события. Например останов по записи или считывания из определенной ячейки памяти (где хранится код) и нам пофигу. что делается в цикле до этого. Нам важно, что будет делаться с нашим кодом.

<<1. Получаем код лицензии. Преобразовываем его каким-то (любым) способом в 128бит. Младшие 64 сверяем с числом. Если не совпало - ругаемся. Вот она нирвана - нашел и паламал. Правда есть нюанс - если эти 64 бита сошлись, дальше идет переход на старшие 64 бита. То есть, куда-то в пределах 4ГБ...>>

Вот этот алгоритм мы и найдем и расшифруем. Короче если есть код который очень нужно вскрыть, то найдется тот кто его вскроет как бы ты не старался. Если твой код никому не нужен, то можно и не тратить силы на его защиту.

gn2

№ 52 Сообщение gn2 » 22 фев 2013 19:43

Вызов функции MeesageBox
MessageBox(индификатор окна,"Не верный код","ошибка ввода кода",MB_OK);
Выведет кно с заголовком ошибка ввода кода с текстом Не верный код и с кнопкой OK (Да).

BIL
Аватара пользователя
Не админ нифига
Благодарил (а): 1 раз
Поблагодарили: 7 раз

№ 53 Сообщение BIL » 22 фев 2013 19:46

Офигеть

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 54 Сообщение Burg » 22 фев 2013 19:49

53: BIL:
:D

gn2

№ 55 Сообщение gn2 » 22 фев 2013 20:09

48: BIL:
MessageBox не принимает никаких индификаторов строки в ресурсах. она принимает указатели на стороки сообщения. заголовока окна и дескриптор окна и тип кнопки.

gn2

№ 56 Сообщение gn2 » 22 фев 2013 20:39

48: BIL:
49: Burg:
Использйте функцию LoadString, чтобы загрузить строку по ее идентификатору. А вот потом уже можно вызвать MessageBox используя уже адрес строки возвращенной этой функцией. Что то слабо верится, что вы программисты.

Burg
Аватара пользователя
Зок-модератор
Благодарил (а): 14 раз
Поблагодарили: 138 раз

№ 57 Сообщение Burg » 22 фев 2013 20:45

56: gn2:
:D Жги дальше!

gn2

№ 58 Сообщение gn2 » 22 фев 2013 20:47

57: Burg:
Да нет это все.

BIL
Аватара пользователя
Не админ нифига
Благодарил (а): 1 раз
Поблагодарили: 7 раз

№ 59 Сообщение BIL » 22 фев 2013 21:00

Ты не поверишь, люди давно под Windows не пишут не только на ассемблере, но и на чистом C.
Погугли про AfxMessageBox. Это что-то про MFC...
Прикинь, на ассемблере отлаживать программу, которая родилась на визуальном бейсике? Легче картошку окучить. Студенту-хакеру...

Вернуться в «Компьютерный форум»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей