0

私はデスクトップJavaアプリケーションを書いています。プログラムは、顧客のサーバーからXMLファイルを受け取ります。いくつかのタグのデータは整数型であり、いくつかの数式で「暗号化」されています。プログラムがXMLファイルを解析するとき、それらのタグを復号化する必要があります。復号化の式は次のようになります。復号化
int decrypted = (int) Math.ceil(Math.pow ((idProduct + 1) / 3, 1.5));
されたデータは、AES-128で暗号化されたH2データベースに保存されます。

私が必要としているのは、どういうわけかそのような式を逆コンパイルから隠すことです。

私の試み:
1。数式を非表示にするために、難読化ツールを使用しようとしましたが、数式でsmthを実行するものは見つかりませんでした。ProGuard 4.8によって難読化され、JADによって逆コンパイルされたコードは次のとおりです。

private String d(String paramString) {
   long l = Long.valueOf(paramString).longValue();
   int i = (int)Math.ceil(Math.pow((l + 1L) / 3L, 1.5D));
   String str = String.valueOf(i);

   return str;
}

ご覧のとおり、ProGuardは数式で何もしませんでした。ZelixKlassMasterのような市販の難読化ツールを使用する余裕はありません。
2. JET Excelsiorを試してみようと思っていました(ただし、Java 7アプリはまだサポートされていないようです)。また、上司に感謝されるとは思いません。
3. launch4jのようなラッパーを使用することも考えましたが、そこから.jarを抽出するのが難しいかどうかはわかりません。
4.次に、Cで外部ライブラリを記述してJNIを使​​用することを考えました。しかし、競合他社はそのライブラリを使用するだけでよいようです。
5. IMOの優れた解決策は、ASMで復号化関数を記述し、これをJavaコードに直接貼り付けることです。これはCです。残念ながら、これは不可能です。
6.クラスの暗号化は使用しても意味がありません
すべてを逆コンパイル/逆アセンブルできることを理解しています。JADを実行して一度に取得するよりも少し難しくしたいと思います。

教えてください

4

2 に答える 2

2

asm / c / c ++で式を記述し、JNIを介してそれにアクセスすることを考えている場合、これは別の命令セットで式を表すことを意味します。ハードウェア命令セットを使用する代わりに、独自の命令セットを発明し、そのインタープリターをコードに埋め込むことができます。これにはパフォーマンスが低下するという欠点がありますが、一般的でない命令セットを使用するという利点があるため、競合他社はまずインタプリタのバイトコードから自家製の命令セットを再構築する必要があります。x86よりもさらに理解しにくいように命令セットを設計できます。

次に、このアイデアを再帰的に適用できます。別の解釈された命令セットなどにインタプリタを記述します。

于 2013-01-17T10:10:24.607 に答える
0

数式を見つけようと決心した人から数式を隠すことはできません。

.class ファイルは逆コンパイルでき、アルゴリズムは比較的簡単に抽出できるため、Java コードを難読化しても何も起こりません。

あなたができる最善の方法は、式を C/C++ で実装し、JNI 経由でリンクすることです。しかし、そのアプローチでも、誰かが C++ を逆コンパイルし、少しの労力でプロセスをリバース エンジニアリングすることができます。

アプリケーションにそうする機会を提供する構造がある場合、処理中にすべて呼び出す必要があるいくつかの無関係なメソッドに分散させることで、それを隠すことができます。

于 2013-01-17T08:48:15.117 に答える