2011-02-16 8 views
3

私たちはexeを持っていると言えば、すぐにアセンブリに変換できますか?ソフトウェアの作成者がこれを防ぐ/妨げる方法はありますか?すべてのプログラムをアセンブリに変換できますか?

+3

ジアアセンブリを意味しますか? – moatPylon

+0

related:[Windows .exeを「逆コンパイル」できますか?または少なくともアセンブリを表示しますか?](http://stackoverflow.com/questions/273145/is-it-possible-to-decompile-a-windows-exe-or-at-least-view-the-assembly) –

+0

彼はexeを分解して値を変更し、それを元に戻すことを意味します。 –

答えて

2

一言で言えば、ちょうどあなたがそれらを与える本を読んで分析することを防ぐことができないように。

4

実行可能ファイルは、コンピュータプロセッサによって実行されるように設計されています(したがって、名前)。アセンブリ言語は、コンピュータプロセッサが実行するマシンコードの上にあるレイヤーです。プログラムを機械コードとして実行できる場合は、アセンブリとして読み取ることができます。

おそらく、次のような状況があります。独自のC/C++書込みプログラムがクライアントに配布されています。クライアントの中には正直な意図がありません。プログラムをアセンブリに逆コンパイルしたり、プログラムの悪意のある使用を防止したり、プログラムの試用版を無期限に拡張したりするなどの指示を変更してから、プログラムを再コンパイルします。

この場合、または同様の場合、実行されていないすべてのプログラムが単にディスク上のデータであることを認識する必要があります。誰でもそのデータを読んで好みのものに変更することができます。これが本当に問題であれば、プログラムを保護するもう1つの方法、例えば重要なロジックを実行して結果を返すWebサービスに委任するなどの方法を考えなければなりません。その一例:自分のウェブサーバ上で動作するGoogleの検索アルゴリズムです。どのように動作するのか正確にはわかりません。

+0

私は自分のコードを「保護する」ことを意図していません。私はフリーソフトウェアの動きをサポートしているので、私のソースコードはとにかく分かります:) – LarryTheCat

+0

Larry、私もフリーソフトウェアの動きをサポートしていますが、お金はどこかから来なければなりません。 ;)あなたがこのような問題を抱えていれば、私は全く異議を唱えていないでしょう。 –

2

「変換された」とは、コンパイルされたことを意味し、それはマシンコードにコンパイルされたことを意味します。任意のボックスで実行されるコードのすべてのビットがマシンコードとして実行されています。特定の言語については、ランタイムライブラリが不要なスタンドアロンの実行可能ファイルを作成するためのツールが存在するかどうかによって答えが異なります。

「変換済み」とは、アセンブリで手動でコーディングすることを意味する場合は、他の回答を参照してください。コードを書くのに非常に時間がかかるので、私たちはそれをしません。

難読化に関しては、最初の段落で言及した変換/編集は実際にはこれでは機能しません。 JavaやC#のようなものを "コンパイル"すると、ソースはランタイムライブラリへの多くのポインタに変換されます。これらのポインタは簡単にリバースエンジニアリングすることができ、元のコードが再生成されます。

6

いいえプログラムは、理解できる場合にのみシステムで実行できます。理解できれば、おそらくアセンブリコードに直接変換可能なマシンコードになっているはずです。

あなたができることは、難読化されたバイナリを可能な限り理解しにくくするために、難読化メソッドを使用することです。

http://en.wikibooks.org/wiki/X86_Disassembly/Code_Obfuscation

編集:時間と十分なリソースで、当然のことながら、それを追加したい、誰かが最終的にあなたの難読化コードを読み取る方法を見つけ出すだろう。やむを得ないことだ。難読化は、リバースエンジニアリングをできるだけ不便なものにして、それを追い求める価値がないようにすることです。リバースエンジニアリングを悪くしたい人だけがそうします。

1

私はこれまでのところ、マラナスは最高の答えを持っていると思いますが、いくつかの条件でプログラムを逆アセンブルすることができると思います。最初にそれをこのように考えてください。実際に実行可能な場合は、プロセッサによって意味が実行されます。そうすれば、プロセッサが行うことと全く同じ方法でバイナリを解析することができます。つまり、すべてのビットとバイトを解析し、人間が読める形式のascii /アセンブラに変換します。これは、プログラムを実行できる場合には常に可能です。

あなたが持っているものがすべて.exeファイルであることを防ぐことができるものがありますか、確かに、多くのものとマラナスはそれらのいくつかにリンクされている回答、例えば暗号化です。ハードウェアやユーザーのパスワードなど、.exeファイルに含まれていないものがある場合は、それを把握することができず、ゲームオーバーです。

何年もかけて逆アセンブラを書くと、私は別のトリックを見たことがあります。たとえば、Michael AbrashのAssembly of Zenを読んだ場合、8088/86のプリフェッチャについてのディスカッションでは、あるプロセッサに別のプロセッサを伝える方法があると思いますが(これはキャッシュの前にあったことを覚えておいてください)、ハッカーを倒すたとえば、次の命令を1つの命令に変更させて、それを増やして言うことができます。これは、2番目の命令がすでにフェッチされパイプに入っていたため完全に実行されるため、変更された命令はメモリ内にしかないので、変更されていない命令が実行されます。もちろん、これは命令がラムで修正されているときに一度だけ実行されたコードである必要がありました。これがしたことは、デバッガが修正された命令を実行してクラッシュするなどの理由で、デバッガでコードをシングルステップで実行することを止めさせてしまったことです。逆アセンブラがプログラムをシミュレートしようとしていて、ハードウェアが再び動作する方法を説明しなかった場合、あなたは雑草につながるでしょう。私はまた、ゼロの直後にブランチが続き、無条件ブランチと同じである(ブランチが本当にゼロでなければならないと仮定して)ブランチが続いているという使用を見てきました。ディスアセンブラが作動不能になる原因になります。これを動作させるには、可変長の命令セットが必要です。人間が何が起こったか把握することは困難ではなく、命令ではなく、自動化されたツール(シミュレータではない)にとってより困難なデータワードを避けるために、分解プロセスを手作業で調整する。あなたのプログラムがプロセッサーによって実行されるならば、結局、マシンコードを人間が読めるアセンブラー形式に戻すことができます。はい、実行可能ファイルだけを見ているディスアセンブラには秘密または明白でないハードウェア機能を使用して、特に逆アセンブリを防止できるハードウェア機能を使用して、できることがあります。ユーザがハードウェア上でプログラムを実行する能力を持っていれば、セキュリティ対策を無効にして逆アセンブルする可能性があります。

関連する問題