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


491

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

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

C#は多くの機能を提供し、私のコードにとって理想的な言語であるため、C ++でコードベース全体を再度記述することは問題外です。

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



@Andreas:これは素晴らしい!! やってみます。誰かそれを使用していますか?
ジャック

1
@Jackはウィンドウストアアプリ専用です。(私が知る限り)デスクトップアプリのタイムラインはありません。
タイラーロング

古いC ++なしのネイティブが必要な場合は、Delphiを使用してください。.Netの使いやすさは、とにかくDelphiに由来します。
William Egge 2017年

回答:


671

できません。

もう少し難しくするために実行できる手順がありますが、最終的にローカルマシン上の実行可能ファイルはクラック可能です。最終的に、そのコードはネイティブマシンコードに変換する必要があり、実行可能なすべてのアプリケーションは脆弱です。

あなたがしたいことは、人々のトラブルに見合わないようにクラックするのを十分に難しくすることです。

アプリケーションの保護に役立ついくつかの提案:

  • コードを難読化します。Dotfuscatorには無料版があり、Visual Studioに付属しています。
  • 使用公開鍵/秘密鍵または非対称暗号化製品のライセンスを生成します。これにより、自分だけライセンスコードを生成できるようになります。アプリケーションクラックされた場合でも、キー生成アルゴリズムを逆にすることは不可能であるため、アプリケーションのキージェネレーターが解放されないことが確実になります。
  • サードパーティのパッカーを使用して、.NET実行可能ファイルを暗号化されたWin32ラッパーアプリケーションにパックします。テミダはより良いものの一つです。これにより、人々が.NET Reflectorでアプリケーションを反映することができなくなり、逆に展開するために解凍するのが面倒になります。
  • 独自のカスタムパッカーを作成します。サードパーティのパッカーが高すぎる場合は、独自のものを書くことを検討してください。カスタムパッカーは、アンパックする方法が十分に公開されていないため、非常に効果的な場合があります。チュートリアル「独自のパッカーを作成する方法」では、独自のWin32パッカーの作成に関する豊富な情報を提供しています。

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

熟練したリバースエンジニアがIDA-Proを起動し、何をしても、バターのようなアプリケーションをスライスできます。パックされたアプリケーションはアンパックすることができ、難読化すると、公園での散歩ができなくなります。複雑なライセンスコードを使用したハードワークはすべて、シングルバイトパッチで元に戻すことができます。

あなたは、人々があなたのソフトウェアを海賊版にしようとしている非常に現実的な可能性があることを受け入れる必要があるだけです。何があってアプリケーションの代金を決して支払わない人もいますが、これらはあなたが心配する必要のない人です。

しかし、訴訟の危険を冒すことなくソフトウェアライセンスを喜んで購入する企業や、危険を冒したくない、間違っている、または海賊行為に十分な技術に精通していないコンピュータユーザーが多数存在します。これらはあなたの真の顧客であり、あなたは彼らに優れたユーザー体験を提供することにあなたの努力を集中し、あなたのソフトウェアをクラックする人々を無視するべきです。

以前にアプリケーションの海賊版を作成したことがあり、私はそれを個人的な侮辱として捉えました。ここで私は小さな時間の開発者でしたが、私の心と魂をアプリケーションに注ぎ込んでいました、そしてこれらの人々は私から海賊行為をするためのゴールを持っていましたか?!彼らは私のポケットから直接お金を取っていました!

私はすぐに厳格なDRMコードの束を追加し、違法なまたはひびの入ったコピーを使用して任意の人物を妨害しようとしました。もちろん、避けられないことをやめようとするのではなく、アプリケーションを改善することに取り組んできたはずです。それだけでなく、私が本当の顧客を傷つけていたのです

長い戦いの末、私は潮と戦っていることに気付きました。ベアボーンライセンス機能を除いて、すべてのテレフォンホームコードを取り出し、振り返ることはありませんでした。


67
+1になると、ほぼ+2になります。断固たる攻撃者からソフトウェアを保護することはできません。
ボンベ、

102
ソフトウェア保護の問題に到達しました。それは、保護を追加することではなく、製品に焦点を当てて、人々がそれに対してお金をかけたいほど良いものにすることです。そして、海賊行為をする人々にとって、彼らはとにかくお金を払ったことがなかったので、まるで彼らが存在しなかったかのようです。
Arthur Chaparyan

6
@Arthur Chaparyan、同意する。ここまで行くのに時間がかかりましたが、ようやく光を見ました。私はより厳しい保護とクラッカーとの戦いの道を進みました。私は自分自身を防ぐためにリバースエンジニアリングについてできる限りのことを学びました。私は最終的に正しいイデオロギーを
見つけ

50
地獄私のソフトウェアが海賊版の価値があると思った誰かを見つけることができて光栄に思っていました...
Erik Forbes

10
収入の大部分をソフトウェアの販売に頼り始めると、状況が変わります。誰かがあなたから盗んでいるように感じます。私はあなたが言っていることを理解します。トレントサイトでソフトウェアのクラックを最初に見つけたとき、私はショックを受けました。
mmcdole 2009

265

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

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

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

ユーザーはライセンスを気にしないため、これを行う必要があります。ライセンスは、必要になるまで誰も気にかけないものです。誰もそれを読まないので、読む必要はありません。したがって、境界がどこにあるかをユーザーに通知する最良の方法は、アプリケーションの標準の動作がライセンスに準拠している場合です。この最初のケースでは、インストールの失敗、または2回目の試用版モードでのインストールのいずれかを意味します。後者の場合、構成ファイルでプレーンテキストの日付をチェックすることを意味するだけかもしれません。どちらの方法でも、エレガントで親切で丁寧な方法で処理してください。

つまり、それが意味することはそれだけです。しかし、さらに先に進んでみませんか?あなたが見つけることができるすべての小さな穴を塞がないのはなぜですか?答えは2つの部分に分かれています。まず、誰かがあなたのライセンス条項を意識的に違反するという倫理的限界を超えた場合-単純な方法でさえ-彼らはまた、急流からあなたのアプリケーションを引っ張るなどのより困難または危険なことをいとわないでしょうサイト—信頼できないソースからダウンロードしたアプリケーションの実行には、ある程度の危険があります。それをさらに困難にすることは、これらのユーザーにとってわずかな不快感であり、支払っている顧客に問題を引き起こすリスクがあります。単純にしておくと、誰かがあなたのアプリケーションを掘り下げて、より包括的なクラックをリリースするのを防ぐことができます。次に、欠陥を探すために利用できる目がほとんどありません。ハッカーには多くの人がいて、彼らを見つけるための慣習がもっとあります。あなたは1つの小さな欠陥を見逃す必要があるだけで、あなたのアプリは海賊サイトであなたが何もしなかったかのように同じ配布をします。あなたは毎回正しくなければなりません。彼らは一度だけ幸運である必要があります。したがって、必要な労力は非常に高く、成功の測定値の可能性は非常に低くなります。

最終的に、誰かが(単にそれを使用するのではなく)アプリケーションを海賊版にしたいと思った場合、それが彼らの主な目的です。それらを止めるためにあなたにできることは何もありません。これがソフトウェアの性質です。製品を構成するファイルがユーザーのコンピューターにある、ユーザーは必要に応じてそれら使用できます。これは、Javaや.NETなどの管理された環境に特に関係しますが、ネイティブコードにも適用されます。時間は彼らの味方であり、十分な時間が与えられれば、いかなるデジタルセキュリティも破られる可能性があります。

ユーザーによる製品の海賊行為を阻止することはできないため、最善策は、このクラスのユーザーを利用してユーザーの利益に役立てることです。多くの場合、あなたに反対するのではなく、あなたのためにそれらを機能させることができます。これを念頭に置いて、アプリケーションが何であれ、ほぼ完全に機能し、有効期限のない無料バージョンを維持することはおそらく価値があります。顧客がクレジットカードであなたを信用する必要がないという理由以外に理由がなければ、1ドルの値札と無料の違いさえも大きなものです。製品の無料版は、海賊版の配布を効果的に殺すだけでなく(同じ価格で正当である可能性があるのに海賊版を危険にさらすのはなぜですか)、視聴者を劇的に拡大する可能性があります。

その結果、有料版の価格を上げる必要があるかもしれません。その結果、2,000ユーザーがそれぞれ$ 20の代わりに100,000の無料ユーザーができ、そのうち500が「プロフェッショナル」版に$ 99を支払う用意があります。 。これは、製品をロックするのに多くの時間を費やした場合よりも多くのお金を稼ぎます。それ以上に、これらの無料のユーザーを引き付け、いくつかの重要な方法で関係を活用できます。

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

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

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

最後に、マーケティングを検討する必要があります。これらの無料ユーザーはすべて、敵対者ではなくファンになり、それに応じて行動します。それだけでなく、次のバージョンをリリースするときになると、これらのユーザーは他の未知のメカニズムではなく、承認された配布チャネルをすべて通過します。つまり、次のバージョンでは、より大きく、非常に興味深く、協力的な視聴者とのつながりから始めます。

プロフェッショナルエディション用に予約する最適な機能は、企業の展開と管理を容易にすることを目的としたツールです。クラッカーは、これらを自分の使用のためにハッキングする十分な理由とは考えていませんが、300ライセンスを購入して全社的に展開しようとする企業にとって、これは必需品です。もちろん、プロフェッショナル版はとにかく海賊版されますが、再び:あなたはおそらく、あなたが何をしたかに関係なく、これらの海賊に製品を販売しないことができないだろうので、それはあなたの原価計算ではないですので、それを悩む必要はありません任意の収入を。

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


1
@Learning:時間とともに成長し、CWしきい値への自動変換に合格しました。
Joel Coehoorn 2009年

1
+1この質問の以前のバージョンに与えた答えよりも優れています。@ジョエルは限界があることを知りませんでした。
pipTheGeek 2009

1
私はここのすべてに完全に同意するわけではありません。それは、非常によく考えられたプレゼンテーションと議論にとって、とにかく簡単な+1です。
Beska

2
良い議論ですが、知的財産の保護に関するポイントを逃しています。アプリに多少複雑な処理を行うコードがある場合、難読化によって、コードのコピーと貼り付けをフラットにすることと、コードを解釈してリエンジニアリングして機能するようにすることができます。これはアップデートで特に重要です。難読化されたコードを誰かがコピーした場合、アップデートをリリースすると、彼らはそれを何度もやり直す必要があります-少なくとも、それは彼らにもっと苦痛/費用/時間を引き起こします。何らかの方法で保護されていない場合は、再度コピー/貼り付けするだけで機能します。
gregmac '19年

4
すばらしい記事-複雑なコピー防止機能を作成することに煩わされない理由について、すべての詳細が説明されています。質問は重複していますが、この回答のためだけにもう一度開く価値があります。多分modはそれをマージできますか?
EMP 2010年

45

私の経験では、アプリケーションまたはライブラリをクラックすることをより困難にすることは、誠実な顧客を少しだけ遅らせる一方で、正直な顧客を傷つけます。必然を遅らせることに多くの努力を払うのではなく、優れた低摩擦の製品を作ることに集中します。


38

多くの人と共有する秘密は秘密ではありません。コードに秘密のものがある場合、難読化しても保護されません。1回だけ難読化を解除する必要があります。顧客と共有したくない秘密がある場合は、顧客と共有しないでください。コードをWebサービスとして記述し、スーパーシークレットコードを自分だけのサーバーに保存します。自分だけが見ることができます。


1
ところで、製品を「オフライン」でアクティブ化したいプロジェクトも行っています(オンラインでアクティブ化できるようにWCFサービスを作成しました)。この場合、どのようにコードを操作しますか?ヒットをくれますか?
Piyush、2010

1
興味深いアイデアですが、WP7ゲームなど、データ接続なしで実行する必要があるアプリケーションを開発している人に、どのような方針をお勧めしますか?
チャーリースキルベック

23

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

  • あなたのソフトウェアを購入せず、ひび割れに頼らない人、またはそれらを見つけられない場合は、あなたのソフトウェアをまったく使用しないでください。このグループからお金を稼ぐことを期待しないでください。彼らは独自のスキルまたはクラッカーに依存しています(クラッカーは、ユーザーの有用性とオーディエンスの規模に応じて時間を優先する傾向があります。有用性が高いほど、クラックが早く利用可能になります)。

  • 使用する保護メカニズムに関係なく、ソフトウェアを購入する(代金を支払う)正当なユーザーのグループ。正当なユーザーが精巧な保護メカニズムを使用して人生を苦労することはありません。いずれにせよ、彼らはお金を払うからです。複雑な保護メカニズムはユーザーエクスペリエンスを簡単に損なう可能性があり、このようなことがこのグループで発生することは望ましくありません。個人的には、ハードウェアソリューションには反対票を投じ、ソフトウェアのコストを増加させます。

  • 「非倫理的な」クラッキングに頼る少数派でありその機能はライセンスメカニズムによって保護されているため、ソフトウェアの代金のみを支払います。このグループがあなたの保護をすり抜けるのを非常に簡単にしたくはないでしょう。ただし、ソフトウェアの保護に費やすすべての努力は、この人々のグループがどれほど大きいかに応じて、見返りをもたらします。これは、構築しているソフトウェアのタイプに完全に依存します。

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

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


強力な暗号化を使用してライセンスを保護/検証しても、ライセンスがチェックアウトされない場合に誰かがアプリケーションを中止するコードを引き抜くと、完全に役に立たなくなります。:)
ボンベ、

同意しましたが、私が言っていたように、保護はクラックを使用することに頼るユーザーのグループのためではありません(私が作った仮定は存在するでしょう)。
ミスティック

公開鍵暗号化=非対称暗号化。あなたは対称を意味していたと思います。
mmcdole 2009

1
公平を期すために、人々の一部は常に少数派であると想定しているため、3番目のポイントは偏っています。特定のフレームワークでは、それが明らかに過半数であると確信しています。)ほとんどのユーザーは非常に低い倫理基準を持つ子供たち、それはなどヶ月間、ドラッグ月額料金だ場合b)のコストは、それらのユーザーに大きくなる可能性があるので、私は心の中で多人数参加型とオンラインゲームを特徴としている
J RIV

19

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

ただし、販売に支障をきたさない亀裂を作成させることができます。ソフトウェアに対して有効な登録コードを発行できるキージェネレータは、ソフトウェアから登録インセンティブを削除する単純なパッチよりもはるかに劣っています。これは、クラックが1つのソフトウェアバージョンでのみ機能し、リリースする次のソフトウェアアップデートで機能しなくなるためです。キージェネレータは、登録キーアルゴリズムを変更するまで機能し続けます。これは、正直なクライアントを先送りにするため、頻繁に実行したくないものです。

したがって、ソフトウェアの不正なキージェネレータと戦う方法を探していて、生成される登録コードが長いために非対称暗号化を使用したくない場合は、部分的なキー検証を参照することをお勧めします。

部分的な鍵検証により、違法な各鍵生成プログラムがソフトウェアの特定の1つのリリースに対してのみ機能することが確認されます。基本的には、ソフトウェアの各リリースが、登録コードのいくつかの数字をチェックするためのコードとのみリンクするようにすることです。正確にどの数字がランダムであるか、クラッカーはソフトウェアの多くの異なるバージョンをリバースエンジニアリングし、これをすべて1つのキージェネレーターに結合して、ソフトウェアのすべてのバージョンで機能するキージェネレーターをリリースする必要があります。

定期的に新しいソフトウェアバージョンをリリースする場合、これは、動作していないあらゆる種類のソフトウェア海賊版アーカイブに拡散する多数のキージェネレータにつながります。潜在的なソフトウェアの海賊は、通常、最新バージョンのクラックまたはkeygenを探しているため、それらのいくつかを試し、最終的にはあきらめるでしょう。

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

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


1
アイデアのように、異なるリリースで非対称暗号化に異なるパスワードを使用することもできます。
Priyank Bolia 2009

興味深いアイデアですが、とにかく長い登録コードの問題は何ですか?今日ではとにかく誰も手で入力することはありません-誰もがそれをコピーして貼り付けるので、10文字であっても100文字であっても違いはありません。
EMP

4
@Evgeny:これは、ユーザーがパワーユーザーである場合にのみ当てはまります。私たちは何年にもわたってシェアウェア/カジュアルゲームを作成してきましたが、ほとんどのユーザーはコピーして貼り付けることができないことをお伝えします。登録ウィンドウには、コピーと貼り付けの方法に関するマニュアルが付属しているだけでなく、読んだ後にそれが表示されないものもあります。
エイドリアングリ

うわー!ええ、まあ、あなたは明らかにこれより私よりも多くの経験を持っているので、私は議論することはできません、私は驚いたと言うことができます。ただし、コピーと貼り付けの方法がわからない場合、コードを200文字にして、非常に便利な一般的なコンピュータスキルを習得するようにしてください。:)
EMP

1
@Evgenyは:でも、短い登録コードで、我々はまだそのコードを誤って入力した人々からの電子メールの多くを持って、それゆえ、彼らはなるので、コードが有効でないことを考えない Aで、この数回のようなミスをしません行。私はITの指導を他の会社に任せることを好む... :-)
Adrian Grigore

16
  • オンライン更新を使用して、ライセンスのないコピーをブロックします。

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

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

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

  • これらの種類のトリックにあまり行き過ぎないでください。登録コードを確認している間、アプリケーションがクラッシュしたり、誤動作したりしないようにしてください。

  • ユーザーにとって有用なアプリを作成することは
    、クラッカーのために壊れないバイナリを作成することよりもはるかに重要です。


14

あなたはできる..

Microsoft SLPサービス InishTechのSoftware Potentialは、アプリケーションの機能に影響を与えずにコードを保護する機能を提供します。

UPDATE:(情報開示:Eazfuscator.NET上のI仕事)になり何マイクロソフトSLPサービスソフトウェアの潜在的に異なるコードを仮想化する機能があり、あなたは間違いなくそうすることができます。質問が最初に尋ねられてから数年が経過した。現在、次のような同様の基準で機能する製品がさらに利用可能です。


2
友人に価格を設定し、マイクロソフトからライセンスソフトウェアを購入するのは、通常のISVには高すぎる
Priyank Bolia 2009

私は試してみましたが、うまく機能しますが、アセンブリまたはプロジェクト全体ではなくメソッド内のコードのみを暗号化するため、クラッカーはILインジェクションを使用してプログラムのフローを簡単に変更できます
Mohsen Afshin

@ogggreベンダーリンクを追加する場合は、実際に接続を投稿で公開する必要があります。また、SLPSの現在利用可能なバージョン(は:Dで作業しています)はジェネリックをサポートしています。当然のことながら、すべてのソリューションには個々の長所と短所があり、evalだけが人々に対して適切にコンテキスト化できる
Ruben Bartelink

@MohsenAfshin私はあなたの言っていることが理解できません-ポイントは、ILの追加/削除/変更がライセンス違反を表すあらゆる方法を保護する必要があるということです。物事を仮想化することは自由ではないので、あなたが提案しているように「すべてを魔法のように保護する」ことは単に意味がありません。重要なポイントに戻る:SPの保護の目的は、敏感であることに基づいて選択したメソッドでのILの変更を防ぐことです(通常、植え付けを回避するためにノイズとして他のいくつかをこのビットをクラックする必要があります->記号) )
Ruben Bartelink 2014年

1
@RubenBartelink同意します。残念ながら、このスレッドは数ページのコンテンツがあるため大きすぎます。最初は新しい回答を追加したかったのですが、StackOverflowは既存の回答を拡張することをお勧めします。だから私はしました。私の小さな情報がお役に立てば幸いです。SLPSの一般的なサポートと修正に関する最新情報をお寄せいただきありがとうございます。
ogggre 2014年

10

.NET Reflectorは、基本的に「.NETコード」を意味する「マネージコード」のみを開くことができます。そのため、COM DLLファイル、ネイティブC ++、クラシックVisual Basic 6.0コードなどを逆アセンブルするためにそれを使用することはできません。コンパイルされた.NETコードの構造により、非常に便利で、移植性があり、発見可能で、検証可能です。.NETリフレクターは、これにより、コンパイルされたアセンブリを確認できますが、逆コンパイラと逆アセンブラは.NETに固有のものではなく、コンパイラが存在する限り存在します。

難読化ツールを使用してコードを読みにくくすることはできますが、.NETで解読できないようにせずにコードが逆コンパイルされるのを防ぐことはできません。マネージコードアプリケーションをネイティブコードアプリケーションに「リンク」すると主張している製品はいくつかあります(通常は高額です)が、これらが実際に機能しても、決心した人は常に方法を見つけるでしょう。

しかし、難読化に関しては、あなたが支払うものを手に入れます。したがって、コードが非常に独占的であるため、コードを保護するために非常に長い時間を費やす必要がある場合は、優れた難読化ツールにお金を投資することをいとわないはずです。

しかし、コードを書いた15年ほどの経験の中で、ソースコードを過度に保護することは時間の浪費であり、ほとんど利益がないことに気づきました。ドキュメント、コメントなどをサポートせずに、元のソースコードを読み取ろうとするだけでは、理解するのが非常に難しい場合があります。それに加えて、逆コンパイラーが思いつく無意味な変数名と、現代の難読化プログラムが作成するスパゲッティコードを追加します。


9

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

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

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

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

そして、クラッカーは典型的な手法について多くの経験を持ち、数歩先を行っているので、あまりにも多くの時間を無駄にしないでください。多くのリソースを使用したくない場合を除いて、おそらくプログラミング言語を変更します(Skypeを使用してください)。


ハードウェアロックのソフトウェア部分を攻撃することはかなり可能であることを忘れないでください。
Magnus Hoff、

はい、そうです。本当の選択肢は、アプリケーションを部分的にハードウェアに実装することです(たとえば、ソフトウェアとVHDLアプリケーションの奇妙な組み合わせ)。ただし、これもクラック可能です...
匿名の

公開鍵/秘密鍵戦略を実装するドングルについてはどうでしょうか。ドングルの秘密鍵だけがアプリケーションを復号化して実行できます。
mmcdole 2009

これがハードウェアキーが通常行うことです。しかし、あなたはドングルを攻撃することができます-それを複製するか、ドングルと話すことを担当するソフトウェア(回避、無効化など)です。
匿名

1
私の場合、それは本当に価値があった。部分キー検証を実装し、既存の製品の登録キースキームを変更した後、売上は大幅に増加しました。すべてのソフトウェアがクラックされる可能性があります。問題は、カジュアルなソフトウェア海賊の基準をどれだけ高くするかです。
エイドリアングリゴール

9

人々があなたのコードを実行できるようにしたいなら(そうしないなら、なぜそれを最初に書いたのですか?)、彼らのCPUがあなたのコードを実行できる必要があります。コードを実行できるようにするには、CPUがコードを理解できる必要があります。

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

ユーザーがコードを取得しないようにする方法は1つだけです。ユーザーにコードを渡さないでください。

これは、次の2つの方法で実現できます。サービスとしてのソフトウェア(SaaS)。つまりサーバーでソフトウェアを実行し、ユーザーにリモートアクセスのみを許可します。これは、たとえばStack Overflowが使用するモデルです。Stack Overflowがコードを難読化しないことは確かですが、逆コンパイルすることはできません。

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

または、何もしないこともできます。つまり、コードは著作権法によって自動的に保護されます。


8

残念ながら、これから逃げることはできません。あなたの最善の策は、コードをCおよびP / Invokeで記述することです。

小さなcatch-22があり、誰かがアプリケーションをCILに逆コンパイルして、検証/アクティブ化コード(たとえば、Cライブラリの呼び出し)を強制終了する可能性があります。Cで記述されたアプリケーションも、より永続的なハッカーによってリバースエンジニアリングされていることを覚えておいてください(最近のゲームのクラックの速さを見てください)。アプリケーションを保護するものはありません。

結局、それはあなたの家のようにうまく機能します、それを十分に保護して、それがあまりにも多くの努力(スパゲッティコードがここで役立つでしょう)とそして加害者があなたの隣の隣人に移動するだけです(競争:))。Windows Vistaを見てください。それを解読する方法は10通りあるはずです。

EXEファイルを暗号化し、ユーザーが使用を許可されたときに復号化するパッケージが世の中に存在しますが、これもまた、疑いなく解読された一般的なソリューションを使用しています。

アクティベーションと登録のメカニズムは、「平均的なジョー」を狙っています。それを回避するのに十分な技術に精通していない人(または、さらに言えば、バイパスできることを知っている人)です。クラッカーを気にしないでください、彼らは彼らの手にあまりにも多くの時間を持っています。


1
登録コードをdllにアウトソーシングするのが本当に面倒な場合は、DLLがソフトウェアの新しいバージョンごとに異なる必要があることを確認する必要があります。それ以外の場合は、人々があなたのソフトウェアをクラックすることをさらに簡単にします。彼らがする必要があるのは、DLLを一度クラックして、それ以降のすべてのバージョンで使用することです。エンドユーザーでも、古いひびの入ったDLLを見つけたらこれを行うことができます。これは、マネージコードに登録メカニズムを配置するよりもさらに悪いことです。
Adrian Grigore、

8

プロテクションの購入とは別に、あなた(またはあなたの開発者)はコピープロテクトを学ぶことができます。

これらはアイデアです:

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

次に、他のメソッドのCILに依存する方法で一部のコードを書き換えるテクノロジーを開発する必要があります。

仮想マシンを(まだ.NETでは)作成できます。そして、そこにコードを入れます。最終的に、仮想マシンはコードを実行する別の仮想マシンを実行します。これは、パフォーマンスをあまり低下させないための、めったに呼び出されない関数の一部です。

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


わかりませんでした。詳しく説明してください。
Priyank Bolia 09

7

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

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

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

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

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


11
「彼らがあなたのソフトウェアがどのように機能するかを本当に見たいのなら、彼らはそうするだろう」だけではありません。彼らが気にかけているなら、彼らはおそらく見ずに推測することができます。ソフトウェアの99.9%以上には、魔法のピクシーダストアルゴリズムがありません。プログラミングの難しい部分は、特別な秘密のテクニックではありません。すべてのパーツを整列させて機能させるだけです。
Ken

9
@ケン-しーっ!ほとんどの場合、マジックピクシーダストアルゴリズムを使用していないことを世界に知らせることはできません。
Justin Niessner、2010年

9
ジャスティン:愛は魔法のアルゴリズムとしてカウントされますか?愛が私のプログラムを特別なものにしてます。愛を分解することはできないと思います。
Ken

Babel.NETはもはや無料ではありません。ここでは、最も一般的な難読化ツール(無料および商用の難読化ツール)のリストを見つけることができます。
入出力

6

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

ただし、クラックできないものは何もないことに注意してください。サーバー側のソフトウェアのみが適切に保護されており、クラックできません。とにかく、アプリケーションのセキュリティレベルを高めるために、一部のクラッカーが「すべてではない」アプリケーションをクラックしないようにするいくつかの簡単な手順を実行できます。これらの手順は、これらのクラッカーを狂気にさせ、おそらく絶望的にします:

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

これらは、初心者や中間クラッカーがアプリケーションをクラックするのを防ぐための単純な方法です。アプリケーションを保護するためのアイデアが他にもある場合は、それらを実装するのをためらわないでください。それは単にクラッカーの生活を困難にし、フラストレーションを与え、最終的にはアプリケーションを離れます。

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

クラッカーのためにいくつかのおもちゃを実装してください...


5

ありますサラマンダー .NETフレームワークなしでアプリケーションをデプロイすることができRemotesoftからネイティブ.NETコンパイラおよびリンカーです、。私はそれがその主張にどれだけうまく生きているのか知りません。


答えは非常に簡単です。ほとんどの答えが難読化について話すのは残念です。難読化は、コードを調べようとする最初の(リフレクターのような)試行を停止するのに適しています。それは悪くない。そしてもちろん、SAASアプリケーションを作成する以外に、アセンブリコードを理解する実際のハッカーを阻止するものは何もありません(サーバーをハッキングしようと試みることさえできます)。しかし、C ++でコンパイルされたWin32 .exeとほぼ同じセキュリティ形式のアンコンパイルを提供するサラマンダー、.NET Reactorなどのツールが他にもあります。これらのツールのどれが最適であるか、私はまだ判断できません。
Philm 2013

5

マイクロソフトが解決策を考え出すことができれば、海賊版のWindowsバージョンがなくなるため、非常に安全なものはありません。Stack Overflowからの同様の質問をいくつか示します。それらを保護する独自の方法を実装できます。異なるバージョンをリリースする場合は、異なるバージョンに異なる手法を採用できるため、最初のバージョンがクラックされるまでに、2番目のバージョンが引き継ぐことができます。


5

.NET Reactor

更新

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

。ハッカーはあなたの情報源の理解しやすい形にアクセスできません。

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


3
私はいくつかの質問でそれらの人に連絡しようとしました、私は彼らの製品について持っていました、しかし彼らは決して返事をしませんでした。あなたは彼らの製品を試しましたか?私はスマートな組み立てを行ってきましたが、それらの製品とサポートの両方が非常に優れています。しかし、すでに質問で述べたように、難読化は1つの方法ですが、完全な証拠ではありません。
Priyank Bolia 2009

1
以前に製品に問題があり、groups.google.se / group / net-reactor-usersの高解像度アイコンについて質問しましたが、返信と修正がありましたが、今では難しいようですつかむ。悪いことに、それは素晴らしい製品であり、私はまだそれを使用しています
loraderon、2009

2
「既存のツールで逆コンパイルできない」場合、de4dot機能ページでサポートされている難読化ツール/パッカーとしてリストされているのはなぜですか?: bitbucket.org/0xd4d/de4dot
Jared Thirsk

おそらくそれは古い声明であり、彼らは彼らのウェブページを更新していません。私はもはや難読化ツールのユーザーではありません。
loraderon 2013年

de4dotは非常に強力なツールです。私はいくつかの難読化ツールに対してそれを試しました、そしてそれは素晴らしい仕事をします。ただし、.NET Reactor(v6.0)で保護されたファイルを処理することはできませんでした。たぶんde4dotは最新ではありません。
入出力

4

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


5
サーバーがダウンしているか、ユーザーが常にインターネットにアクセスできない場合、この方法では、アプリを使用するためだけにインターネットサーバーに頻繁に往復するだけで顧客を苛立たせます。
Priyank Bolia 2009年

私は完全に同意します。だから、私は最後の行で「これはおそらくあなたが望むよりも侵襲的だ...」と言った。私はOPに技術的に実現可能であると考えた最良のソリューションを提供しているだけであり、顧客を幸せに保つための最良のアプローチではありません:)
rmeador

2010年の第1四半期(この回答が書かれてから数か月後)に、ゲーム開発会社のUbisoftがこれを試しましたが、サーバー側コンポーネントの負荷が大きすぎて、ゲームをプレイできなかったようです。ソフトウェアの全体的な印象:「インストールが面倒で、オフラインで使用できず、侵襲的で信頼性が低い」。したがって、サーバー側の処理が適切であると判断した場合は、実際に要求に応じてスケーリングできることを確認してください。
Piskvorは

3

クライアントで実行されているものはすべて逆コンパイルおよびクラックされる可能性があります。難読化すると、さらに難しくなります。私はあなたのアプリケーションを知りませんが、99%の時間は努力の価値があるとは思いません。


3

アプリケーションを完全に保護することは不可能です。



2

ユーザーの99%以上は、実行可能ファイルを調べてその動作を確認することに関心がないことを覚えておいてください。

試行錯誤する人がほとんどいないことと、ほとんどの難読化者が回避できることを考えると、時間と労力をかける価値はありますか?

より多くの人々がそれを使いたいと思うようにあなたの製品を改善するために時間を投資する方が良いでしょう。


2

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


2

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


2

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

どちらも同じように非常に単純な答えを持っています。(明らかに)顧客などの信頼できない関係者にオブジェクトコードを渡さないでください。マシン上でアプリケーションをホストすることが可能かどうかは、それが何をするかにのみ依存します。

そうでない場合は、Webアプリケーション、多分あなたが許可することができSSHのアプリケーションサーバにXフォワーディングでログイン(またはリモートデスクトップ接続、私はWindows用、推測します)。

オタク系の人にオブジェクトコードを渡して、プログラムをクラックするのが楽しいと思われると、クラックされてしまいます。それを回避する方法はありません。

私を信じていない場合は、クラックや海賊版のない有名なアプリケーションを指摘してください。

ハードウェアキーを使用すると、生産コストが高くなり、ユーザーはそれを嫌います。ソフトウェアメーカーはあなたを信用していないので(私は想像します)、27の異なるUSBモノのプラグを差し込んだり抜いたりするのは、本当にうんざりです。

EXEを暗号化し、ユーザーが使用を許可されたときに復号化するパッケージが世に出ています。

もちろん、それを回避する方法は、 "trueが返されるように" can-I-use-it "テストをクラックすることです。

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


クラッシュポイントは簡単にデバッグできません。.NETのコードをオーバーライドして、そのチェックをバイパスします。また、.NETでオペコードをどのように変更しますか?これについて詳しく説明できますか?
Priyank Bolia 2009

ああ。私はCのトリックを念頭に置いていました。たとえば、検証関数のアドレスを取得し、そのchar配列の最初の10バイトを合計します(関数ポインターをキャストします)。関数fを選択し、[fのアドレスから前の合計を引いた値]をfptrに格納します。常にfを*(fptr +その合計)として呼び出します。"その合計"を
事前に計算する

2

優れたアプリケーションを作成し、シンプルな保護システムをコーディングするだけです。それはあなたがどの保護を選択するかは関係ありません、それは元に戻されます...だからあまり多くの時間/お金を無駄にしないでください。


2

.NETに関して言えば、Windowsフォームアプリケーション(またはクライアントがPortable Executableファイルを持っている任意のアプリケーション)をリリースしている場合、クラックされる可能性があります。

.NETを使い続け、ソースコードが取得される可能性を最小限にしたい場合は、Windowsフォームアプリケーションにするのではなく、Webサーバー全体にASP.NETアプリケーションとしてデプロイすることを検討してください。


2

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.