web-dev-qa-db-ja.com

リバースエンジニアリングから.NETコードを保護しますか?

難読化は1つの方法ですが、アプリケーションの違法コピー防止セキュリティを破ることから保護することはできません。アプリケーションが改ざんされていないことをどのように確認しますか。また、登録メカニズムをリバースエンジニアリングできないようにするにはどうすればよいですか。

また、C#アプリケーションをネイティブコードに変換することも可能で、 Xenocode はコストがかかりすぎます。

C#は多くの機能を提供しており、私のコードにとって理想的な言語です。そのため、C++でコードベース全体をもう一度書くのは問題外です。

安全な証明書は.NETの署名されたアセンブリから簡単に削除できます。

475
Priyank Bolia

できません。

それを少しより困難にするためにあなたがとれることができるステップがあります、しかし結局ローカルマシンのどんな実行可能ファイルもクラック可能です。結局、そのコードはネイティブのマシンコードに変換されなければならず、実行可能なすべてのアプリケーションは脆弱です。

あなたがやりたいことはそれを人々の悩みに値しないようにするためにクラックするのを十分に困難にすることです。

あなたのアプリケーションを保護するために私があなたに持っているいくつかの提案:

  • コードを難読化しますDotfuscator には無料版があり、Visual Studioに付属しています。
  • 製品ライセンスを生成するには、 公開/秘密鍵 または非対称暗号化を使用します。これにより、あなたのみがあなたのライセンスコードを生成できるようになります。たとえあなたのアプリケーションクラックされていても、あなたはそれらがあなたのアプリケーションのためのキージェネレータをリリースしないことを確信できます。
  • .NET実行可能ファイルを暗号化されたWin32ラッパーアプリケーションにパックするには、サードパーティ製パッカーを使用します。 Themida は優れたものの1つです。これは、他の人があなたのアプリケーションを 。NET Reflector に反映するのを防ぎ、元に戻すために解凍するのが面倒になります。
  • あなた自身のカスタムパッカーを書いてください。他社製パッカーが高すぎる場合は、独自のものを書くことを検討してください。カスタムパッカーが非常に効果的になることがあります。それらをどのように解凍するかについてはよく公開された方法がないからです。チュートリアルあなた自身のパッカーを書く方法はあなた自身のWin32パッカーを書く上でたくさんの良い情報を与えます。

しかし、最終的には、人々があなたのアプリケーションにひびを入れたいのなら彼らはそうするでしょう。そこに彼らのアプリケーションを保護するための膨大な量のリソースを持っているすべての市販のソフトウェアを見てください、それでもアプリケーションが一般に公開される前にさえ彼らはクラックされています。

熟練したリバースエンジニアは IDA-Pro を起動して、何をしてもバターのようにアプリケーションをスライスできます。圧縮されたアプリケーションは解凍することができ、難読化によってそれが公園内を散歩するのを妨げるだけです。複雑なライセンスコードに関するあなたのすべての努力は、シングルバイトパッチで元に戻すことができます。

あなたは、人々があなたのソフトウェアを違法コピーする可能性が非常に高いということを受け入れる必要があります。何に関係なく決してあなたのアプリケーションの代金を払おうとしていない人たちがいます、そしてこれらはあなたが心配する必要がない人たちです。

しかし、訴訟の危険性がなく、ソフトウェアライセンスを喜んで購入することがない多くの企業や、それを危険にさらしたくない、間違っている、または著作権侵害するほど技術に精通していないコンピュータユーザーが多数います。これらはあなたの本当の顧客です、そしてあなたは彼らに良いユーザーエクスペリエンスを提供することにあなたの努力を集中し、あなたのソフトウェアをクラックしている人々を無視するべきです。

私は以前に自分のアプリケーションを海賊版にしたことがあり、私は個人的な苦悩としてそれを取りました。ここに私は、私の心と魂をアプリケーションに注ぎ込んでいた小さな時間の開発者でした、そして、これらの人々は私から海賊版にする胆汁を持っていましたか。彼らは私のポケットから直接お金を取っていました!

私はすぐに多くの厳格なDRMコードを追加し、違法コピーやひびの入ったコピーを使っている人をサボタージュしようとしました。私はもちろん、避けられないものを止めようとするのではなく、自分のアプリケーションをより良くするために取り組んできたはずです。それだけでなく、私は本当の顧客が私が入れていたこれらすべての追加の保護を傷つけていました。

長い戦いの後、私は潮の戦いをしていたことに気づきました。そして今度は無駄になっていたのです。私は必要最低限​​のライセンス機能を除いて、すべての自宅電話コードを取り出して、決して振り返らなかった。

649
mmcdole

(管理されているかどうかにかかわらず)アプリケーションを完全に保護することはできません。 PlayStationやiPadなどのシステムにクラックが発生する可能性がある場合(ベンダーがハードウェアを制御する場合もあります)、アプリにはどのような希望がありますか?ありがたいことに、あなたは本当にしたくない。私の意見では、誰かがあなたの製品を偶然海賊行為できないように、あなたのアプリケーションを安全に保護する必要がありますそしてそれ以上。

たとえば、マシンごとのライセンスを使用している場合、新しい2台目のマシンにインストールするだけでは機能しません。余分なサポートコールを防ぐために適切なエラーメッセージが必要になりますが、余分な時間を費やして回避するのが難しくなりすぎず、ユーザーに頭を打たないでください。

別の例は、期間限定トライアルです。ユーザーが単にシステムクロックをロールバックできる場合など、単純なことについても心配しないでください。そうする人は、ライセンスに違反していることを知っており、ユーザーがknowsに違反している限り、あなたは十分にやっています。

ユーザーはライセンスを気にしないため、これを多く行う必要があります。ライセンスは、nobodyが必要になるまで気にする構成要素です。誰もそれらを読まないので、実際に読む必要はないはずです。したがって、境界がどこにあるかをユーザーに伝える最善の方法は、アプリケーションのすぐに使用できる動作がライセンスに準拠しているかどうかです。この最初のケースでは、インストールに失敗するか、2回目の試用版モードでインストールすることを意味します。後者の場合、構成ファイル内のプレーンテキストの日付をチェックすることを意味する場合があります。いずれにせよ、あなたはそれをエレガントで、有用で、敬意を持って取り扱ってください。

それで、それが意味することはそれだけです。しかし、さらに進んでみませんか? 見つけられる小さな穴をすべて塞がないのはなぜですか?答えは2つの部分に分かれています。まず、誰かがconsciouslyの倫理的基準を超えた場合、簡単な方法でもライセンス条項を破ると、アプリケーションを torrent site —信頼できないソースからダウンロードされたアプリケーションの実行には、ある程度の危険が伴います。これを難しくすることは、これらのユーザーにとってはささいな迷惑であり、有料顧客に問題を引き起こすリスクです。シンプルに保つことで、誰かがアプリケーションを掘り下げて、より包括的なクラックをリリースするのを防ぐことができます。第二に、欠陥を探す目がほとんどありません。ハッカーには多くの人がいて、それらを見つけるためのより多くの練習があります。 1つの小さな欠陥を見逃すだけで、アプリは海賊版サイトで何もしなかったのと同じように配布されます。あなたは毎回正しくなければなりません。彼らは一度だけ幸運である必要があります。そのため、必要な労力は非常に高く、成功の尺度の可能性は非常に低くなります。

最終的に、誰かがあなたのアプリケーションを(単に使用するのではなく)pirateにしたい場合、それが彼らの主な目標です。それらを止めるためにできることは何もありません。これはソフトウェアの性質です。製品を構成するファイルがユーザーのコンピューター上にあると、willは希望どおりにそれらを処理できるようになります。これは、Javaや 。NET のような管理された環境に特に関連していますが、ネイティブコードにも確実に適用されます。時間は彼らの側にあり、十分な時間を与えると、デジタルセキュリティが破られる可能性があります。

ユーザーが製品を著作権侵害することを止めることはできないため、アクションの最善の方法は、このクラスのユーザーがユーザーに利益をもたらすように関与させることです。多くの場合、それらをあなたに対してではなくあなたのために機能させることができます。それを念頭に置いて、アプリケーションが何であっても、ほぼ完全に機能し、期限切れにならない無料のバージョンを保持することはおそらく価値があります。顧客がクレジットカードであなたを信頼する必要がないということ以外の理由がない限り、1ドルの値札と無料の違いは非常に大きくなります。製品の無料版は、海賊版の配布を効果的に殺すだけでなく(同じ価格で合法化できるのに、なぜ海賊版を危険にさらすのですか?)、視聴者を劇的に拡大する可能性があります。

その結果、有料版の価格を引き上げる必要がある場合があります。その結果、最終的に2,000ユーザーごとに20ドルで、100,000人の無料ユーザーがあり、そのうち500人が「プロフェッショナル」エディションに99ドルを支払います。 。これにより、製品のロックアップに多くの時間を費やした場合よりも多くのお金を稼ぐことができます。さらに、これらの無料のユーザーを引き付け、いくつかの重要な方法で関係を活用できます。

1つはサポートです。悲観主義者は、この機会を利用して、100,000人の無料ユーザーをサポートするコストの増加について不平を言うでしょうが、その代わりに驚くべきことが起こります。これは、サポートコストにお金がない大規模なオープンソースプロジェクトで常に見られます。ユーザーはステップアップしてそれを実現します。

一般に、無料のユーザーは、正当な理由により、サポートに対する期待を減らしています。必要なのは、無料版をコミュニティサポートの対象としてのみマークし、その目的のためにユーザーが管理するオンラインフォーラムを設置することだけです。サポートナレッジベースは自己生成型であり、上級ユーザーは、ユーザーに代わって余分な手持ちを必要とするユーザーを保護します。さらに重要なことは、これによりバグをより迅速に特定して修正できるため、最終的に製品の品質が向上し、総サポートコストが削減されることです。これは、ユーザーベースが十分に大きくなかったため、以前は不可能でしたが、無料のユーザーを顧客として扱うと、非常にうまく機能します。

もう1つはフィードバックです。フォーラムを見ることで、他の方法では考えられなかった重要な改善のアイデアを学ぶことができます。これにより、最終的により多くの無料ユーザーを有料ユーザーに変え、さらに多くの視聴者を引き付ける魅力的な製品を作成できます。

最後に、マーケティングを検討する必要があります。これらの無料ユーザーはすべて、敵ではなくファンになり、それに応じて行動します。それだけでなく、次のバージョンをリリースするとき、これらのユーザーは、他の未知のメカニズムではなく、承認された流通チャネルをすべて通過することになります。つまり、次のバージョンでは、より多くの関心を持ち、支援を必要とする大勢の聴衆とつながりを持つことから始めます。

Professional Editionで予約するのに最適な機能は、企業での展開と管理を容易にすることを目的としたツールです。クラッカーは、これらを自分で使用するためにハッキングするのに十分な理由とは思わないでしょうが、300ライセンスを購入して全社的にプッシュしようとするビジネスにとってこれは必須です。もちろん、プロ版はとにかく海賊版になりますが、繰り返しますが、汗をかかないでください。あなたが何をしたとしても海賊版に製品を販売することはおそらくできないので、any収益。

心理的にはこれほど製品を配るのは難しいかもしれませんが、どうすればそれが本当に最善の方法であるかを理解できることを願っています。それだけでなく、それが長期的に進む唯一の方法です。私は誰かがこのようにしたくないと考えていることを知っています。結局のところ、彼らはロックダウンされた$ 20の製品を何年も販売するだけで大​​丈夫です。しかし、これはあまりにも悪いことです。なぜなら、このようにしないと、最終的に他の誰かがになるからです。そして、彼らの製品はあなたのものと同じくらい良いか、彼らがそれを主張することで逃げることができるのに十分近いでしょう。それから突然、あなたの価格設定はとんでもないように見え、売り上げは劇的に落ち、他にできることは何もありません。必要に応じて追加の中間層を選択することもできますが、役立つとは考えられません。

262
Joel Coehoorn

私の経験では、あなたのアプリケーションやライブラリをクラックしにくくすることはあなたの誠実な顧客を傷つけますが、不正な顧客をわずかに遅らせるだけです。避けられないものを遅らせることに多くの努力を注ぐのではなく、大きくて摩擦の少ない製品を作ることに集中してください。

45
Kent Boogaart

あなたが多くの人と共有する秘密は秘密ではありません。あなたのコードに秘密のものがあるならば、それを難読化することは保護ではありません。一度だけ難読化解除する必要があります。あなたがあなたの顧客と共有したくないという秘密があるならば、それをあなたの顧客と共有しないでください。あなたのコードをWebサービスとして書き、あなただけがそれを見ることができるあなた自身のサーバーにあなたの超秘密のコードを保管してください。

38
Eric Lippert

大まかに言えば、そこには3つのグループの人々がいます。

  • ソフトウェアを購入してクラックに頼らない人、または見つからない場合は、ソフトウェアをまったく使用しない人。このグループから収入を得ることを期待しないでください。彼らは自分のスキルかクラッカーのどちらかに頼っています(あなたの有用性とあなたの聴衆の大きさに応じて時間を優先する傾向があります。

  • 使用する保護メカニズムに関係なく、ソフトウェアを購入(支払い)する正当なユーザーのグループ。正当なユーザーは精巧な保護メカニズムを使用して、どんな場合でも代償を払うので、人生を難しくしないでください。複雑な保護メカニズムはユーザーエクスペリエンスを簡単に損なう可能性があるため、このグループにこのような事態が発生することは望ましくありません。個人的に、私はあなたのソフトウェアのコストを追加するハードウェアソリューションに反対します。

  • 「非倫理的な」クラッキングに頼らず、ソフトウェアの代金を支払う少数派理由その機能はライセンスメカニズムによって保護されています。このグループがあなたの保護を回避することを非常に簡単にしたくないでしょう。ただし、このグループの人数に応じて、ソフトウェアの保護に費やしたすべての努力が報われます。これは、構築しているソフトウェアの種類に完全に依存します。

あなたが言ったことを考えると、あなたのソフトウェアの購入に押し込められる十分に大きな少数派があると思うなら、先に進み、何らかの形の保護を実装してください。この少数派からどれだけのお金を稼ぐことができるか、保護に取り組む時間、またはサードパーティの保護API /ツールに費やす時間を考えてください。

独自のソリューションを実装したい場合、公開鍵暗号を使用することは、簡単なハッキングを防ぐために(対称アルゴリズムとは対照的に)良い方法です。たとえば、ライセンスにデジタル署名することができます(シリアル番号、またはライセンスファイル)。これを回避する唯一の方法は、コードを逆コンパイル、変更、再コンパイルすることです(Simucalの答えで提案されているようなテクニックを使用すると、コードをより難しくすることができます)。

23
Mystic

他人があなたのソフトウェアをクラックするのを防ぐことはできません。

しかし、あなたは彼らがあなたの売上をあまり傷つけない亀裂を作り出すようにすることができます。ソフトウェアの有効な登録コードを発行できるキージェネレータは、ソフトウェアから登録インセンティブを削除する単純なパッチよりもはるかに悪いです。これは、クラックは1つのソフトウェアバージョンに対してのみ機能し、次にリリースするソフトウェアアップデートでは機能しなくなるためです。あなたがあなたの登録キーアルゴリズムを変えるまで、そしてそれがあなたの正直なクライアントを延期するので、それはあなたがしたくない何かであるまでkeygeneratorは働き続けるでしょう。

あなたのソフトウェアの違法なキージェネレータと戦うための方法を探していて、これが生成する長い登録コードのために非対称暗号化を使用したくないのであれば、あなたは部分的なキー検証を見ているかもしれません。

部分的なキー検証は、それぞれの違法なキージェネレータがあなたのソフトウェアの特定のリリースに対してのみ動作することを確認します。基本的にあなたがすることはあなたのソフトウェアの各リリースが登録コードのいくつかの数字をチェックするためのコードとリンクすることだけを確実にすることです。どの桁が正確にランダムなのか、クラッカーはあなたのソフトウェアの多くの異なるバージョンをリバースエンジニアリングし、あなたのソフトウェアのすべてのバージョンに対応するキージェネレータをリリースするためにこれらすべてを一つのキージェネレータに結合しなければならないでしょう。

あなたが定期的に新しいソフトウェアバージョンをリリースするならば、これはもう動作していないあらゆる種類のソフトウェア違法コピーアーカイブに広がる多数の主要なジェネレータにつながります。潜在的なソフトウェア海賊は通常、最新バージョンのクラックやキー生成を探しているので、おそらくそれらのうちのいくつかを試して最終的にあきらめるでしょう。

私は(C++)新しいシェアウェアゲームでPartial Key Verificationを使用しましたが、非常に効果的です。以前は、鍵生成者には戦うことができなかった多くの問題がありました。その後、そのゲームの特定のバージョンでしか機能しないクラックやキージェネレータがいくつかありましたが、すべてのバージョンで機能するキージェネレータはありませんでした。私たちは定期的にゲームのマイナーアップデートをリリースし、以前から存在していたすべてのクラックを役に立たなくするためにリリースしました。

私は試したことはありませんが、オープンソース 部分キー検証のための.NETフレームワーク があるようです。

19
Adrian Grigore
  • これらのライセンスのないコピーをブロックするためにオンラインアップデートを使用してください。

  • アプリケーションのさまざまなモジュールからのシリアル番号を確認し、確認を行うために単一の関数呼び出しを使用しないでください(クラッカーが簡単に確認を回避できないようにするため)。

  • 起動時にシリアル番号をチェックするだけでなく、データを保存しながら検証を行い、毎週金曜日の夜に実行します。ユーザーがアイドル状態のときに実行します。

  • アプリケーションファイルのチェックサムを確認し、セキュリティチェックサムを別の場所に保存します。

  • 登録コードを検証している間、アプリケーションがクラッシュしたり誤動作したりしないことを確認してください。

  • ユーザーにとって便利なアプリを作成することは、作成することよりもはるかに重要です。
    クラッカーのための解読不可能なバイナリ。

16
rIPPER

あなたはできる..

マイクロソフトSLPサービスInishTechのSoftware Potential は、アプリケーションの機能に影響を与えずにコードを保護するのに役立ちます。

アップデート:(開示:私はEazfuscator.NETに取り組んでいます)何がになりますマイクロソフトSLPサービスソフトウェアポテンシャルの違いは、コードを仮想化する機能です。したがって、間違いなくできます。質問が最初に出されてから数年が経ちました。今日では、以下のような同様の方法で機能する他の製品もあります。

14
Binoj Antony

。NET Reflector は基本的に ".NETコード"を意味する "マネージコード"のみを開くことができます。そのため、COM DLLファイル、ネイティブC++、クラシック Visual Basic 6.0 コードなどの逆アセンブルには使用できません。コンパイルされた.NETコードの構造によって、 .NET Reflectorはこれを利用してコンパイル済みのアセンブリにピアリングできるようにしますが、逆コンパイラおよび逆アセンブラは.NET固有のものではなく、コンパイラが使用されている限り使用されています。

難読化機能を使用してコードを読みにくくすることはできますが、.NETで読めなくすることなくコードの逆コンパイルを防ぐことはできません。マネージコードアプリケーションをネイティブコードアプリケーションに「リンク」すると主張する(通常は高価な)少数の 製品 があります。常に道を見つけるでしょう。

それが難読化になると、あなたはあなたが支払ったものを手に入れる。あなたのコードがそれを保護するためにそのような莫大な長さに行かなければならないほどプロプライエタリであるならば、あなたは良い難読化ツールにお金を投資しても構わないと思います。

しかし、私の15年ほどのコード作成経験の中で、私はあなたのソースコードを過度に保護することは時間の無駄であり、ほとんど利益がないことに気づきました。ドキュメントやコメントなどをサポートせずにオリジナルのソースコードを読もうとするだけでは、理解するのが非常に困難になる可能性があります。それに加えて、逆コンパイラーが思いつく無意味な変数名と現代の難読化ツールが作成するスパゲッティコード - あなたはおそらくあなたの知的財産を盗む人々についてあまり心配する必要はないでしょう。

10
Josh

あなたが他の人にあなたのコードを実行させたいのなら(そしてもしあなたがそうしないのなら、なぜあなたはそもそもそれを書いたのですか?)、そして彼らのCPUはあなたのコードを実行できる必要があります。executeコードを実行できるようにするには、CPUがunderstanditを実行できる必要があります。

CPUはダムで人間はそうではないので、これは人間もコードを理解できることを意味します。

あなたのユーザがあなたのコードを手に入れないことを確実にする唯一の方法があります:彼らにあなたのコードを与えないでください。

これには2つの方法があります。 サービスとしてのソフトウェア (SaaS)。つまり、ソフトウェアをyourserverで実行します。あなたのユーザがリモートからアクセスできるようにするだけです。これは、たとえばStack Overflowが使用するモデルです。私はStack Overflowが彼らのコードを難読化しないことを確信しています、それでもあなたはそれを逆コンパイルすることはできません。

もう1つの方法はアプライアンスモデルです。ユーザーにコードを提供する代わりに、コードを含むコンピューターをユーザーに提供します。これは、ゲーム機、ほとんどの携帯電話、そして TiVo が使用するモデルです。これは、実行パス全体を「所有」している場合にのみ機能することに注意してください。独自のCPU、独自のコンピュータ、独自のオペレーティングシステムおよび独自の CLI 実装を作成する必要があります。そして、の場合に限りであなたのコードを保護することができます。 (ただし、tiniestの間違いでもすべての保護機能が役に立たなくなることに注意してください。Microsoft、Apple、Sony、音楽業界、映画業界はそれを証明することができます)

あるいは、あなたはただ何もすることができませんでした、それはあなたのコードが著作権法によって自動的に保護されることを意味します。

9
Jörg W Mittag

それは本当に価値がありますか?すべての保護メカニズムは十分な判断をもって破られる可能性があります。あなたの市場、製品の価格、顧客数などを考えてください。

もっと信頼できるものが欲しいなら、ハードウェアキーの道をたどりますが、それは(ユーザーにとって)かなり面倒で、そしてもっと高価です。ソフトウェアソリューションはおそらく時間とリソースの浪費になるでしょう、そしてそれらがあなたに与える唯一のものは「セキュリティ」の誤った感覚です。

これ以上のアイデアはありません(完璧なものがないため、完璧なものはありません)。

  • AntiDuplicate
  • 言語を変更し、 Skype の作者が使用したニーストリックを使用する
  • ライセンスサーバー

クラッカーは典型的なテクニックについて多くの経験を積んでおり、あなたに先んじる数歩しか進んでいません。大量のリソースを使用したくない場合は、おそらくプログラミング言語を変更します(Skypeの方法で行います)。

9
Anonymous

購買保護とは別に、あなた(またはあなたの開発者)はコピー防止について学ぶことができます。

これらはアイデアです:

最初に、自分自身をコンソールに書き込むプログラムを書くようにしてください。それは有名な問題です。このタスクの主な目的は自己参照コードを書く練習をすることです。

第二に、他の方法に依存するようにコードを書き換える技術を開発する必要があります CIL

仮想マシンを書くことができます(まだ 。NET にあります)。そしてそこにいくつかのコードを入れてください。最終的に、仮想マシンはコードを実行する別の仮想マシンを実行します。これは、あまり性能を落とさないようにするためのめったに呼ばれない機能の一部です。

ロジックをC++/CLIに書き換え、マネージコードとアンマネージドコードを混在させる。これは分解を強化します。この場合、 x64 バイナリも忘れずに提供してください。

8

残念ながら、あなたはこれから逃げるつもりはありません。あなたの最善の策は、Cであなたのコードを書くこと、そして P/Invoke それです。

ちょっとしたcatch-22があります、誰かがあなたのアプリケーションを CIL に逆コンパイルし、検証/アクティベーションコードを殺すことができます(例えば、あなたのCライブラリ) C言語で書かれたアプリケーションは、より持続的なハッカーによってもリバースエンジニアリングされていることを忘れないでください(最近のゲームがどれだけ速く割れているかを見てください)。アプリケーションを保護するものは何もありません。

結局のところ、それはあなたの家によく似た働きをします、それがあまりにも努力であること(スパゲッティコードはここで助けになるでしょう)そして加害者がちょうどあなたの隣の隣人に移動するように十分にそれを十分に保護します。 Windows Vistaを見て、それをクラックするための10の異なる方法があるはずです。

あなたのEXEファイルを暗号化し、ユーザがそれを使用することを許可されたときにそれを復号化するパッケージがありますが、これもまた疑いの余地のない一般的な解決策を使用しています。

アクティベーションと登録のメカニズムは、それを回避するのに十分な技術に精通していない(またはその点では回避できることを知っている)人々を対象としています。クラッカーを気にしないでください、彼らは彼らの手にはるかに多くの時間があります。

はい。それは本当です。コードが難読化されていない場合、.NETコードはリバースエンジニアリングが非常に簡単です。

難読化はあなたのソフトウェアをリバースエンジニアリングしようとしている人々に迷惑の層を追加するでしょう。どのバージョンを入手するかに応じて、さまざまなレベルの保護が得られます。

Visual Studioには、 Dotfuscator のバージョンが含まれています。これはバンドル版なので、最強の難読化が可能になるわけではありません。それらの機能リストを見れば、足りないもの(そしてコードをより安全にするためにアプリケーションが行うこと)を正確に知ることができます。

他にも無料またはオープンソースの.NET難読化プログラムがいくつかあります(ただし、品質やそれらが使用するさまざまな方法についてはコメントできません)。

結局、何も完璧ではありません。誰かがあなたのソフトウェアがどのように動くのかを本当に見たければ、彼らはそうするでしょう。

7
Justin Niessner

まあ、あなたは完全にあなたの製品をクラックから保護することはできませんが、セキュリティレベルを最大化/強化し、初心者や中級クラッカーにクラックされるのを少し難しくすることはできます。

しかし、厄介なことは何もないことを心に留めておいてください、サーバ側のソフトウェアだけがよく保護されていて、解読することができません。とにかく、あなたのアプリケーションのセキュリティレベルを向上させるために、いくつかのクラッカーがあなたのアプリケーションをクラックするのを「すべてではない」のを防ぐためにいくつかの簡単なステップを行うことができます。これらのステップはこれらのクラッカーを実らせ、そしておそらく必死にするでしょう。

  • あなたのソースコードを難読化してください、明らかにこれはあなたのソースコードをめちゃくちゃ読めないようにします。
  • 2時間ごと、24時間ごと、1日ごと、1週間ごとなど、アプリケーションの内部でいくつかのランダムチェックルーチンを起動します。
  • リリースしたアプリケーションの MD5 チェックサムをサーバーに保存し、現在のファイルMD5チェックサムをサーバー側の実際のファイルと照合して確認できるルーチンを実装します。ランダムに起動します。 MD5チェックサムが変更された場合、これはこのコピーが違法コピーされたことを意味します。今、あなたはただそれをブロックするか、それをブロックするためにアップデートをリリースすることができます。
  • コード(関数、クラス、特定のルーチン)のいくつかが実際に変更または変更されたか、あるいは削除されたかどうかをチェックできるルーチンを作成してください。私はそれを呼び出します(コードの整合性チェック)。
  • あなたのアプリケーションをパックするために無料の未知のパッカーを使用してください。または、お金がある場合は、 Thamidaなどの商用ソリューションを利用してください。NET Reactor これらのアプリケーションは定期的に更新され、クラッカーがアプリケーションを解凍すると、それらの企業から新しいアップデートを入手することができます。新しいアップデートを入手したら、プログラムをパックして新しいアップデートをリリースすることができます。
  • 定期的にアップデートをリリースし、顧客に最新のアップデートをダウンロードするように強制します。
  • 最後にあなたのアプリケーションを非常に安くします。高価にしすぎないでください。私を信じて、あなたはもっと幸せな顧客を得るでしょう、そしてクラッカーはただあなたのアプリケーションを離れるでしょう、それは彼らが非常に安いアプリケーションをクラックする時間の価値がないからです。

これらは、初心者や中級者があなたのアプリケーションをクラックするのを防ぐための単純な方法です。アプリケーションを保護するためのアイデアがもっとあるのなら、それらを実装するのは恥ずかしがらないでください。それはクラッカーを激しく暮らさせるだけでなく、彼らはイライラするでしょう、そして結局彼らはあなたのアプリケーションを離れるでしょう。

最後に、質の高いアプリケーションのコーディングに時間を費やすことも検討する必要があります。複雑なセキュリティレイヤのコーディングに時間を無駄にしないでください。良いクラッカーがあなたのアプリケーションをクラックしたい場合、彼/彼女はあなたが何をしても関係ありません...

さあ、クラッカーのためのおもちゃをいくつか作ってみましょう。

6
SolidSnake

Salamander があります。これは、.NET Frameworkなしでアプリケーションをデプロイできる、ネイティブの.NETコンパイラおよびRemotesoftのリンカです。私はそれがその主張にどれだけ耐えられるかわからない。

5
Matthew Olenik

マイクロソフトが解決策を思い付くことができれば、私たちは違法コピーされたWindowsバージョンを手に入れることができないでしょう。ここにStack Overflowからのいくつかの同様の質問があります、そしてあなたはそれらを保護するあなた自身の方法を実行することができます。あなたが異なるバージョンをリリースしているなら、あなたは異なるバージョンのために異なるテクニックを採用することができます。

5
Shoban

。NET Reactor

更新

Jaredは、 de4dot がそれを逆コンパイルできると主張していると指摘しました。

.NET Reactorは、.NETアセンブリをCILとして理解することができず、既存のツールで逆コンパイルすることができない管理されていないプロセスに変換することによって、機密の知的財産を完全に保護します。ハッカーはあなたの情報源の理解できる形にアクセスすることはできません。

強力で柔軟な.NET Reactorのライセンス機能を使用すると、ハードウェアとソフトウェアのロックを使用して、ライセンス条件を強制し、収益を保護することができます。ライセンスマネージャは、数秒でトライアルライセンスまたは永久ライセンスを作成できます。例が揃った完全に文書化されたソフトウェア開発キット(SDK)を使用すると、コードから直接ライセンスシステムを呼び出すことができ、ライセンスシステムへのカスタム拡張を作成できます。

5
loraderon

1つの考えはここにあります:あなたはあなたのソフトウェアの全てのインスタンスが接続する必要があるあなたの会社によってホストされているサーバーを持つことができます。単に接続して登録キーを確認するだけでは不十分です。チェックを外すだけです。キーチェックに加えて、クライアントには実行できないような重要なタスクもサーバに実行させる必要があるため、削除することは不可能です。もちろん、これはおそらくあなたのサーバの側で多くの重い処理を意味するでしょう、しかしそれはあなたのソフトウェアを盗むのを難しくするでしょう、そしてあなたが良い鍵スキーム(所有権のチェックなど)を持っているとスチール。ソフトウェアを使用するには、ユーザーがインターネットに接続している必要があるため、これはおそらくあなたが望むよりももっと侵略的です。

4
rmeador

クライアント上で実行されているものはすべて、逆コンパイルして解読することができます。難読化はそれを難し​​くするだけです。私はあなたのアプリケーションを知りませんが、私はそれが努力に値するとは思わない時の99%.

3
Kendrick

コードを難読化しましょう。 C#コードの難読化に例があります。

3
ligaoren

申し訳ありませんが、アプリケーションを完全に保護することは不可能です。

2
Fredou

率直に言って、時にはコードを難読化する必要があります(たとえば、ライセンスクラスを登録するなど)。この場合、あなたのプロジェクトは無料ではありません。 IMO、あなたは良い難聴者にお金を払うべきです。

Dotfuscator はコードを非表示にし、 NET Reflector は試行するとエラーを表示します。それを逆コンパイルする。

2
Mehdi Golchin

.NETに関しては、 Windowsフォーム アプリケーション(またはクライアントにPortable Executableファイルがある任意のアプリケーション)をリリースしていれば可能です。割れる.

あなたが.NETに固執して、あなたのソースコードを持っているという可能性を最小にしたいならば、あなたはそれを ASP.NETとして展開することを考慮したいかもしれません Windowsフォームアプリケーションにするのではなく、Webサーバーにまたがるアプリケーション。

2
George Stocker

Obfuscator の使用をお勧めします。

2
masoud ramezani

良いアプリケーションを作成し、単純な保護システムをコーディングするだけです。どの保護を選択してもかまいませんが、元に戻すことができます。

2
knoopx

99%以上のユーザーが、実行可能ファイルを調べてそれがどのように機能するかを調べることに関心があるわけではないことに注意してください。

ごくわずかな人でも試してみることに悩まされることはほとんどなく、ほとんどの難読化ツールを回避できることを考えれば、それはあなたの時間と努力の価値がありますか?

より多くの人がそれを使用したいと思うようにあなたはあなたの製品を改良するために時間を投資するほうが得策です。

2
ChrisF

それが.NETで書かれていて CIL にコンパイルされているなら、それは反映されることができます。セキュリティが懸念され、難読化を避ける必要がある場合は、非管理言語を使用してアプリケーションを作成することをお勧めします。これは本来、リバースエンジニアリングが難しいことです。

2
Kyle Trauberman

アプリケーションが改ざんされていないことを確認する方法、および登録メカニズムがリバースエンジニアリングできないことを確認する方法。

どちらも非常に単純な答えを持っています。(明らかに)あなたの顧客のような信頼できない当事者にオブジェクトコードを配ってはいけません。あなたのマシン上でアプリケーションをホストすることが実行可能かどうかはそれがすることにのみ依存します。

Webアプリケーション でない場合は、アプリケーションサーバーへのX転送を伴う SSH ログインを許可することもできます(または Remoteデスクトップ接続 、私はWindows用だと思います。

もしあなたがオブジェクトコードをオールドタイプの人に渡して、彼らがあなたのプログラムがクラックするのは楽しいかもしれないと思うなら、それは will クラックされるでしょう。それを回避する方法はありません。

私を信じていないのであれば、クラックされて海賊版にされていない知名度の高いアプリケーションを指摘してください。

ハードウェアキーを使用すると、プロダクションがより高価になり、ユーザーがそれを嫌うことになります。ソフトウェアメーカーはあなたを信頼していないので、フロアに這い回って27種類のUSB機器を抜き差しするのは本当の愚痴です(私は想像しています)。

あなたのEXEを暗号化し、ユーザーがそれを使用することを許可されたときにそれを復号化するそこにパッケージがあります

もちろん、それを回避するには、 "can-I-use-it"テストをクラックして常にtrueを返すようにします。

厄介なトリックは、値がちょうど良い場合でない限りプログラムを高い確率でクラッシュさせるでしょう汚い方法でプログラム内のどこかでテストを実行するオペコードのバイト値を使用することであるかもしれません。それはあなたが特定のアーキテクチャにリンクさせてくれます、しかし:-(

2
Jonas Kölker

警告を追加するだけです。難読化を使用する予定がある場合は、すべてがまだ機能することを確認してください。難読化はクラス名やメソッド名のようなものを変えるかもしれません。そのため、リフレクションを使って特定のメソッドやクラス(プラグインアーキテクチャなど)を呼び出すと、難読化後にアプリケーションが失敗する可能性があります。スタックトレースもエラーを追跡するのには役に立たないかもしれません。

2
Hans Kesting

私はまた私のデザインのセキュリティをハッキングすることに関していくつかの考慮をしました、そして、それらのいくつかが言及されていないようであるのでそれらを加えたいです:

私は自分のアプリケーションにスクリプトインターフェイスを持っています。確実にするために、スクリプトは(python)スクリプトによって呼び出されることを意図したメソッドのみを呼び出すことができます。私はこれらの属性を認識するscriptvisibilityattributeとSystem.Dynamic.DynamicMetaObjectProviderを持ちます。

ライセンスは公開鍵/秘密鍵を使用します。

ViewModelは、ロック解除機能にパスワードを与えてロック解除する必要があります。

CoreRoutinesはドングルに実装することができます。 (それをサポートするドングルがあります)

ラッパーのような大きな解決策は計画されていませんでした。

もちろん、このscripting/viewModel apporachでは、コードからスクリプトでは見えない関数のロックを解除して呼び出すことは不可能ですが、それを行うのはもう少し困難です。

1
charly_b

最も良い答えは彼自身の期限切れから話している小さな開発者からの最初のものです、上で議論されたすべての逆転防止技術はどんな深刻なリバースエンジニアのための101教科書ケースです。

市販のDRMソリューションの中にはかなりきちんとしたものもありますが、カスタムDRMソリューションを使用して、すべてのトリプルAAAゲームを数時間(または数日)の間ずっとクラックします。まったく新しいDRMソリューションが導入されただけで(場合によっては)2、3週間は避けられないことがあります。

DRMを最大限に活用するには、多くの時間と費用がかかり、パフォーマンス、信頼性、互換性/移植性、および顧客との関係全般に悪影響を与える可能性があります。どちらかといえば賢くなることなく、より少ない損失を取ることなく、まともな商用DRMに固執するか、単にそれを完全に忘れるかのどちらかです。

独自に開発したDRMソリューションの一例(商用)Grave: http://en.wikipedia.org/wiki/StarForce

1
user2929885

はい、 。NET バイナリ(EXEおよびDLL)は簡単にほぼソースコードに逆コンパイルできます。ツールを確認してください 。NET Reflector 。 .NETバイナリファイルに対して試してください。最善の選択肢はファイルを難読化することです、それでも.NET Reflectorによって逆コンパイルすることができますが、それらは読めない混乱を引き起こします。良い難読化ツールが無料か安いとは思わない。 1つはVisual Studioに付属のDotfuscator Community Editionです。

1
Andrey

600票以上の回答への回答:「できません。」;

これは社会的にプログラムされた世界の状況であり、文化によって定められた囲いをあなたに強制することです。
プログラムの作成を学びながら、他の人が環境を操作する方法を学んだことを意味します。
保護は、コードロジックに起因しない現実である利用可能な概念によって、他の誰かの問題として導かれます。

その後、政治的人物は制作の一部として図式化されます。彼らの存在の結果である寿命の義務を解き放つことによって彼らの囲いが起こる社会的文化によって対処されています。

これらの社会的賦課のために、Lex Luthor\Supermanが誰であるかを知るための対立。

「できません。」

状況でプログラムされた人類の進路を妨げないためのタイトルです。つまり、侵入の利益を満たすために調和して行動しないための知識を明らかにすることで、知覚に生産性がないことを意味します。

0
H3sDW11e

マイクロソフトのブログの以下の質問によると:

https://blogs.msdn.Microsoft.com/amb/2011/05/27/how-to-prevent-ildasm-from-disassembling-my-net-code/

ILDASMがアセンブリを分解しないようにするにはどうすればよいですか?

.NETにはSuppressIldasmAttributeという属性があり、コードの逆アセンブルを防ぎます。たとえば、次のようなコードを考えます。

using System;
using System.Text;
using System.Runtime.CompilerServices;
[Assembly: SuppressIldasmAttribute()]

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world...");
        }
    }
}

ご覧のとおり、違いは2つだけです。

  1. System.Runtime.CompilerServices名前空間減速を追加しました。

  2. [Assembly: SuppressIldasmAttribute()]属性を追加しました。

Visual Studioでアプリケーションをビルドした後、結果のEXEファイルをILDASMで開くと、次のメッセージが表示されます。

enter image description here

0
BattleTested