Помощь - Поиск - Пользователи - Календарь
Полная версия: Защита от взлома
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Славик
Всем привет. И спасибо за быстрые отклики в предыдущих темах.

Я искал на вашем форуме, но не нашел... по поводу вопроса:

Можно ли взломать ".exe" файл созданный на Турбо паскале 7 ? (чтобы был виден алгоритм)
Как это можно сделать?

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

Просьба обьяснить это попонятней, поскльку я новичок в программировании.
xds
1) общая идея алгоритма видна без взлома ;);
2) детали можно выяснить, немного подумав и (или) дизассемблировав код;
3) защита - шифровка бинарника (с присоединением расшифровщика, закодированного на ассемблере в неудобочитаемом виде);
4) здравый смысл и семантический анализ п. 3 подсказывает, что идеальной защиты не существует.

P.S. Последнее время еще стал популярен ASPack (только для бинарников типа Win32/PE), который, впрочем, легко грохается smile.gif
Славик
Обьясни пожалуйста свой первый пункт. Как это видна без взлома? Ведь одна и таже задача может быть написана разными способами. Мне способ надо не рассекретить.

А может есть какая нибудь программа, в которую можно вставить exe файл паскаля, и эта программа практически не ломаема?
Мне надо чтоб exe файл работал, но подкопаться к нему чтобы нельзя. : )
Altair
это не возможно, что бы совсем не подкопаться, когда программа выполняется, она загружается в память, и отуда ее можно выудить все равно!
SKVOZNJAK
Используй побольше GOTO и констант, правильное значение которых проявляется только при выполнении проги smile.gif И вскоре ты сам без описания не поймёшь её смысл.
SHnur
также можеш использовать побольше break , exit , halt
Короче операторы нарушающие структуру проги .
SKVOZNJAK
exit , halt, repeat, until легко эмулируются при помощи GOTO
xds
Цитата
Обьясни пожалуйста свой первый пункт. Как это видна без взлома? Ведь одна и таже задача может быть написана разными способами. Мне способ надо не рассекретить.

Раз ты догадался, что задача может быть решена несколькими способами, значит догадываешься и о последних (иначе, как бы ты отличил один от другого?) smile.gif

Вопросы по существу: а надо ли защищать всю программу целиком (или можно выделить один критический участок)? С какой целью затевается "банкет"?
Славик
Спасибо всем за отзывы. Кое что пересмотрю...

Есть два(нужных) варианта что ПРИМЕРНО нужно.

1) ПАРОЛЬ - Пользователь вводит 12345, и прога пишет Вышел Зайчик... : ))

Вот сам пароль(переменные для сличения), и саму переменную с сообщением, хотелось бы скрыть как то понадежней.

2) ОТРЕЗОК АЛГОРИТМА - шифрующий некоторые данные.
Для примерна(простой) - ввожу число 34436345 и программа выдает "abtg".
Значит, нужно скрыть переменые или содержимое переменных, и сам процесс шифрования.

Запутывания GOTO и другое, это (наверно) не совсем надежно.
Мне хочется все же по проще как то. Запутывать так же ДОЛГО как и распутывать, если хочется МАКСИМАЛЬНО защитить алгоритм(часть алгоритма).
SKVOZNJAK
GOTO не такое слабое как кажется. Допустим у тебя есть небольшой массив. Ты размазываешь его по всей программе, доступ к частям через гото и типизованные константы. Естественно имеется много других гото, в зависимости от вводимого пароля(его части) меняется сам алгоритм поиска частей размазанного массива. Похожая система применялась в спектрумбейсике. Ты смотришь на коротенький код и не можешь понять что он запускает smile.gif По сути, алгоритм модифицируется во время исполнения, в него вбрасываются левые данные и на их основе происходят дальнейшие действия. Чтобы понять, нужно найти значения некоторых переменных в нужное время.
xds
Цитата
Похожая система применялась в спектрумбейсике. Ты смотришь на коротенький код и не можешь понять что он запускает smile.gif

Например, машинный код цеплялют (до сих пор, сценеры smile.gif) в "хвост" файла Бейсика (или в начало, после REM), а программа просто его запускает... К томуже, SOS-Basic для каждой численной константы хранит два представления: символьное (для отображения в листинге) и двоичное, непосредственно используемое интерпретатором. Поэтому, там, где мы видим "0", зачастую может храниться другое число, например 23837 smile.gif В "магнитофонный период" еще был популярен нестандартный формат хранения на ленте.
Михаил Густокашин
можно устроить xor с паролем на критический участок и проверить правильность по контрольной сумме. тогда пароль никоим образом не хранится в программе, а если не xor'ить лишнего, то будет даже достаточно эффективно.
ZeroLink
Для защиты:
1) Шифруй все надписи типа "Copyr..." в самой проге
см. http://far.by.ru/progs/graph.shtml №13 Программа-шифровщик.
2) Откомпилированную прогу сжимай каким-нибуди DIET'от.
3) Вставляй антитрассировку
4) Мысли не стандартно

Для взлома:
1) Учи Assembler
2) Изучи структуру exe прог
3) Запускай дизассембляторы

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

ZeroLink: шифровальщик скачал... Посмотрю...

Михаил Густокашин писал про ХОГ. Что это такое и где взять информацию об этом?


Еще вопросы - можно ли из операционной системы, или как то еще, выудить алгоритм программы, подгруженный из другой программы?

2) Можно ли вообще подгружать часть алгоритма(хотябы) из другого файла в главную программу таким образом, чтобы в главной программе небыл указан адрес откуда подгружать. То есть, другая программа сама активизирует себя и сама "стучится" в главную программу.

3) Может ли подгружаемая програма, себя удалить сразу после своей самоактивации для высылания алгоритма?
volvo
Цитата(Славик @ 20.02.05 17:40)
другая программа сама активизирует себя и сама "стучится" в главную программу.
blink.gif
Так какая же из них после этого главная? Кроме того, чтобы она могла себя активизировать, она должна "висеть" в памяти, не так ли? Или должно быть третье приложение, которое "висит" в памяти и после запуска главной программы активизирует вторую ...
Altair
Цитата
Михаил Густокашин писал про ХОГ. Что это такое и где взять информацию об этом?

Он говрил не про ХОГ а про xor (XOR) -
это команда, выполняет побитовую операцию xor. (иск. ИЛИ)
Копай в сторону того, что
a xor b=c
тогда c xor b =a.
то есть b - ключ. (пароль)
Славик
Код
Так какая же из них после этого главная?


Если написано "Главная программа" - главная.
А там где "другая" написано, или программка, это не главная.

Код
Кроме того, чтобы она могла себя активизировать, она должна "висеть" в памяти, не так ли?


Даже если и так, можно ли при этом ее выудить если бы она себя удаляла сразу же? (вообще из компа) И можно ли предотвратить ее удаление? (если учесть, что она бы при установке программы устанавливалась в случайное место на компе).
volvo
Как я могу отвечать на конкретные вопросы, не имея никакой информации? Какая ОС, какие права (пользователь, админ)? Ничего же не известно... Я должен догадаться и ответить?
Славик
Код
Какая ОС, какие права (пользователь, админ)?


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

Если ты имеешь ввиду мой комп, для создания подобного засекречивания, то у меня Виндовс ХР профешшинал. (если еще надо какие то данные, напиши).
Altair
Да можно сркыть все что угодно, можно сделать процесс-невидимым, сам файл (бинарник) - невидимым( система просто не будет видеть его) - все это можно сделать обрабатывая запросы WINAPI, в FAQ'e по Дельфи (автор:Вит) есть статья про это...
срыть можно все что угодно, но дело в том, что в памяти программа находится без защиты , следовательно сняв снимок памяти, можно всегда все узнать... дело только в том, какие деньги вокруг этого...
Ты скажи, что ты точно хочешь? что за программа, что ее так надежно надо защищать?
Guest
Цитата
что за программа, что ее так надежно надо защищать?


Речь о любой программе. Сейчас, или потом, прийдется об этом подумать. Всегда есть вещи, которые не хочется распространять. Допустим, вид шифровки. Допустим, я пишу программу, которая зашифровывает текст.
И ли просто создаю обычный пароль, но внутри программы паскаля.
Или допустим, создаю игру, а в ней внутри одного файла есть много уровней. Перейти на которые можно лишь пройдя предыдущий и плучив пароль.
Масса всего некомерческого. И защита просто необходима.
И речь об обычных программках на Турбо Паскале.

Дело в том, что если защищать, так надежно, иначе нет смысла защищать.
Altair
Цитата
Допустим, вид шифровки. Допустим, я пишу программу, которая зашифровывает текст.

так нажо писать программу, шифрования текста, так, что бы саму программу не надо было защищать...
Цитата
И защита просто необходима.

Пока я не вижу ничего, что требует защиты..
а если ты пишешь в TP7, то о мощной защите забудь...

И вообщ, хватит заниматься болтологией.. ты напиши, что-то, требующее защиты, тогда поможем защитить.....
Romtek
Вставляй процедуры в критические места программы. Взято из книги Фаронова "Практика программирования на Турбо Паскаль 7.0".
Код
Procedure TrassBlock1;
 {îá¬α«ß ñ½∩ í«α∞íδ ß Γαáßß¿α«ó¬«⌐
  ß »«¼«Θ∞ε ¼«ñ¿Σ¿¬áµ¿¿ ¬«¼á¡ñδ}
inline(
{@0:}
 $0E/        {push cs}
 $E8/$00/$00/       {call @1}
{@1:}
 $5B/        {pop  bx}
 $83/$EB/$04/       {sub  bx,@1-@0}
 $07/        {pop  es}
 $53/        {push bx}
 $B4/$C3/       {mov  ah,$C3}
 $26/$88/$67/$11/$90/ {mov  es:[bx+@2-@0],ah}
{@2:}
 $90/        {nop}
 $B4/$90/       {mov  ah,$90}
 $26/$88/$67/$11/$90/ {mov  es:[bx+@2-@0],ah}
 $5B);        {pop  bx}
{------------------}
Procedure TrassBlock2;
 {ü«α∞íá ß Γαáßß¿α«ó¬«⌐ ß »«¼«Θ∞ε
  ¬«¡Γα«½∩ óαѼѡ¿}
var
 t1,t2: LongInt;
begin
 t1 := MemL[0:$046C];
 t2 := 0;
 repeat
    while MemL[0:$046C]=t1 do;
    while MemL[0:$046C]<t1+2 do
    inc(t2);
 until t2>=500;
 TrassBlock1;
end;  {TrassBlock2}
В кодировке ДОС
SKVOZNJAK
Тема очень интересная и не все способы защиты здесь обсудили. Есть ещё одно направление. Как раз на паскалевских программах оно должно давать неплохую защиту для ограниченного количества информаци. Дизасемблирование не панацея. Дизасемблировать то можно всё, да кто потом в этом разберётся...
Как раз пример такой проги, кошмар асматика. Нужно дизасемблировать и исправить ошибку smile.gif
Guest
Oleg_Z
Цитата
ты напиши, что-то, требующее защиты, тогда поможем защитить.....

Я считаю, что защиты требует создатель, на то что ОН(!) хочет.

Romtek : Спасибо. Попробую...
SKVOZNJAK : ок... : )

Я сейчас перешел на Free Pascal, поэтому, можно и по нему давать советы для защиты. В целом, пересмотрю все уже данные советы, и буду заглядывать сюда еще. Спасибо всем за предыдущие советы и будущие(заранее спасибо) : )
SKVOZNJAK
Как продвигается дизасемблирование проги ;)
Romtek
Советую прочитать статьи в CRACKL@B: http://www.cracklab.ru/art/
Крутая защита или CRACKL@B CrackMe #1
Исследование защит shareware-программ
Там много полезной информации. Чтобы защищать программы, надо немного самому уметь ломать программы. Или хотя бы знать на что обращать внимание, где слабые места и всё такое.

Вот ещё тебе кусок, для старта:
Код
(* Проверка правильности ввода строки *)

//uses
//     SysUtils;

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;

var
 pp: pointer;

begin
    write ('Enter password: ');  readln (str);

    pp := @Passed;

// ***  Debugging:
//     writeln (IntToHex(Longint(@Passed),8));
//     writeln (IntToHex(Longint(pp),8));

    // здесь надо сбить кракера с толку (самый наивный способ :-)
    asm
      inc PP  //если изменить адрес вызываемой функции проверки, то произойдёт ошибка
      dec PP //чтобы ошибка не произошла, здесь я возвращаю указатель обратно
    end;

    TestPsw (PP);
end.

В ней наверняка есть слабые места, но для начала сойдёт.
SKVOZNJAK
Нда, защита, взлом, а в текстовом визуализаторе никто на код взглянуть и не догадался blink.gif
Digitalator
Цитата
Я считаю, что защиты требует создатель, на то что ОН(!) хочет.

Не думаю, что это правильный ход мыслей. Довольно глупо ставить СтарФорс на тетрис, или выпускать виндоуз по шароварной лицензии smile.gif
Dark
Если вы решили защитить вашу информацию то маааленькие советы:
1. Пойдите в ВУЗ на кафедру Защиты Информации.
2. Научитесь ломать программы, ну положим начнем с малого:

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

Для тех кто любит техносказки - первая часть kasper01
вторая часть - его перевод обучалки от Орка "Взлом как искуство"
третья - взлом програм, его собственные исследования
IDA_PRO - его обучалка об IDA - взламывающей системе, и не только его...
Romtek
Вот ещё исходник на 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;

Const
Hash: TMD5Digest = (
9, 143, 107, 205, 70, 33, 211, 115,
202, 222, 78, 131, 38, 39, 180, 246
); // хеш пароля "test"

var
str: string;

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;

var
sum :TMD5Digest;
i: integer;

begin
Randomize;
write ('Enter password: '); readln (str);
TestPsw ();
readln;
end.


Этот код не претендует на реальную защиту программ и выполняет функцию пособия для разработки более серьёзной защиты.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.