10

既存のオペコードを「スクランブル」し、新しい (役に立たない) コードを追加する Java バイトコード難読化ツールを探しています。私は、ほとんどの難読化者が行っているように見える、いかなる種類の名前変更にも興味がありません。

ちょっとした背景: 博士論文の一環として、(Java Bytecode) プログラムの役に立たない部分を識別するツールを開発しています。良い結果を表示するために、大量の役に立たないコードを含む入力プログラムを用意したいと考えています。私が現在注目している例 (コードを役に立たなくする微妙なバグがあります。間違った引数で「equals」を呼び出すことを考えてください) に加えて、コード難読化ツールによって生成された「奇妙な」コードだけの例も必要になる可能性があります。

私はすでに で遊んでいましたがProGuard、コードをわずかに最適化 (したがって変更) しているようです。メソッド、フィールドなどの名前を変更する部分は、私にはまったく関係がないため、オフにしました。

4

5 に答える 5

3

あなたが望むのは、実際には難読化ではありません。

必要なのは、メソッドの追加/変更を含め、必要なバイトコードを追加できるASMのようなツールです。

于 2013-10-23T01:26:07.283 に答える
2

あなたのタスクは非常に興味深いものですが、Java バイト コードの難読化ツールが設計されているわけではないようです。

役に立たないコードをプロジェクトに追加したい場合は、別のプロジェクト (またはその一部) を追加するだけではどうですか。明らかに、追加されたコードは「便利」です。元のプロジェクトから実際に呼び出す人はいません。まったく別のプロジェクトからソースまたはバイト コードの一部を追加できます。明らかに、このコードは異なるクラスで記述されます。

コードを既存のクラスに追加したい場合は、たとえば CGLIB を使用して独自のツールを開発し、既存のバイト コードを取得してクラスのバイト コードに追加することができます。既存のクラスの一貫性を損なわない静的メソッドを追加するとします。

于 2013-10-03T18:35:30.997 に答える
1

If you do obfuscate, stay away from obfuscators that modify the code by changing code flow and/or adding exception blocks and such to make it hard to disassemble it. To make the code unreadable it is usually enough to just change all names of methods, fields and classes.

于 2013-10-23T09:04:37.513 に答える
0

あなたが探しているもののように私には思えます(そして、各レスポンダーは異なるテイクを持っているように見えるので、「私にとって」を強調します)結果のコードを作成する既存の有用なコード内でコードを生成する能力を与えるものです役に立たない、または最適ではないコードが混在しています。

最初は、このツールの目的はリバース エンジニアリングを防ぐことだと思っていました。ここでのキーワードは「難読化」、つまり、コードを不明瞭または判読不能にすることだからです。しかし、あなたは「役に立たない」コードが欲しいと言います。コードが不明瞭である必要はありません。何もしなくていいだけです。

では、問題は、役に立たないコードをどのように作成するかということです。

わかりませんが、ここにアイデアがあります。役に立たない要素を含むコードから始めて、それを最適化することができます。実際、あなたのツールはコード オプティマイザーのように思えます。よく書かれていないコードを取り上げて (同僚に学生のコード提出を依頼しますか?)、それをコード オプティマイザから得られるものと比較することができます。これにより、単に未使用のメソッドやクラス以上のものを取得できます。今、私は質問があります (敬意を表して): あなたのプロジェクトはコードオプティマイザとどのように違うのですか?

于 2013-10-26T15:12:23.083 に答える
0

@dkatzel の回答に同意することを伝えなければなりません。本当に必要なのは難読化ではないようです。私の理解では、難読化とは、コードを理解しにくくすることです(セキュリティなどのさまざまな目的を達成するため、コピーを防止するためなど - 言及されているウィキペディアの記事は実際にそれを非常によく説明しています)。

したがって、ソースコードが正しく作成されていることを考えると(つまり、冗長な部分や役に立たないコードがないことを意味します)、(常識的に)難読化すると、実行パスを変更せずにコードがわかりにくくなります。これは、コードの難読化は通常、コードのパフォーマンスにまったく (またはほとんど) 影響を与えないことを意味します。これは、テスト用に生成したいものとは異なります。たとえば、この非常にクールな記事 ( http://www.kahusecurity.com/2011/brilliant-javascript-obfuscation-technique/ ) で提案されている種類の難読化は、まったく役に立ちませんよね? (つまり、Java ではなく Javascript に関するものであることは無視します)

したがって、すでに提供されている回答 (特に、Github での検索と ASM の使用に関する回答) が進むべき道だと思います。C コードの有名な難読化コード チャンピオンシップ ( http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest ) があり、人々は創造性を発揮しようとしますが、おそらくそのソースには役に立たないコードが含まれています (それが主な意図ではありませんが)。テストで使用できます(Javaコードで同様のチャンピオンシップを見つけた場合-正直なところ、それをチェックしていませんでした)。

あなたの立場で言えば、.Java ファイルのランダムな有効な場所に無用なスニペットを直接挿入する、非常に単純なソース コード操作ツールを作成することも検討します。次のようなものを使用して、これらのスニペットを自分で定義できます。

  • { System.out.println("Hello world!"); }
  • {文字列; for(int i = 32; i < 127; i++) s += (文字) i; s = s.toUpperCase(); }
  • { new Thread( new Runnable() { public void run() { System.out.println("Hello world again!"); } } ).start(); }

私たちは科学研究 (博士課程のプロジェクト) について話しているので、最初のプロトタイプの結果を簡単に再現することが重要であることに同意します。したがって、単純なテスト コードに役に立たないことがわかっているスニペットを追加するツールを用意することで、事前検証を行うことができます。ただし、将来的には、よく知られているソース コード (重要なオープン ソース プロジェクトなど) を処理し、removal-useless-code-tool に渡し、削除されたコードを提示し、最後にそのコードについて論理的に議論することも必要になるでしょう。削除されたビットは役に立たないだけでなく、変更されたバージョンのコードの出力を以前のものと比較して検証します(削除されたものなし)。

研究頑張ってね、相棒。:)

乾杯

于 2013-10-26T15:23:31.363 に答える