0

Proguard を使用して GWT (Vaadin) アプリケーションを難読化しようとしています。これまで 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 ファイルを指定する必要がありますか? アプリケーションで使用しているすべての 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'.
4

1 に答える 1

2

GWT は 2 つの部分でコードを生成します。

  1. クライアント側のコード。これはブラウザで実行されるもので、ユーザー インターフェイスとサーバーへの非同期呼び出しで構成されます。Java ソースを作成すると、ソースから直接 Javascript に変換されます。つまり、GWT コンパイラはクラス ファイルを調べません。生成された JS を難読化するには、GWT コンパイラ フラグを使用します (以下を参照)。
  2. サーバー側のコード。サーバー コードは、クライアント アプリが呼び出すエンド ポイントになります。たとえば、GWT RPC 呼び出しを呼び出し、GWT サーブレットをエンドポイントとして持つことができます。他のアプリと同じように Web アプリを難読化します。Proguard などを使用して試行錯誤します。軽く難読化する単純な構成から始めて、そこから先に進みます。

GWT クライアント側は Java ソース コードから生成されるため、GWT にフィードする前に難読化する簡単な方法はありません。どうにかして Proguard を介して難読化し、それを逆コンパイルして GWT コンパイラにフィードできると思います。やり過ぎのようですが、可能かもしれません。

難読化する通常の方法は-style OBF、GWT コンパイラーに指定することです。これにより、コードが完全に難読化されます。さらに進んで別の JS 難読化ツールを使用することもできますが、収益逓減の法則やバグなどが適用されます。

OBF をスタイルとして指定すると何が生成されるかを理解することをお勧めします。おそらく、あなたの目的には十分です。明らかに、サーバー側に配置するもの (セキュリティ、Cookie 検証など) が多ければ多いほど、クライアントにあるコードは重要ではなくなります。

于 2011-02-01T14:05:15.977 に答える