Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.29;
Скачать: CL | DM;

Вниз

О декомпиляции, клонировании, Dephi и Java   Найти похожие ветки 

 
P   (2007-06-23 20:02) [40]


>
> IMHO ©   (23.06.07 11:11)
> А как обстоят подобные делаю с Джавой? Что получаем на выходе?
>  JAR-файл, в который можно залезть и изменить его.
>
> Слышал про какие-то обфускаторы... Насколько они действенны?


например просто понять такой код:
jksdjkds754 += rer43438943 -(dfjdfl5 + rrrttr474)/rthewrjwk493;
for(trjrtjk3443 = 10; trjrtjk3443 < 34; trjrtjk3443++){};

Ну и тому подобное. Имеем полное запутывание имен переменных.


 
Anatoly Podgoretsky ©   (2007-06-23 20:47) [41]

> P  (23.06.2007 20:02:40)  [40]

> for(trjrtjk3443 = 10; trjrtjk3443 < 34; trjrtjk3443++){};

Чего сложного

for(i = 10; i < 34; i++){};


 
iZEN ©   (2007-06-23 20:53) [42]


> IMHO ©   (23.06.07 14:02) [34]
>
> Делая EXE-бинарник, я могу быть относительно спокоен в этом,
>  но делая JAR - где гарантия???

Ты наверно начинащий джавист.
Поэтому не слышал ещё об обфускаторах, которые с разной степенью качества "запутывают" бинарный байт-код, подменяют имена переменных, методов, классов, попутно ужимают код.

Один из известных свободный обфускаторов для Java-кода — ProGuard: http://proguard.sourceforge.net/


 
P   (2007-06-23 22:01) [43]


> Anatoly Podgoretsky ©   (23.06.07 20:47) [41]
>
> > P  (23.06.2007 20:02:40)  [40]
>
> > for(trjrtjk3443 = 10; trjrtjk3443 < 34; trjrtjk3443++){};
>
> Чего сложного
>
> for(i = 10; i < 34; i++){};


Только данный код проще написать самому чем разгребать подобное.


 
Panel   (2007-06-24 00:41) [44]

Только данный код проще написать самому чем разгребать подобное.

Средства рефакторинга в руки... и не надо ничего разгребать.


 
Иа   (2007-06-24 06:45) [45]

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


 
iZEN ©   (2007-06-24 07:42) [46]


> Иа   (24.06.07 06:45) [45]

Э...
Не надо переносить понимание проблем .Net на Яву.
Там несколько всё по-другому.


 
Иа   (2007-06-24 10:42) [47]


> iZEN ©   (24.06.07 07:42) [46]
>
> > Иа   (24.06.07 06:45) [45]
>
> Э...
> Не надо переносить понимание проблем .Net на Яву.
> Там несколько всё по-другому.


Во-первых, я не считаю это проблемой. Во-вторых, не могли бы вы озвучить отличие Java VM от .NET CLR в возможностях и механизмах обфускации кода?


 
iZEN ©   (2007-06-24 22:16) [48]


> Иа   (24.06.07 10:42) [47]
>
> Во-первых, я не считаю это проблемой. Во-вторых, не могли
> бы вы озвучить отличие Java VM от .NET CLR в возможностях
> и механизмах обфускации кода?

В Java исполняемой единицей является .class-файл. В .Net исполняемой единицей является сборка. Сборка .Net содержит несколько типов и код исполнения, но из неё не удастся выделить отдельные типы (классы) и сохранить их в отдельных файлах для последующей обработки обфускатором и построения из них новой сборки.

В .class-файле Java:
имена переменных и методов хранятся в том виде, каком их определил программист (подмножество ASCII, допустимы имена членов на национальном языке, коды символов которого имеют отображение в ASCII-набор);
значения строковых типов хранятся в Unicode (UTF-8, UCS-2 и UCS-4 в Java 5.0);
class-файл имеет CRC-последовательность, подтверждающую корректность байткода файла.
Всё это и ещё куча вещей должны учитываться обфускатором. И это гораздо легче, чем работать с бинарной сборкой .Net.

Кроме того, Java VM каждый раз производит верификацию байткода загружаемого .class-файла. А .Net CLR верификацию делает(делает ли?) один раз при первоначальном запуске сборки и генерирует из неё бинарный нативный код, который кэширует GAC для будущего использования CLR.


 
Иа   (2007-06-25 02:21) [49]


> Сборка .Net содержит
> несколько типов и код исполнения, но из неё не удастся выделить
> отдельные типы (классы) и сохранить их в отдельных файлах
> для последующей обработки обфускатором и построения из них
> новой сборки.

Неверно

> В .class-файле Java:

То же самое, за исключением локальных переменных.

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

Не вижу как одно вытекает из другого

>А .Net CLR верификацию делает(делает ли?)

Задавая такой вопрос вы демонстрируете свое незнание в вопросе, который взялись осветить.

>один раз при первоначальном запуске сборки

Неверно.

>и генерирует
> из неё бинарный нативный код, который кэширует GAC для будущего
> использования CLR.

Неверно.


 
iZEN ©   (2007-06-25 03:07) [50]


> Иа   (25.06.07 02:21) [49]

Отвечая на ваш вопрос, основывался на выкладках, почерпнутых из книжки Пол Гиббонз "Платформа .NET для Java-программистов". Допускаю, что с тех пор многое в .Net переменилось -- не изучал вопрос досконально и не претендую на знание последней версии .Net CLR.


 
iZEN ©   (2007-06-25 03:25) [51]


> IMHO ©   (23.06.07 11:11)
>
>  JAR-файл, в который можно залезть и изменить его.

class-файлы можно защитить от реинжиниринга кода обфускацией. Ресурсы (текст, картинки, аудио, видео) невозможно проверить на достоверность кроме как использованием подписанного JAR-файла цифровой подписью со сверкой MD-5 и SHA-1 контрольных сумм файлов архива на этапе запуска приложения.


 
Иа   (2007-06-25 03:49) [52]


> как использованием подписанного JAR-файла цифровой подписью


Что изменится если я уберу цифровую подпись с чужого файла и подпишу его заново моим ключом? Предполагая, что в коде приложения нет специальной проверки на публичный ключ автора?


 
Иа   (2007-06-25 03:54) [53]


> > Иа   (25.06.07 02:21) [49]
>
> Отвечая на ваш вопрос, основывался на выкладках, почерпнутых
> из книжки Пол Гиббонз "Платформа .NET для Java-программистов".
>  Допускаю, что с тех пор многое в .Net переменилось -- не
> изучал вопрос досконально и не претендую на знание последней
> версии .Net CLR.


В нет пунктах которые вы затронули выше принципиальных изменений с 1.0- 2.0 не произошло. Предполагаю, что вы могли запутаться в терминологии или запоминили не то. К примеру, компиляцию в native и кэширование в GAC как вы описывали можно устроить с помощью ngen, при обычной работе такого не происходит.  Читать по CLR можно и нужно Рихтера.


 
Игорь Шевченко ©   (2007-06-25 12:30) [54]

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


 
Anatoly Podgoretsky ©   (2007-06-25 13:08) [55]

> Игорь Шевченко  (25.06.2007 12:30:54)  [54]

Ну можно же заплатить взломщику.


 
db2admin ©   (2007-06-25 14:11) [56]

Anatoly Podgoretsky ©   (25.06.07 13:08) [55]
ради спортивного интереса


 
Anatoly Podgoretsky ©   (2007-06-25 14:39) [57]

Ради того, что бы проявили интерес хотя бы за деньги.


 
iZEN ©   (2007-06-25 21:41) [58]


> Иа   (25.06.07 03:49) [52]
>
>
> > как использованием подписанного JAR-файла цифровой подписью
>
>
> Что изменится если я уберу цифровую подпись с чужого файла
> и подпишу его заново моим ключом? Предполагая, что в коде
> приложения нет специальной проверки на публичный ключ автора?
>

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


 
Petr V.Abramov   (2007-06-26 00:47) [59]

> Ничего, если ваш сертификат будет находится в хранилище сертификатов пользователя в списке доверенных.
а сколько надо заплатить  пользователю, чтоб он послушал такие слова?


 
Иа   (2007-06-26 02:42) [60]


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


Мой или родительский? Если мой, то каким образом происходит добавление моего сертификата легально - во время инсталляции? И как тогда делать xcopy deployment? Что произойдет если ресурс подписан самодельным сертификатом? А если файл с кодом?


 
iZEN ©   (2007-06-26 09:17) [61]

Вообще же, общие принципы описаны здесь:
http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/jar/TOC.html

Более наглядно:
http://www.rudometov.com/security/03_01_26_Java_Crypto/Java_Crypto.html


> Иа   (26.06.07 02:42) [60]
> > Ничего, если ваш сертификат будет находится в хранилище
> > сертификатов пользователя в списке доверенных.
> Мой или родительский?
Ваш.


> Если мой, то каким образом происходит
> добавление моего сертификата легально - во время инсталляции?
Ну да.
Панель управления -> Java -> вкладка Security -> диалог Certificates -> добавляете сертификат производителя подписанного продукта в одну из категорий.


> И как тогда делать xcopy deployment?

Использовать утилиты jarsigner, keytool и средство автоматизации типа Ant или скриптов командного процессора операционной системы.

http://www.javaportal.ru/java/articles/jar.html


> Что произойдет если
> ресурс подписан самодельным сертификатом? А если файл с
> кодом?

Выброс java.security.DigestException или java.security.SignatureException -- в зависимости от ситуации. В общем случае -- потомок java.security.GeneralSecurityException.

Подробнее: http://java.sun.com/javase/reference/api.jsp


 
Иа   (2007-06-26 09:59) [62]


> Вообще же, общие принципы описаны здесь:
> http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/jar/TOC.
> html


"А в версии 1.2 платформы Java подписанные приложения, вызываемые с опцией интерпретатора -jar, будут проверяться средой выполнения. "

? То есть если я не вызову с ключем, то не проверится? 8()


Более наглядно:
http://www.rudometov.com/security/03_01_26_Java_Crypto/Java_Crypto.html


А тут вообще про криптографию в принципе. Мне не надо объяснять как public/private ключи работают и что такое x509 сертификаты. Я, э, это знаю :) Меня интересует как цифровая подпись используется java vm, в сравнении с .NET. Первая ссылка с цитаой выше меня просто потрясла. Это афтар курил чего-то?


> > И как тогда делать xcopy deployment?
>
> Использовать утилиты jarsigner, keytool и средство автоматизации
> типа Ant или скриптов командного процессора операционной
> системы.


Ничего из вышеперечисленного к моему вопросу отношения не имеет.
Собственно, вы уверены что вы не java аплеты только имеете ввиду обобщая их на все java приложения? Потому как аплеты, так же как и .NET thin controls в IE живут своей особой жизнью.


 
Тульский ©   (2007-06-26 10:24) [63]

Можно воспользоваться компилятором Excelsior Jet и получить exe-шник.


 
iZEN ©   (2007-06-26 10:55) [64]


> Иа   (26.06.07 09:59) [62]
>
> "А в версии 1.2 платформы Java подписанные приложения, вызываемые
> с опцией интерпретатора -jar, будут проверяться средой выполнения.
>  "
> ? То есть если я не вызову с ключем, то не проверится? 8()

У вас что-то с логикой?
Опция "-jar" нужна для запуска jar-файла на выполнение ВООБЩЕ.

> Иа   (26.06.07 09:59) [62]
>
>
> Более наглядно:
> http://www.rudometov.com/security/03_01_26_Java_Crypto/Java_Crypto.
> html
>
>
> А тут вообще про криптографию в принципе. Мне не надо объяснять
> как public/private ключи работают и что такое x509 сертификаты.
>  Я, э, это знаю :) Меня интересует как цифровая подпись
> используется java vm, в сравнении с .NET. Первая ссылка
> с цитаой выше меня просто потрясла. Это афтар курил чего-
> то?

Там картинки. Всё ясно.

А причём здесь сравнение с .NET?


> Иа   (26.06.07 09:59) [62]
>
> > > И как тогда делать xcopy deployment?
> >
> > Использовать утилиты jarsigner, keytool и средство автоматизации
> > типа Ant или скриптов командного процессора операционной
> > системы.
>
> Ничего из вышеперечисленного к моему вопросу отношения не
> имеет.

К какому вопросу?


> Иа   (26.06.07 09:59) [62]
> Собственно, вы уверены что вы не java аплеты только имеете
> ввиду обобщая их на все java приложения? Потому как аплеты,
>  так же как и .NET thin controls в IE живут своей особой
> жизнью.

В Java одна и та же система безопасности для апплетов и приложений. Правда, модели безопасности Java v.1.1.x и Java v.2 отличаются.


 
iZEN ©   (2007-06-26 11:02) [65]

http://www.rudometov.com/security/03_01_26_Java_Crypto/Java_Crypto.html
Рисунки:
Рис. 3. Последовательность действий при подписи jar-архива.
и
Рис. 4. Последовательность действий при верификации полученного jar-архива.
Достаточно наглядны.


 
DiamondShark ©   (2007-06-26 12:04) [66]


> буду рад, если вы укажите на узкие места, о которых я не
> знаю.

Элементарно.
После дешифровки дешифрованная информация должна появиться где-нибудь в памяти в открытом виде.


 
Суслик ©   (2007-06-26 12:18) [67]


> После дешифровки дешифрованная информация должна появиться
> где-нибудь в памяти в открытом виде

говорят, что есть такие крипторы с вирт. машинами, где инфа никогда не появляется полностью в памяти.


 
Иа   (2007-06-26 16:37) [68]


> > Иа   (26.06.07 09:59) [62]
> >
> > "А в версии 1.2 платформы Java подписанные приложения,
>  вызываемые
> > с опцией интерпретатора -jar, будут проверяться средой
> выполнения.
> >  "
> > ? То есть если я не вызову с ключем, то не проверится?
>  8()
>
> У вас что-то с логикой?
> Опция "-jar" нужна для запуска jar-файла на выполнение ВООБЩЕ.
>


В той же ссылке рассказывается о JavaRunner классе. На мой взгляд никакой опции -jar там не видно. Будет ли выполнятся проверка при таком варианте запуска?


> Там картинки. Всё ясно.
>
> А причём здесь сравнение с .NET?


Вы говорили выше о то что в Java "немного не так". Вот я и пытаюсь выяснить, что именно. Кстати, вы говорили о .class как минимальной единице. Но подписать .class нельзя. Я правильно понимаю, что ограничить права для кода выполняемого не из .jar нельзя?


> > Иа   (26.06.07 09:59) [62]
> >
> > > > И как тогда делать xcopy deployment?

> К какому вопросу?


Теперь видите? Из ваших слов следовало что если моего сертификата нет в списке, код не запустится. Я пытаюсь выяснить у вас как тогда его распространять.


 
iZEN ©   (2007-06-26 18:05) [69]

Иа   (26.06.07 16:37) [68], такое ощущение, что я зря ссылки выкладывал.

Там же всё написано!


 
Mystic ©   (2007-06-26 19:03) [70]


> Делая EXE-бинарник, я могу быть относительно спокоен в этом,
>  но делая JAR - где гарантия???


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


 
oldman ©   (2007-06-26 19:08) [71]


> IMHO ©   (23.06.07 11:11)  
> вы не сильно беспокоитесь о том, что кто-то декомпилирует вашу программу


Флаг ему в руки! Несколько миллионов строк asm-кода...


 
Anatoly Podgoretsky ©   (2007-06-26 19:11) [72]

> oldman  (26.06.2007 19:08:11)  [71]

Из которых менее процента своего кода.


 
Иа   (2007-06-27 02:24) [73]


> Иа   (26.06.07 16:37) [68], такое ощущение, что я зря ссылки
> выкладывал.
>
> Там же всё написано!


Пока все что я понял о "security" в Java это

1) При запуске jar файла через networkloader и иже с ними никакой проверки не происходит
2) Никакой проверки на наличие сертификата в разрешенных не происходит если это не апплет. То есть по умолчанию.
3) Что бы распространить полиси с апплетов на запускаемое приложение надо сделать это ручками java -Djava.security.manager MyLoader
4) До 1.2 все было ГОРАЗДО хуже.

Вывод: правила безопасности на основе цифровой подписи в java по прочности в подметки не годятся .NET security policy.
Собственно, это меня и интересовало. Спасибо.


 
ferr ©   (2007-06-27 05:15) [74]

Возможность декомпиляция это очень большая проблема для таких программ.
В частности для .net есть утилита Lutz Roeder"s .NET Reflector которая для любой сборки генерирует очень даже неплохой код на любом из языков (c#, vb, delphi, c++). Для исследования стандартных классов это полезно, но ...

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


 
iZEN ©   (2007-06-27 13:50) [75]


> Иа   (27.06.07 02:24) [73]
> Пока все что я понял о "security" в Java это
>
> 1) При запуске jar файла через networkloader и иже с ними
> никакой проверки не происходит

Тем не менее, все class-файлы (кроме системных классов из пакетов java*), которые участвуют в загрузке, проходят верификацию. Процесс выполнения их кода контролируется диспетчером безопасности (java.lang.SecurityManager, java.security.AccessController) и регулируется текущей политикой безопасности (java.security.Policy). Всё очень гибко устроено так, что система управления доступом обеспечивает механизмы, которые используют права доступа и политики безопасности, чтобы разрешить или запретить доступ к определённым ресурсам от файлов на локальном диске до сетевых соединений (включая домены) и защищённых объектов среды выполнения.

> Иа   (27.06.07 02:24) [73]
> 2) Никакой проверки на наличие сертификата в разрешенных
> не происходит если это не апплет. То есть по умолчанию.
> 3) Что бы распространить полиси с апплетов на запускаемое
> приложение надо сделать это ручками java -Djava.security.
> manager MyLoader

Пока не определена новая политика безопасности в системе Java, используется базовая политика безопасности. В каталоге [JAVA_HOME]/lib/security/ находится файл java.security, в котором по мимо прочего есть две записи, указывающие, где находится файл политики безопасности. Пример:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
Приведу так же содержимое стандартного файла политики [JAVA_HOME]/lib/security/java.policy:
// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};

// default permissions granted to all domains

grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See "http://java.sun.com/notes" for more information.
permission java.lang.RuntimePermission "stopThread";

// allows anyone to listen on un-privileged ports
permission java.net.SocketPermission "localhost:1024-", "listen";

// "standard" properies that can be read by anyone

permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";

permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";

permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};

Вообще же, общий формат файла политики таков:
[keystore "URL_хранилища_ключей", "тип_хранилища";]
grant [SignedBy "список_подписавших"] [, CodeBase "URL_базы_кода"]
{
permission имя_класса_права_доступа ["имя_объекта"] [, "действие"] [, SignedBy "список_подписавших"];
....
}
(в именах допустимы шаблоны: ${user.home}, ${file.separator} и т.д.).
При задании новой политики для приложения можно определить: класс Провайдера политики безопасности, класс собственного Диспетчера безопасности, файл Политики безопасности или же оставить что-то из них по умолчанию. Всё это похоже на управление расширенным доступом на основе ACL в операционных системах UNIX.

> Иа   (27.06.07 02:24) [73]
> 4) До 1.2 все было ГОРАЗДО хуже.

Не надо абсолютизировать.
До v.1.2 нельзя было задать свою политику безопасности и права доступа для выполнения приложения в JVM. В Java 1.0.x всё походило на политику безопасности Microsoft для ActiveX (которые можно было либо вырубить, либо разрешить им всё) и EXE-приложения.  В Java 1.1: апплеты выполнялись в песочнице с максимальными ограничениями; подписанные апплеты имели определённые права и доступ к файловой системе (как приложения пользователя); приложения же были ничем не ограничены. Всё это было не очень гибко. Сейчас же (начиная с версии Java 1.2) всё гораздо гибче -- появилась возможность создания конфигурируемых прав доступа.

> Иа   (27.06.07 02:24) [73]
> Вывод: правила безопасности на основе цифровой подписи в
> java по прочности в подметки не годятся .NET security policy.

Если не хотите разбираться, что ж, думайте так и дальше. :))

> Иа   (27.06.07 02:24) [73]
> Собственно, это меня и интересовало. Спасибо.

Пожалуйста.

P.S.
Сертификаты служат для идентификации производителя продукта и определения принадлежности продукта конкретному производителю. Дайджест (MD-5, SHA-1) удостоверяет целостность продукта. Напоминаю, что в данной теме разговор ведётся именно о защите контента от дизассемблирования и обеспечения его целостности -- о защите от модификации.



Страницы: 1 2 вся ветка

Текущий архив: 2007.07.29;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.023 c
15-1183575856
Prohodil Mimo
2007-07-04 23:04
2007.07.29
Google panel, как отключить голячие клавишы?


15-1183146313
IMHO
2007-06-29 23:45
2007.07.29
Посоветуйте сайт для любителей кино


15-1183553562
Alkid
2007-07-04 16:52
2007.07.29
Ваять или вникать?


2-1183723063
Aragorn
2007-07-06 15:57
2007.07.29
TStrings.Items.Objects


3-1177316209
Juice
2007-04-23 12:16
2007.07.29
DBX &amp; Oracle ошибка при коннекте