Всем привет. И спасибо за быстрые отклики в предыдущих темах.
Я искал на вашем форуме, но не нашел... по поводу вопроса:
Можно ли взломать ".exe" файл созданный на Турбо паскале 7 ? (чтобы был виден алгоритм) Как это можно сделать?
Можно ли защитить файл от взлома, и как? Или хотябы, при взломе, "не дать" прочитать часть или весь алгоритм.
Просьба обьяснить это попонятней, поскльку я новичок в программировании.
xds
18.02.2005 6:59
1) общая идея алгоритма видна без взлома ;); 2) детали можно выяснить, немного подумав и (или) дизассемблировав код; 3) защита - шифровка бинарника (с присоединением расшифровщика, закодированного на ассемблере в неудобочитаемом виде); 4) здравый смысл и семантический анализ п. 3 подсказывает, что идеальной защиты не существует.
P.S. Последнее время еще стал популярен ASPack (только для бинарников типа Win32/PE), который, впрочем, легко грохается
Славик
18.02.2005 19:45
Обьясни пожалуйста свой первый пункт. Как это видна без взлома? Ведь одна и таже задача может быть написана разными способами. Мне способ надо не рассекретить.
А может есть какая нибудь программа, в которую можно вставить exe файл паскаля, и эта программа практически не ломаема? Мне надо чтоб exe файл работал, но подкопаться к нему чтобы нельзя. : )
Altair
18.02.2005 20:04
это не возможно, что бы совсем не подкопаться, когда программа выполняется, она загружается в память, и отуда ее можно выудить все равно!
SKVOZNJAK
18.02.2005 20:11
Используй побольше GOTO и констант, правильное значение которых проявляется только при выполнении проги И вскоре ты сам без описания не поймёшь её смысл.
SHnur
18.02.2005 20:32
также можеш использовать побольше break , exit , halt Короче операторы нарушающие структуру проги .
SKVOZNJAK
18.02.2005 20:38
exit , halt, repeat, until легко эмулируются при помощи GOTO
xds
18.02.2005 20:44
Цитата
Обьясни пожалуйста свой первый пункт. Как это видна без взлома? Ведь одна и таже задача может быть написана разными способами. Мне способ надо не рассекретить.
Раз ты догадался, что задача может быть решена несколькими способами, значит догадываешься и о последних (иначе, как бы ты отличил один от другого?)
Вопросы по существу: а надо ли защищать всю программу целиком (или можно выделить один критический участок)? С какой целью затевается "банкет"?
Славик
18.02.2005 21:15
Спасибо всем за отзывы. Кое что пересмотрю...
Есть два(нужных) варианта что ПРИМЕРНО нужно.
1) ПАРОЛЬ - Пользователь вводит 12345, и прога пишет Вышел Зайчик... : ))
Вот сам пароль(переменные для сличения), и саму переменную с сообщением, хотелось бы скрыть как то понадежней.
2) ОТРЕЗОК АЛГОРИТМА - шифрующий некоторые данные. Для примерна(простой) - ввожу число 34436345 и программа выдает "abtg". Значит, нужно скрыть переменые или содержимое переменных, и сам процесс шифрования.
Запутывания GOTO и другое, это (наверно) не совсем надежно. Мне хочется все же по проще как то. Запутывать так же ДОЛГО как и распутывать, если хочется МАКСИМАЛЬНО защитить алгоритм(часть алгоритма).
SKVOZNJAK
19.02.2005 6:39
GOTO не такое слабое как кажется. Допустим у тебя есть небольшой массив. Ты размазываешь его по всей программе, доступ к частям через гото и типизованные константы. Естественно имеется много других гото, в зависимости от вводимого пароля(его части) меняется сам алгоритм поиска частей размазанного массива. Похожая система применялась в спектрумбейсике. Ты смотришь на коротенький код и не можешь понять что он запускает По сути, алгоритм модифицируется во время исполнения, в него вбрасываются левые данные и на их основе происходят дальнейшие действия. Чтобы понять, нужно найти значения некоторых переменных в нужное время.
xds
19.02.2005 8:29
Цитата
Похожая система применялась в спектрумбейсике. Ты смотришь на коротенький код и не можешь понять что он запускает
Например, машинный код цеплялют (до сих пор, сценеры ) в "хвост" файла Бейсика (или в начало, после REM), а программа просто его запускает... К томуже, SOS-Basic для каждой численной константы хранит два представления: символьное (для отображения в листинге) и двоичное, непосредственно используемое интерпретатором. Поэтому, там, где мы видим "0", зачастую может храниться другое число, например 23837 В "магнитофонный период" еще был популярен нестандартный формат хранения на ленте.
Михаил Густокашин
20.02.2005 14:18
можно устроить xor с паролем на критический участок и проверить правильность по контрольной сумме. тогда пароль никоим образом не хранится в программе, а если не xor'ить лишнего, то будет даже достаточно эффективно.
ZeroLink
20.02.2005 18:15
Для защиты: 1) Шифруй все надписи типа "Copyr..." в самой проге см. http://far.by.ru/progs/graph.shtml №13 Программа-шифровщик. 2) Откомпилированную прогу сжимай каким-нибуди DIET'от. 3) Вставляй антитрассировку 4) Мысли не стандартно
Для взлома: 1) Учи Assembler 2) Изучи структуру exe прог 3) Запускай дизассембляторы
И помни, что любая защита рано или позно ломается!
Славик
20.02.2005 22:40
Некоторые предложения мне подойдут. Спасибо Вам!
ZeroLink: шифровальщик скачал... Посмотрю...
Михаил Густокашин писал про ХОГ. Что это такое и где взять информацию об этом?
Еще вопросы - можно ли из операционной системы, или как то еще, выудить алгоритм программы, подгруженный из другой программы?
2) Можно ли вообще подгружать часть алгоритма(хотябы) из другого файла в главную программу таким образом, чтобы в главной программе небыл указан адрес откуда подгружать. То есть, другая программа сама активизирует себя и сама "стучится" в главную программу.
3) Может ли подгружаемая програма, себя удалить сразу после своей самоактивации для высылания алгоритма?
volvo
20.02.2005 22:50
Цитата(Славик @ 20.02.05 17:40)
другая программа сама активизирует себя и сама "стучится" в главную программу.
Так какая же из них после этого главная? Кроме того, чтобы она могла себя активизировать, она должна "висеть" в памяти, не так ли? Или должно быть третье приложение, которое "висит" в памяти и после запуска главной программы активизирует вторую ...
Altair
20.02.2005 23:24
Цитата
Михаил Густокашин писал про ХОГ. Что это такое и где взять информацию об этом?
Он говрил не про ХОГ а про xor (XOR) - это команда, выполняет побитовую операцию xor. (иск. ИЛИ) Копай в сторону того, что a xor b=c тогда c xor b =a. то есть b - ключ. (пароль)
Славик
20.02.2005 23:37
Код
Так какая же из них после этого главная?
Если написано "Главная программа" - главная. А там где "другая" написано, или программка, это не главная.
Код
Кроме того, чтобы она могла себя активизировать, она должна "висеть" в памяти, не так ли?
Даже если и так, можно ли при этом ее выудить если бы она себя удаляла сразу же? (вообще из компа) И можно ли предотвратить ее удаление? (если учесть, что она бы при установке программы устанавливалась в случайное место на компе).
volvo
20.02.2005 23:45
Как я могу отвечать на конкретные вопросы, не имея никакой информации? Какая ОС, какие права (пользователь, админ)? Ничего же не известно... Я должен догадаться и ответить?
Славик
20.02.2005 23:53
Код
Какая ОС, какие права (пользователь, админ)?
Я имел ввиду, что хочу как то "скрыть" алгоритм(или часть) программы, которая будет запускаться уже на компах пользователей.
Если ты имеешь ввиду мой комп, для создания подобного засекречивания, то у меня Виндовс ХР профешшинал. (если еще надо какие то данные, напиши).
Altair
21.02.2005 0:04
Да можно сркыть все что угодно, можно сделать процесс-невидимым, сам файл (бинарник) - невидимым( система просто не будет видеть его) - все это можно сделать обрабатывая запросы WINAPI, в FAQ'e по Дельфи (автор:Вит) есть статья про это... срыть можно все что угодно, но дело в том, что в памяти программа находится без защиты , следовательно сняв снимок памяти, можно всегда все узнать... дело только в том, какие деньги вокруг этого... Ты скажи, что ты точно хочешь? что за программа, что ее так надежно надо защищать?
Guest
21.02.2005 0:21
Цитата
что за программа, что ее так надежно надо защищать?
Речь о любой программе. Сейчас, или потом, прийдется об этом подумать. Всегда есть вещи, которые не хочется распространять. Допустим, вид шифровки. Допустим, я пишу программу, которая зашифровывает текст. И ли просто создаю обычный пароль, но внутри программы паскаля. Или допустим, создаю игру, а в ней внутри одного файла есть много уровней. Перейти на которые можно лишь пройдя предыдущий и плучив пароль. Масса всего некомерческого. И защита просто необходима. И речь об обычных программках на Турбо Паскале.
Дело в том, что если защищать, так надежно, иначе нет смысла защищать.
Altair
21.02.2005 0:55
Цитата
Допустим, вид шифровки. Допустим, я пишу программу, которая зашифровывает текст.
так нажо писать программу, шифрования текста, так, что бы саму программу не надо было защищать...
Цитата
И защита просто необходима.
Пока я не вижу ничего, что требует защиты.. а если ты пишешь в TP7, то о мощной защите забудь...
И вообщ, хватит заниматься болтологией.. ты напиши, что-то, требующее защиты, тогда поможем защитить.....
Romtek
22.02.2005 5:15
Вставляй процедуры в критические места программы. Взято из книги Фаронова "Практика программирования на Турбо Паскаль 7.0".
Тема очень интересная и не все способы защиты здесь обсудили. Есть ещё одно направление. Как раз на паскалевских программах оно должно давать неплохую защиту для ограниченного количества информаци. Дизасемблирование не панацея. Дизасемблировать то можно всё, да кто потом в этом разберётся... Как раз пример такой проги, кошмар асматика. Нужно дизасемблировать и исправить ошибку
Guest
22.02.2005 19:16
Oleg_Z
Цитата
ты напиши, что-то, требующее защиты, тогда поможем защитить.....
Я считаю, что защиты требует создатель, на то что ОН(!) хочет.
Я сейчас перешел на Free Pascal, поэтому, можно и по нему давать советы для защиты. В целом, пересмотрю все уже данные советы, и буду заглядывать сюда еще. Спасибо всем за предыдущие советы и будущие(заранее спасибо) : )
Type BoolProc = function (s: string): boolean; PBoolProc = ^BoolProc;
Const HashSum: longint = 3412; // это, скорее всего, слабое место
var str: string;
Function Hash (Key: string): Longint; Var I, Sum:Integer; Begin Sum := 0; For I := 1 To Length (Key) Do Sum := Sum + (Ord (Key[I]) * (1 shl I)); Result := Sum; End;
function Passed (ss: string): boolean; begin Result := (Hash (ss) = HashSum); end;
procedure TestPsw (f: BoolProc); var b: boolean; begin b := f (str); writeln ('Passed test: ', b); end;
// здесь надо сбить кракера с толку (самый наивный способ :-) asm inc PP //если изменить адрес вызываемой функции проверки, то произойдёт ошибка dec PP //чтобы ошибка не произошла, здесь я возвращаю указатель обратно end;
TestPsw (PP); end.
В ней наверняка есть слабые места, но для начала сойдёт.
SKVOZNJAK
24.02.2005 19:56
Нда, защита, взлом, а в текстовом визуализаторе никто на код взглянуть и не догадался
Digitalator
7.03.2005 1:47
Цитата
Я считаю, что защиты требует создатель, на то что ОН(!) хочет.
Не думаю, что это правильный ход мыслей. Довольно глупо ставить СтарФорс на тетрис, или выпускать виндоуз по шароварной лицензии
Dark
9.03.2005 9:41
Если вы решили защитить вашу информацию то маааленькие советы: 1. Пойдите в ВУЗ на кафедру Защиты Информации. 2. Научитесь ломать программы, ну положим начнем с малого:
Вообще есть такой автор как Крис Касперски, который учит как взламывать программы, и сам показывает как их можно было бы лучше защитить, Я даю его тексты, точнее фрагменты из его книги. Я думаю кто захочет тот разберется - там используется асм и си.
Для тех кто любит техносказки - первая часть kasper01 вторая часть - его перевод обучалки от Орка "Взлом как искуство" третья - взлом програм, его собственные исследования IDA_PRO - его обучалка об IDA - взламывающей системе, и не только его...
Romtek
22.07.2005 3:14
Вот ещё исходник на FPC (Free Pascal), который легко переделать для любого другого компилятора. Функция замера текущего тика процессора (времени) GetClock реализуется с помощью функции GetTickCount из модуля Windows. Модуль Windows подключается именно по этой причине. Для портирования в ТП7 нужно заменить реализацию замера тика (времени) в функции GetClock на свою (можно через GetTime). Модуль MD5 можно взять отсюда: http://wikisource.org/wiki/MD5_Hash
Идея такова: вы вводите пароль в виде строки, специальная функция проверки сверяет пароль и потом выдаёт ответ в boolean о корректности. Сверка паролей делается при помощи известного алгоритма MD5, который выполняет односторонние преобразования и выдаёт хеш (hash). Кроме проверки хешей вводимых строк проверяется ещё и наличие отладочных инструментов (debugger). Если между точкой ввода и проверкой хешей замечена разница во времени, большая 10 тиков (на самом деле, без отладки она вообще = 0), то меняется адрес точки входа в функцию проверки хешей. Тогда программа "вылетит" с ошибкой. Пароль: "test"
{$IFDEF FPC} {$Mode Delphi} {$ENDIF FPC}
uses md5, Windows;
Type BoolProc = function (s: string): boolean; PBoolProc = ^BoolProc;
function GetClock () : DWord; begin Result := GetTickCount end;
function Passed (ss: string): boolean; begin Result := MD5Match (MD5String (ss), Hash); end;
procedure TestPsw (); var b: boolean; f: boolproc; pp: pointer; ds,de: DWord; dr: word; begin PP := @Passed; {...some operations...} ds := GetClock (); dr := 137 + random (1299); // просто цифры inc (PP, dr); // меняем точку входа в функцию проверки de := GetClock (); if (de - ds < 10) then // если разность больше 10 тиков, то прогу взламывают (дебагер)... dec (PP, dr); // возвращаем, если всё нормально ds := GetClock (); // просто так, для отвлечения внимания {.../some operations...} @f := PP; b := f (str); writeln ( 'Test passed: ', b ); end;