ソースコードレベルでの難読化は難読化ツールよりも効果的ですか?

StackOverflow https://stackoverflow.com/questions/413415

  •  03-07-2019
  •  | 
  •  

質問

最後の質問、ほとんどから学ぶメンバー名はプロジェクト出力に含まれるようです。

9rays Salamander ジャングル、多くの難読化技術はすでに無効にされているようです。この恐ろしい主張があります:

  

難読化ツールによって挿入された文字列暗号化を自動的に削除します〜 Salamander

それで、手動のソースコードレベルの難読化は、ポストコンパイル/ミッドコンパイルの泡立ち、よく知られた(簡単に破られた??)プログラムによる「表面的な」難読化よりも効果的ですか?

>
役に立ちましたか?

解決

ソースコードの難読化は、メンテナンスの点で自己破産になります。

プロジェクトが非常に「秘密」である場合、2つの選択肢があると思います:

  • 「秘密」の所有権コードを、制御するサーバー上のサービスの背後に配置します

  • C / C ++などの逆コンパイルが容易ではない言語でコーディングする

他のヒント

たぶん議論の余地がありますが、そうすることで保守性が損なわれます。

これは本当に価値がありますか?

実際には、これは不明瞭さによるセキュリティに帰着します。つまり、セキュリティではなく、単に不便です。十分に興味のある人はコードにアクセスできれば コードを逆コンパイルすると想定して作業する必要があります。邪悪なhaxxorsに少しだけ時間がかかるようにすることは、自分自身に与える痛みの価値はありません。アクセスの実際のセキュリティ問題に対処します。

難読化とは、難易度を上げることです。アセンブリを難読化すると、好奇心が強いだけでなく、やる気のあるリバースエンジニアリングの人を止めることはありません。

さらにレベルを上げたい場合、多くの難読化ツールを使用して、印刷できない文字をメンバー名として使用できます。リフレクターを使用して見てください。これにより、より多くの人を止めることができます。難読化されたコードを見て理解することもできますが、読み込めない場合は、ILにダンプしてすべてのメンバーの名前を手動で変更するという苦痛を経験することはありません。そんなに時間を無駄にする動機はありません。

ただし、モチベーションがある人もいるので、ビジネス要件がそれを喚起する場合は、次のステップに進む必要があります。しかし、コンピューターがそれを読むことができれば、あなたが何をしても、それを読むことができる誰かがそこにいます。目標は、それを読むことができる、または読む意欲がある人の数を減らすことです。

リフレクターをブレークするために使用できるトリックもあります(PreEmptiveのObfuscatorはリフレクターをブレークする場合もありますが、もちろんILを読むことができます)。難読化ツールの開発者と一度興味深い会話をしましたが、正義を行うことはできませんが、コードを動的にジャンプさせることでリフレクターを完全に破壊する方法がありました。たとえば、関数aのある時点で、関数bの中央にジャンプします。これを実行すると、PEVerifyでエラーが発生するため、実際に実装されることはありませんが、ちょっとしたアイデアがあります。

アンナカタは正しいです。本当にできるのは、その人がソフトウェアをリバースエンジニアリングするのをより困難にする(そしてコストがかかる)ことだけです。

私の会社は、リバースエンジニアリングを可能な限り困難にしたいいくつかの領域を特定しました。たとえば、ファイルはバイナリ形式であり、階層内の各オブジェクトが自身を保存し、正しいバージョンを読み返します。これは、ファイルを読み取る人が、ファイルを読み取るために作成するコードで階層全体を複製することを意味します。さらに、ジョブファイル内の情報の多くは、ショップ標準ファイル内の対応するビットがなくても役立ちます。そのため、ジョブファイルが何を言っているのかを理解するために、彼らは作業を2回行う必要があります。

いくつかの重要な領域(ドングル保護、金属切断機との通信)はWin32DLLにあります。つまり、ソフトウェアをリバースエンジニアリングするには、アセンブリと他のDLLシグネチャを複製するDLLの作成方法を知る必要があります。さらに、CAMソフトウェアを使用した設計では、切断機と非常にインタラクティブです(常に情報が交換されます)

競合他社が私たちのマシンだけで対処しようとしていることを数回耳にしましたが、仕事を終えるために電子機器を自分のものに置き換えました。これを行うための大金。

私たちが行ったステップの一部は、競合他社のマシンとソフトウェアに対処しようとする私たち自身の経験に基づいていました。その経験を生かし、セットアップを調整する方法を学びました。もちろん、リバースエンジニアリングに打ち勝つためだけに信頼性やメンテナンスを犠牲にすることはできないという制限があります。

あなたの場合、あなたはあなたのソフトウェアのどの部分があなたの競合他社に興味があるかを自問し、そこから先に進む必要があります。垂直市場の開発者(機械制御、専門会計など)の場合、ソフトウェア制御にUSBドングルを使用することをお勧めします。

それ以外の場合は、シリアル番号システムを使用し、人々があなたのソフトウェアを海賊版にし、それをあなたのビジネスモデルに組み込むことを受け入れます。シリアル番号スキームの目的は、比較的邪魔にならず、因果的なコピーを妨げるだけでなく、コピーがどこから来たのかを追跡する機会をリモートで提供することです。

問題は、読みやすさを犠牲にすることです。あなたのプロジェクトが保護する神聖なものであるならば、私は2つのことを仮定するのが安全だと思います:

  1. プロジェクトは十分に大きいため、読みやすさの低下が戻ってきて、お尻に噛み付いてしまいます。
  2. それをリバースエンジニアリングしたい人はとにかくそうするでしょう。 (メンバー名を読むだけではなく)物事が何であるかを判断するには、わずかに大きな知性の偉業が必要です。

コードレベルの難読化を検討していることも心配です。あなたも自分でコードを難読化しませんか?どうやって再びそれに取り組むつもりですか?保守性のために、これを行うべきではありません。

しかし、これを考慮してください:-

プロジェクトを開いて、プロジェクト内のすべての文字列/変数名を巧妙に難読化するスクリプト/アプリが実行可能であり、後で元のコードが別の場所で安全に変更されていない状態でコンパイルしたとします。

今、それはいくつかのアイデアです。

実際には、コードレベルの難読化は、そこにある難読化ツールができることよりも安全性が低いです。これは主に、難読化ツールが、言語コンパイラで許可されていない厳密なCLI実装の詳細を利用できるためです。例えば、プライベートフィールドがすべて同じ名前を持つことは完全に合法です-しかし、それを可能にするコンパイラはそこにありません。

次のようなテクニックを使用できます。 http://g.palem.in/SecureAssembly.html これを使用して.netに書き込みますが、.NET実行可能ファイルをC ++実行可能ファイルに埋め込みます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top