Про Баги и способы их исправления.
15: novoku пишет:
>> Даже для этой специальности )
>
> Ну в общем то да, если чел решил что белое это черное до дискутировать с ним бесполезняк..
А при чем тут "белое - это черное"?
ИМХО любой, кто представляет, что такое дизассемблер и с чем его едят, скажет то же, что и Burg.
Это Вам еще пока никто не намекнул, что разработчики обычно делают защиту от отладки и дизассемблирования.. Программа с передачей пространства памяти и управления оверлею, прогнанная через скремблер... Это что-то с чем-то. Там просто найти место, где выполняется конкретное действие - уже подвиг.
>> Даже для этой специальности )
>
> Ну в общем то да, если чел решил что белое это черное до дискутировать с ним бесполезняк..
А при чем тут "белое - это черное"?
ИМХО любой, кто представляет, что такое дизассемблер и с чем его едят, скажет то же, что и Burg.
Это Вам еще пока никто не намекнул, что разработчики обычно делают защиту от отладки и дизассемблирования.. Программа с передачей пространства памяти и управления оверлею, прогнанная через скремблер... Это что-то с чем-то. Там просто найти место, где выполняется конкретное действие - уже подвиг.
-
gn2
Да дисассемблерный код большой. Но нам там нужно найти определенное место. Допустим выдается "не верный код авторизации". В отладчике SoftIce (сейчас он в Driverstudio) устанавливаем точку прерывания на функции MessageBoxA. Далее с помощью этого отладчика находим откуда была вызвана эта функция.
Далее исследуем как мы попали на ее. И в итоге мы приходим на команду типа JZ (переход если 0) и тогда или меняем условие в предыдущей команде (часто это test или cmp) или заменяем на JNZ. Далее используя например HexEdit и дисассемблерный код вносим постоянные изменения в исполняемый файл.
Для простых защит вскрытие программы дело нескольких минут. Но для хорошо защищенных могут потребоваться и недели. Впрочем это зависит от интуиции хакера и его опыта. Некоторые программы не запускаются если обнаруживают, что работает отладчик SoftIce. Но это очень редкое явление.
Далее исследуем как мы попали на ее. И в итоге мы приходим на команду типа JZ (переход если 0) и тогда или меняем условие в предыдущей команде (часто это test или cmp) или заменяем на JNZ. Далее используя например HexEdit и дисассемблерный код вносим постоянные изменения в исполняемый файл.
Для простых защит вскрытие программы дело нескольких минут. Но для хорошо защищенных могут потребоваться и недели. Впрочем это зависит от интуиции хакера и его опыта. Некоторые программы не запускаются если обнаруживают, что работает отладчик SoftIce. Но это очень редкое явление.
31: gn2:
Угу. А потом оказывается, что MessageBoxA вызывается 100 раз из разных мест, а когда находим нужное место, то оказывается, что кусок с вызовом функции вынесен черт-те куда в хвост программы, а условие проверяется в начале, и переход между ними заныкан в середину.
А насчет редкости защит от работы под отладчиком - это, мягко говоря, не совсем правда. Если программа коммерческая (хотя бы шароварная), она, скорее всего, будет иметь такую защиту.
Угу. А потом оказывается, что MessageBoxA вызывается 100 раз из разных мест, а когда находим нужное место, то оказывается, что кусок с вызовом функции вынесен черт-те куда в хвост программы, а условие проверяется в начале, и переход между ними заныкан в середину.
А насчет редкости защит от работы под отладчиком - это, мягко говоря, не совсем правда. Если программа коммерческая (хотя бы шароварная), она, скорее всего, будет иметь такую защиту.
О!!! Я придумал. Это будет полезно не только как разовое задание.
Берёте любую коммерческую программу, которая для своей установки или/и работы требует ввода ключа или наличия аппаратного ключа. Объявляете эту её фичу багом и исправляете его, делая программу свободной и бесплатной
Берёте любую коммерческую программу, которая для своей установки или/и работы требует ввода ключа или наличия аппаратного ключа. Объявляете эту её фичу багом и исправляете его, делая программу свободной и бесплатной
33: WhiteCat:
Совершая тем самым противоправное деяние...
Совершая тем самым противоправное деяние...
34: Burg:
Зато по теме компьютерная безопасность - 100% пападание
Зато по теме компьютерная безопасность - 100% пападание
35: WhiteCat:
ты серьезно не понимаешь, что если ты такое сделаешь и принесешь в качестве дипломной работы тебя как минимум оштрафуют, а как максимум - посадят?
ты серьезно не понимаешь, что если ты такое сделаешь и принесешь в качестве дипломной работы тебя как минимум оштрафуют, а как максимум - посадят?
36: Burg:
Это была шутка.
А вот вполне законный и полезный вариант. Берем свободно выложенные исходники андроида для какого-либо смартфона или планшета (например, Асус их выкладывает в разделе загрузок к каждому своему андроид-устройству). Смотрим по форумам, на что жалуются пользователидевайса. Обычно это что-то типа некорректного алгоритма работы датчика освещённости или приближения, неудовлетворительная автоматическая регулировка яркости экрана и т.п. Ну и исправляем. Всё законно и полезно, если получится многие люди спасибо скажут.
Это была шутка.
А вот вполне законный и полезный вариант. Берем свободно выложенные исходники андроида для какого-либо смартфона или планшета (например, Асус их выкладывает в разделе загрузок к каждому своему андроид-устройству). Смотрим по форумам, на что жалуются пользователидевайса. Обычно это что-то типа некорректного алгоритма работы датчика освещённости или приближения, неудовлетворительная автоматическая регулировка яркости экрана и т.п. Ну и исправляем. Всё законно и полезно, если получится многие люди спасибо скажут.
37: WhiteCat:
ты это исправлять хочешь в дизасемблированном коде? Насколько я помню именно это было в начальных условиях.
ты это исправлять хочешь в дизасемблированном коде? Насколько я помню именно это было в начальных условиях.
38: Burg:
Каков вопрос - таков и ответ. Человек так задачу поставил. Ему объяснили, что это мягко говоря сложно, но он же требует - так извольте получить.
Я вообще считаю, что поставленная им (или кем то для него) задача слишком сложна. Нафиг ковыряться в ассемблере для х86? Гораздо проще взять программу изначально написанную на ассемблере для какого-нибудь простого и хорошо изученного микроконтроллера (MCS-81, PIC, AVR и т.п.), управляющего маленькой простенькой схемкой. Там всё просто. И даже, если программа была написана на языке высокого уровня или с помощью алгоритм-билдера, разобраться в ассемблере там будет гораздо проще. С малого надо начинать, а не сразу в омут с головой твикать и хакать виндовые программы для процессоров х86.
Каков вопрос - таков и ответ. Человек так задачу поставил. Ему объяснили, что это мягко говоря сложно, но он же требует - так извольте получить.
Я вообще считаю, что поставленная им (или кем то для него) задача слишком сложна. Нафиг ковыряться в ассемблере для х86? Гораздо проще взять программу изначально написанную на ассемблере для какого-нибудь простого и хорошо изученного микроконтроллера (MCS-81, PIC, AVR и т.п.), управляющего маленькой простенькой схемкой. Там всё просто. И даже, если программа была написана на языке высокого уровня или с помощью алгоритм-билдера, разобраться в ассемблере там будет гораздо проще. С малого надо начинать, а не сразу в омут с головой твикать и хакать виндовые программы для процессоров х86.
-
gn2
32: Злец:
Во первых ты в дисассембелерном коде находишь текст сообщения. Далее ты ищешь все места где этот текст встречается. Но как правило после того как запустишь программу и введешь неправильный код у тебя будет вызван только один MessageBox с сообщением о неверном коде. А вот вызываться он может из разных мест. И если ты установил точку прерывания на MessageBox после ввода кода то только один MessageBox и будет вызван, а не множество. Другой путь отследить работу программы после ввода кода. Можно установить прерывание на функциях типа gettext (GetDldItemText, GetWindowText и др.). Далее установить прерывание по обращению к памяти куда был считан текст (у нас код регистрации) и отслеживать что делается с этим кодом. И в конце концов мы придем к участку кода где либо сравнивается введенный код с шаблоном (крайне редко) либо к алгоритму проверки правильности кода. Тогда на основе этого алгоритма легко написать генератор ключей для программы (keygen) и не потребуется ломать программу.
Во первых ты в дисассембелерном коде находишь текст сообщения. Далее ты ищешь все места где этот текст встречается. Но как правило после того как запустишь программу и введешь неправильный код у тебя будет вызван только один MessageBox с сообщением о неверном коде. А вот вызываться он может из разных мест. И если ты установил точку прерывания на MessageBox после ввода кода то только один MessageBox и будет вызван, а не множество. Другой путь отследить работу программы после ввода кода. Можно установить прерывание на функциях типа gettext (GetDldItemText, GetWindowText и др.). Далее установить прерывание по обращению к памяти куда был считан текст (у нас код регистрации) и отслеживать что делается с этим кодом. И в конце концов мы придем к участку кода где либо сравнивается введенный код с шаблоном (крайне редко) либо к алгоритму проверки правильности кода. Тогда на основе этого алгоритма легко написать генератор ключей для программы (keygen) и не потребуется ломать программу.
41: Burg:
он означает что большинство твоих предположений неправильные. Сообщения в виндовом API передаются константами. И они не строковые. Код сообщения, которое должен вывести MessageBox - передается специальной функции, которая по коду выдает строковую константу.
А так как ты написал, конечно можно писать. Но так только лабораторные и пишут. А боле-менее серьезные программы имеют несколько генераторов строк по коду.
И опять же повторюсь, все это до включения оптимизации и различных миксеров кода. А уж после них, ты там вообще ничего не найдешь. Тем более строковую константу в чистом виде )
он означает что большинство твоих предположений неправильные. Сообщения в виндовом API передаются константами. И они не строковые. Код сообщения, которое должен вывести MessageBox - передается специальной функции, которая по коду выдает строковую константу.
А так как ты написал, конечно можно писать. Но так только лабораторные и пишут. А боле-менее серьезные программы имеют несколько генераторов строк по коду.
И опять же повторюсь, все это до включения оптимизации и различных миксеров кода. А уж после них, ты там вообще ничего не найдешь. Тем более строковую константу в чистом виде )
-
gn2
43: Burg:
Burg, я вскрыл достаточное количество программ. В SoftIce можно устанавливать прерывания (breakpoint) и на API windows. Например bpx MesageBoxA это команда которая устанвливает прерывание на вызове этой функции. Агрументы для разных MessageBox (MessageBoxA,MessageboxW,MessageBoxEx) передается как параметры и в ассемблере (только адреса некоторых параметоров могут быть в регистрах).
И обращение к функции MessageBoxEx и приводит к выдаче сообщения. Насчет того , что сообщение расшифровывается только перед выводом (в памяти его не найти) усложняет поиск нужной части кода, но тогда ищем этот участок кода другими способами.
Burg, я вскрыл достаточное количество программ. В SoftIce можно устанавливать прерывания (breakpoint) и на API windows. Например bpx MesageBoxA это команда которая устанвливает прерывание на вызове этой функции. Агрументы для разных MessageBox (MessageBoxA,MessageboxW,MessageBoxEx) передается как параметры и в ассемблере (только адреса некоторых параметоров могут быть в регистрах).
И обращение к функции MessageBoxEx и приводит к выдаче сообщения. Насчет того , что сообщение расшифровывается только перед выводом (в памяти его не найти) усложняет поиск нужной части кода, но тогда ищем этот участок кода другими способами.
-
gn2
43: Burg:
SoftIce не требует наличия какой то информации для отладки. Он работает с любым кодом оптимизированным или нет. Правда если он запакован кодировщиком его нужно распаковать. Для упаковщиков обычно на хакерских сайтах появляются и распаковщики.
SoftIce не требует наличия какой то информации для отладки. Он работает с любым кодом оптимизированным или нет. Правда если он запакован кодировщиком его нужно распаковать. Для упаковщиков обычно на хакерских сайтах появляются и распаковщики.
-
gn2
45: gn2:
Утотчнение. распаковщик нужен только, чтобы внести изменения в исполняемый файл. При запуске он распаковывается сам и SoftIce может его вскрыть. Но внести изменения можно только в распакованный файл.
Утотчнение. распаковщик нужен только, чтобы внести изменения в исполняемый файл. При запуске он распаковывается сам и SoftIce может его вскрыть. Но внести изменения можно только в распакованный файл.
44: gn2 пишет:
> Burg, я вскрыл достаточное количество программ.
То есть, суть сохранения флагов в стеке, их восстановления в чем-то и манипулирования очевидна?
И изменение одной инструкцией следующей или рядом стоящей инструкции тоже?
Если да, можно рыпаться, но это не уровень студня.
> bpx MesageBoxA это команда которая устанвливает прерывание на вызове этой функции.
Отлично. Теперь мы знаем, что недавно нас ... опозорили. Ну, где-то тут, в пределах мегабайта. Ведь туда наверняка был джамп, а не кол...
> Насчет того , что сообщение расшифровывается только перед выводом (в памяти его не найти) усложняет поиск нужной части кода,
Да чихать на него хотели.
Только дурачок проверит легальность только сравнением с чем-то. Будет вычислено что-то, что потом будет использоваться. Частью которого является контроль правильности. Молодец, что узнал где это. Теперь подбери бит шиссот...
> Он работает с любым кодом оптимизированным или нет.
Только после оптимизации можно килобайт за писят от исследуемого кода улететь только ради того, чтобы сделать итерацию цикла. Так для оптимизатора звезды в коде сложились. И летать так, не перелетать.
Для примера. Два моих последних варианта защиты. Это простенькие - от вшивости...
1. Получаем код лицензии. Преобразовываем его каким-то (любым) способом в 128бит. Младшие 64 сверяем с числом. Если не совпало - ругаемся. Вот она нирвана - нашел и паламал. Правда есть нюанс - если эти 64 бита сошлись, дальше идет переход на старшие 64 бита. То есть, куда-то в пределах 4ГБ...
2. Начало примерно такое же. Лицензией преобразуется блок констант. Если в конце блока получилось нужное число - молодец. Если не получилось - твой MessageBoxW. Ты его поймал, преодолел и посчитал. Хрен знает что с этими константами.
Усложним 2й вариант. Точнее, сделаем нормальным. Лицензии нет. Привязываемся к MAC'у сервера. Тут вообще ничего не хранится у пользователя. Он даже на первый раз не даст чего-то, чтобы удачно алгоритм пройти.
А в коде еще лошение лоха, который тупо в отладчике гуляет или дизассемблирует исполняющим софтом.
И это у меня, по сути, нуба в защите программ. Что говорить о чем-то серьезном?..
Для затравки. Старые трюки из доса. Код выполняется в одном месте. Что-то ему не нравится. Он в стек заносит адрес лошения лоха. Хорошо, для умных лохов еще стописят случайных чисел - нам же сюда не возвращаться. И выполняет переход на адрес пусть того же надоевшего MessageBox. Его радостно отловили и что наблюдаем в стеке?..
Потом вспоминаем как легко нужный код вставить в сегмент кода и родить новый экзешнег.
Короче, сколько лет у этого студента был ассемблер с этой безопасностью?
> Burg, я вскрыл достаточное количество программ.
То есть, суть сохранения флагов в стеке, их восстановления в чем-то и манипулирования очевидна?
И изменение одной инструкцией следующей или рядом стоящей инструкции тоже?
Если да, можно рыпаться, но это не уровень студня.
> bpx MesageBoxA это команда которая устанвливает прерывание на вызове этой функции.
Отлично. Теперь мы знаем, что недавно нас ... опозорили. Ну, где-то тут, в пределах мегабайта. Ведь туда наверняка был джамп, а не кол...
> Насчет того , что сообщение расшифровывается только перед выводом (в памяти его не найти) усложняет поиск нужной части кода,
Да чихать на него хотели.
Только дурачок проверит легальность только сравнением с чем-то. Будет вычислено что-то, что потом будет использоваться. Частью которого является контроль правильности. Молодец, что узнал где это. Теперь подбери бит шиссот...
> Он работает с любым кодом оптимизированным или нет.
Только после оптимизации можно килобайт за писят от исследуемого кода улететь только ради того, чтобы сделать итерацию цикла. Так для оптимизатора звезды в коде сложились. И летать так, не перелетать.
Для примера. Два моих последних варианта защиты. Это простенькие - от вшивости...
1. Получаем код лицензии. Преобразовываем его каким-то (любым) способом в 128бит. Младшие 64 сверяем с числом. Если не совпало - ругаемся. Вот она нирвана - нашел и паламал. Правда есть нюанс - если эти 64 бита сошлись, дальше идет переход на старшие 64 бита. То есть, куда-то в пределах 4ГБ...
2. Начало примерно такое же. Лицензией преобразуется блок констант. Если в конце блока получилось нужное число - молодец. Если не получилось - твой MessageBoxW. Ты его поймал, преодолел и посчитал. Хрен знает что с этими константами.
Усложним 2й вариант. Точнее, сделаем нормальным. Лицензии нет. Привязываемся к MAC'у сервера. Тут вообще ничего не хранится у пользователя. Он даже на первый раз не даст чего-то, чтобы удачно алгоритм пройти.
А в коде еще лошение лоха, который тупо в отладчике гуляет или дизассемблирует исполняющим софтом.
И это у меня, по сути, нуба в защите программ. Что говорить о чем-то серьезном?..
Для затравки. Старые трюки из доса. Код выполняется в одном месте. Что-то ему не нравится. Он в стек заносит адрес лошения лоха. Хорошо, для умных лохов еще стописят случайных чисел - нам же сюда не возвращаться. И выполняет переход на адрес пусть того же надоевшего MessageBox. Его радостно отловили и что наблюдаем в стеке?..
Потом вспоминаем как легко нужный код вставить в сегмент кода и родить новый экзешнег.
Короче, сколько лет у этого студента был ассемблер с этой безопасностью?
43: Burg пишет:
> И они не строковые. Код сообщения, которое должен вывести MessageBox - передается специальной функции, которая по коду
> выдает строковую константу.
Сейчас... подожди... это идентификатор строки в ресурсах приложения?
> И они не строковые. Код сообщения, которое должен вывести MessageBox - передается специальной функции, которая по коду
> выдает строковую константу.
Сейчас... подожди... это идентификатор строки в ресурсах приложения?
48: BIL:
ну как бы обычно так делается... так логично и рекомендуется ) Можно конечно каждый раз пихать строковую константу но в условиях мало-мальски приличной проги - это неправильно.
ну как бы обычно так делается... так логично и рекомендуется ) Можно конечно каждый раз пихать строковую константу но в условиях мало-мальски приличной проги - это неправильно.
Дело в том, что строкой может быть просто заXORенный набор байтов, который не легко найти в туловище программы и ее ресурсах. Ну, и в таблице строк тоже, конечно, никто не мешает такой калий хранить...
Да и каждый раз не получится - компилятор-то не пальцем деланный
Он сообразит, что это одно и то же, и сложит в константу один раз.
Да и каждый раз не получится - компилятор-то не пальцем деланный
-
gn2
47: BIL:
Ты работал с SoftIce? И что ты привязался к MessageBox. Это был пример вскрытия простейшей защиты.
<<Только после оптимизации можно килобайт за писят от исследуемого кода улететь только ради того, чтобы сделать итерацию цикла. Так для оптимизатора звезды в коде сложились. И летать так, не перелетать. >>
Нам не надо отслеживать каждую команду цикла. Мы ловим только определенные события. Например останов по записи или считывания из определенной ячейки памяти (где хранится код) и нам пофигу. что делается в цикле до этого. Нам важно, что будет делаться с нашим кодом.
<<1. Получаем код лицензии. Преобразовываем его каким-то (любым) способом в 128бит. Младшие 64 сверяем с числом. Если не совпало - ругаемся. Вот она нирвана - нашел и паламал. Правда есть нюанс - если эти 64 бита сошлись, дальше идет переход на старшие 64 бита. То есть, куда-то в пределах 4ГБ...>>
Вот этот алгоритм мы и найдем и расшифруем. Короче если есть код который очень нужно вскрыть, то найдется тот кто его вскроет как бы ты не старался. Если твой код никому не нужен, то можно и не тратить силы на его защиту.
Ты работал с SoftIce? И что ты привязался к MessageBox. Это был пример вскрытия простейшей защиты.
<<Только после оптимизации можно килобайт за писят от исследуемого кода улететь только ради того, чтобы сделать итерацию цикла. Так для оптимизатора звезды в коде сложились. И летать так, не перелетать. >>
Нам не надо отслеживать каждую команду цикла. Мы ловим только определенные события. Например останов по записи или считывания из определенной ячейки памяти (где хранится код) и нам пофигу. что делается в цикле до этого. Нам важно, что будет делаться с нашим кодом.
<<1. Получаем код лицензии. Преобразовываем его каким-то (любым) способом в 128бит. Младшие 64 сверяем с числом. Если не совпало - ругаемся. Вот она нирвана - нашел и паламал. Правда есть нюанс - если эти 64 бита сошлись, дальше идет переход на старшие 64 бита. То есть, куда-то в пределах 4ГБ...>>
Вот этот алгоритм мы и найдем и расшифруем. Короче если есть код который очень нужно вскрыть, то найдется тот кто его вскроет как бы ты не старался. Если твой код никому не нужен, то можно и не тратить силы на его защиту.
-
gn2
Вызов функции MeesageBox
MessageBox(индификатор окна,"Не верный код","ошибка ввода кода",MB_OK);
Выведет кно с заголовком ошибка ввода кода с текстом Не верный код и с кнопкой OK (Да).
MessageBox(индификатор окна,"Не верный код","ошибка ввода кода",MB_OK);
Выведет кно с заголовком ошибка ввода кода с текстом Не верный код и с кнопкой OK (Да).
-
gn2
48: BIL:
MessageBox не принимает никаких индификаторов строки в ресурсах. она принимает указатели на стороки сообщения. заголовока окна и дескриптор окна и тип кнопки.
MessageBox не принимает никаких индификаторов строки в ресурсах. она принимает указатели на стороки сообщения. заголовока окна и дескриптор окна и тип кнопки.
-
gn2
48: BIL:
49: Burg:
Использйте функцию LoadString, чтобы загрузить строку по ее идентификатору. А вот потом уже можно вызвать MessageBox используя уже адрес строки возвращенной этой функцией. Что то слабо верится, что вы программисты.
49: Burg:
Использйте функцию LoadString, чтобы загрузить строку по ее идентификатору. А вот потом уже можно вызвать MessageBox используя уже адрес строки возвращенной этой функцией. Что то слабо верится, что вы программисты.
56: gn2:
Жги дальше!
Ты не поверишь, люди давно под Windows не пишут не только на ассемблере, но и на чистом C.
Погугли про AfxMessageBox. Это что-то про MFC...
Прикинь, на ассемблере отлаживать программу, которая родилась на визуальном бейсике? Легче картошку окучить. Студенту-хакеру...
Погугли про AfxMessageBox. Это что-то про MFC...
Прикинь, на ассемблере отлаживать программу, которая родилась на визуальном бейсике? Легче картошку окучить. Студенту-хакеру...
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей