Обфускация веб-приложения GWT с помощью ProGuard

Я пытаюсь запутать свое приложение GWT (Vaadin) с помощью Proguard. Я никогда раньше не запутывал код Java, и это моя первая попытка использовать Proguard.

У меня есть мой файл конфигурации, установленный следующим образом:

-libraryjars JAVA_HOME\rt.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\appfoundation.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\blackboard-2.1.1.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\cssinject-0.9.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\eclipselink.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\eclipselink-jpa-modelgen_2.0.2.v20100323-r6872.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\gwt-visualization.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\iText-5.0.4.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\javax.persistence_1.0.0.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\javax.persistence_2.0.0.v201002051058.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\vaadin-6.4.4.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\vaadin-calendar-0.5.1.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\vaadin-chameleon-theme-1.0.1.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\VisualizationsForVaadin.jar
-libraryjars "C:\Program Files\eclipse\configuration\com.vaadin.integration.eclipse\download\gwt-dev\2.0.3\gwt-dev.jar"
-libraryjars "C:\Program Files\eclipse\configuration\com.vaadin.integration.eclipse\download\gwt-user\2.0.3\gwt-user.jar"
-injars   test.war
-outjar   test_after.war
-printseeds
-ignorewarnings
-keep public class TestApplication extends com.vaadin.Application {
public void init();
} 

Затем я выполняю команду proguard:

java -jar proguard.jar @test.pro

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

Ниже приведен фрагмент последних 20 ~ строк вывода командной строки.

заранее спасибо

S.

      Maybe this is library method 'sun.jdbc.odbc.JdbcOdbcStatement { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.CommonDataSource { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.ConnectionPoolDataSource {java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.DataSource { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.PooledConnection { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.rmi.transport.StreamRemoteCall { sun.rmi.transport.Connection getConnection(); }'
Note: org.eclipse.persistence.sdo.helper.DynamicClassWriter accesses a declared method 'writeReplace()' dynamically
      Maybe this is program method 'org.eclipse.persistence.sdo.SDODataObject {java.lang.Object writeReplace(); }'
      Maybe this is program method 'org.eclipse.persistence.sdo.helper.ListWrapper { java.lang.Object writeReplace(); }'
      Maybe this is library method 'com.sun.corba.se.impl.presentation.rmi.InvocationHandlerFactoryImpl$CustomCompositeInvocationHandlerImpl { 
Note: there were 4 unresolved dynamic references to classes or interfaces.
      You should check if you need to specify additional program jars.
Note: there were 10 accesses to class members by means of introspection.
      You should consider explicitly keeping the mentioned class members
      (using '-keep' or '-keepclassmembers').
Warning: there were 3649 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars').

Warning: there were 173 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile them and try again.
         Alternatively, you may have to specify the option
         '-dontskipnonpubliclibraryclassmembers'.

person Santiago    schedule 01.02.2011    source источник
comment
Часть вашего приложения, которая отправляется в браузер, больше не является java, это старый добрый javascript (это основная идея GWT). В зависимости от ваших настроек GWT он уже сильно запутан (хотя основная цель GWT при этом — минимизация). Если вы не беспокоитесь о том, что кто-то, имеющий доступ к вашему серверу, читает файлы классов, нет смысла запутывать java-часть.   -  person tdammers    schedule 01.02.2011
comment
Я не буду размещать код на своем сервере, он будет передан клиенту. Я бы предпочел запутать код. Выходной файл не включает мой код. В нем есть все библиотечные банки, но моего фактического кода нет в выходном файле. Он создал файл jar для моего кода, но там есть только файл css - нет кода java :(   -  person Santiago    schedule 01.02.2011
comment
Любые идеи относительно того, почему мой код Java не включается в выходной файл proguard?   -  person Santiago    schedule 01.02.2011


Ответы (1)


GWT генерирует код, состоящий из двух частей.

  1. Код на стороне клиента. Это то, что работает в вашем браузере и состоит из пользовательского интерфейса и любых асинхронных вызовов на сервер. Пока вы пишете исходный код Java, он преобразуется из исходного кода прямо в Javascript. то есть компилятор GWT даже не просматривает файлы классов. Чтобы запутать сгенерированный JS, используйте флаги компилятора GWT (см. ниже)
  2. Код на стороне сервера. Код сервера будет конечными точками, которые вызывает ваше клиентское приложение. например вы можете вызывать вызовы GWT RPC и использовать сервлеты GWT в качестве конечной точки. Обфускируйте свое веб-приложение, как и любое другое — методом проб и ошибок с помощью Proguard или аналогичного. Начните с простой конфигурации, которая слегка запутывает, а затем продолжайте.

Поскольку клиентская часть GWT генерируется из исходного кода Java, нет простого способа запутать его перед передачей в GWT. Я полагаю, вы могли бы как-то запутать через Proguard, а затем декомпилировать это и передать компилятору GWT. Это кажется излишеством, но это может быть возможно.

Обычный способ запутать — указать -style OBF компилятору GWT. Это полностью запутает ваш код. Вероятно, вы могли бы пойти дальше и запустить его через другой обфускатор JS, хотя действует закон убывающей отдачи, ошибок и т. д.

Я предлагаю вам понять, что генерируется, когда вы указываете OBF в качестве стиля. Этого, вероятно, вполне достаточно для ваших целей. Очевидно, что чем больше вещей вы размещаете на стороне сервера (например, безопасность, проверка файлов cookie и т. д.), тем менее важно, какой код находится в клиенте.

person locka    schedule 01.02.2011
comment
спасибо locka, я компилирую свой проект через eclipse. Можете ли вы дать какие-либо указания относительно того, как я могу указать -style OBF для компилятора GWT? Спасибо - person Santiago; 01.02.2011
comment
Я использую GWT с maven, поэтому я точно не знаю, что делает GWT, интегрированный с Eclipse. В этом документе предлагается изменить настройку с помощью кнопки компиляции GWT — code.google.com/ eclipse/docs/gwt_compile.html. Измените настройку, а затем проверьте полученный вывод .htm, чтобы убедиться, что он не запутан. - person locka; 01.02.2011