Russian Qt Forum
Июня 21, 2025, 20:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблемы демо  (Прочитано 10737 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Января 15, 2011, 16:02 »

Добрый день

Есть N "строк" одинаковой длины. Распределяются они в стиле С

Код
C++ (Qt)
for (i = 0; i < N; ++i)
line[i] = malloc(pixel_size * num_pixels);
 

Где pixel_size  может принимать значения степени 2 (4, 8, 16, 32, 64)

Задача: сделать так чтобы ни при каких сторонних модификациях кода (взломе) num_pixels никак не мог превысить заданное значение (640). Никаких уведомлений для пользователя не требуется - если код модифицирован, то сдохло, вылетело - все Ок.

Понимаю что задача странная, причудливая - но реально надо.

Спасибо
Записан
JamS007
Гость
« Ответ #1 : Января 15, 2011, 19:49 »

Идеальных защит не существует.
Я думаю, что единственно возможный вариант - проверить значение num_pixels непосредственно перед работой с памятью.

Updated: еще можно попробовать комбинировать разные типы данных, чтобы избежать превышения значения, но 640 вряд ли так можно добиться. Пример:

Код
C++ (Qt)
quint8 a, b, c;
// ...
for (i = 0; i < N; ++i)
line[i] = malloc(pixel_size * quint16(a+b+c));

Так можно добиться только значения, где максимально возможным будет 768 (256*3), зато его уже не так просто изменить в дебаггере. Можно также так:

Код
C++ (Qt)
quint8 a, b, c;
// ...
for (i = 0; i < N; ++i)
line[i] = malloc(pixel_size * quint16(a+b+c - 128)); // Получим 640

Но в таком случае нельзя быть точно уверенным, что с помощью отладчика нельзя будет обойти.

Updated: Улыбающийся Еще такой вариант, в продолжение уже сказанного:

Код
C++ (Qt)
quint8 a, b, c;
// ...
for (i = 0; i < N; ++i)
line[i] = malloc(pixel_size * quint16(a+b+c - (std::numeric_limits<qint8>::min()*-1))); // Получим 640
« Последнее редактирование: Января 15, 2011, 23:21 от HaySayCheese » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Января 15, 2011, 23:21 »

Идеальных защит не существует.
Я думаю, что единственно возможный вариант - проверить значение num_pixels непосредственно перед работой с памятью.
Ну "if" вообще не годится т.к легко забивается. Мне не нужна "защита", я не запрашиваю никаких паролей и.т.п. Мне надо построить код таким образом чтобы больший объем был недоступен. Упрощенный пример

Код:
char * theLine = (char *) malloc(640);  // здесь 640 можно подменить
char theLine2[640];                            // a здесь нет
А вот как это сделать для более сложного случая?

Edit: к сожалению, все значения <=  640 должны обрабатываться корректно
« Последнее редактирование: Января 15, 2011, 23:24 от Igors » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Января 16, 2011, 11:45 »

а если использовать не число, а строку и не одну? т.е. чтобы целочисленных констант очевидных в памяти не болталось

Код
C++ (Qt)
QString str1 = "598", str2 = "42";
line[i] = malloc(pixel_size * (str1.toInt() + str2.toInt()));
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Января 16, 2011, 13:51 »

а если использовать не число, а строку и не одну? т.е. чтобы целочисленных констант очевидных в памяти не болталось

Код
C++ (Qt)
QString str1 = "598", str2 = "42";
line[i] = malloc(pixel_size * (str1.toInt() + str2.toInt()));
Идея интересная, но вызов malloc прекрасно виден, как и число выделяемых байт, т.е. можно накрутить много вычислений но в итоге все равно получается "одно число"
Записан
brankovic
Гость
« Ответ #5 : Января 16, 2011, 15:14 »

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

Ну вы же и сами понимаете, что в общем случае задача неразрешима.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Января 16, 2011, 16:09 »

Ну вы же и сами понимаете, что в общем случае задача неразрешима.
Ну так сказать легко. А почему неразрешима - просто такого не написано в книжке?  Улыбающийся Ведь возможности есть - могу напр распределить все 1 блоком, могу всегда распределять 640 (ничего, примирюсь с напрасной тратой памяти, это демо), могу подселить какие-то переменные в хвост(ы) буфера. Откуда же такая уверенность в "неразрешимости"?
Записан
JamS007
Гость
« Ответ #7 : Января 16, 2011, 16:38 »

Если хотите просто  - то и защита будет от дурака. А если более-менее серьезно: способы защиты от дизассемблера и отладчика

Updated: еще вспомнил, есть такие программы упаковщики, которые сжимают исполняемый файл, и возвращают его в исходное состояние уже при выполнении и только в вирт. памяти. Минус этих программ - на них кидаются антивирусы и это win32 only.
« Последнее редактирование: Января 16, 2011, 16:41 от HaySayCheese » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Января 16, 2011, 16:58 »

Если хотите просто  - то и защита будет от дурака. А если более-менее серьезно: способы защиты от дизассемблера и отладчика

Updated: еще вспомнил, есть такие программы упаковщики, которые сжимают исполняемый файл, и возвращают его в исходное состояние уже при выполнении и только в вирт. памяти. Минус этих программ - на них кидаются антивирусы и это win32 only.
Да не хочу я "засисяться"  Улыбающийся Хочу написать такой код чтобы буфер не мог быть расширен ковырянием кода. Это не "защита" - хотя имеет к ней косвенное отношение.
Записан
ufna
Гость
« Ответ #9 : Января 16, 2011, 17:03 »

Мне кажется здесь нужно чисто считать строку-ключ на основании порядка байтов или еще чего в готовом экзешнике, дальше вшивать в этот экзешник проверку на соответствие "изначальной части" этой строке.
Записан
JamS007
Гость
« Ответ #10 : Января 16, 2011, 17:35 »

Мне кажется здесь нужно чисто считать строку-ключ на основании порядка байтов или еще чего в готовом экзешнике, дальше вшивать в этот экзешник проверку на соответствие "изначальной части" этой строке.

Это вряд ли поможет, ведь "ключ" можно считать и проверить в двух случаях: непосредственно при выделении памяти, или в другом месте программы.

Если проверять при выделении - то проверку можно легко перепрыгнуть засунув в код несколько jump’ов, а если проверять в другом месте (пусть в начале программы), то, во-первых, и эту проверку можно перепрыгнуть, а во-вторых - при выделении памяти ничего не мешает указать свой адрес, откуда брать "ключ".
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Января 16, 2011, 17:46 »

Igors, пусть расширяют буфер.
Ты дальше в коде контролируй предел. Всюду задай пару строковых констант размера, и всюду их используй, для проверки выхода за пределы данной величины.

Записан

Юра.
brankovic
Гость
« Ответ #12 : Января 16, 2011, 18:54 »

Ну вы же и сами понимаете, что в общем случае задача неразрешима.
Откуда же такая уверенность в "неразрешимости"?

Оттуда, что не определено понятие "модификация кода", какую бы наворот вы ни написали, в общем случае хакер может также его и убрать.

Если хотите избежать узкого места "константа в маллоке", то можно выделять изолированную страницу памяти, а потом делить её на 6 буферов начиная с 256-го байта, далее в программе _считать_ размер буфера равным введённому, любой больший размер приведёт к каше или SIGSEGV. Но тут вы опять скажете что хакер найдёт константу 6 и поправит и опять мы вернёмся к неразрешимой задаче.
Записан
JamS007
Гость
« Ответ #13 : Января 16, 2011, 19:23 »

<offtop>
... хакер найдёт ...

Хакер - человек, который ищет уязвимости в компьютерных системах. Взломщик (Крякер, Крэкер и т.д.) - человек, который изменяет бинарный код программы в свою пользу.
</offtop>
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Января 16, 2011, 20:02 »

Во-первых, спасибо всем отписавшимся. Понимаю что я завел "странную" тему - но мне надо решить эту проблему, не имеет значения хочу/нравится мне это или нет. Давайте не горячиться  
Оттуда, что не определено понятие "модификация кода", какую бы наворот вы ни написали, в общем случае хакер может также его и убрать.
Это справедливо для "полной" версии - которая напр. после ввода кода становится рабочей. Да, эта версия должна содержать "полный ф-циональный код" (и все превращается в "игру ловушек"). Но у меня такого ограничения нет. Простой пример

#if DEMO_VERSION
#else
 DoSaveFile();
#endif

И никакие ухищрения никакому хакеру не помогут - нельзя оживить код DoSaveFile которого нет -  не был создан компилятором.

Igors, пусть расширяют буфер.
Ты дальше в коде контролируй предел. Всюду задай пару строковых констант размера, и всюду их используй, для проверки выхода за пределы данной величины.
На первый взгляд - наивно. А если подумать? В совершенно др. месте вызывается проверка(и) на размер распределенного line[ i ] (технически не вопрос).  И если превышает - скромно (но со вкусом) гадим в каком-нибудь указателе. Что гений(и) могут против этого предпринять?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 20.