2

私はいつも、C++ プロジェクトをコンパイルしてリリースを構築するという習慣を持っています。私は常に .EXE を 16 進エディタ (通常は HxD) で開き、バイナリ情報を確認します。

私が最も嫌いで解決策を見つけようとしているのは、文字列テーブルのどこかに関連する (少なくとも私の観点からは) 情報が提供されているという事実です。他の人にとっては、これは統合失調症の強迫観念のように聞こえるかもしれませんが、実行可能ファイルに、たとえば、アプリケーションで使用されるすべての Windows 関数の名前が含まれているのが好きではありません。

多くのコンパイラを試して、どのコンパイラが最も情報量が少ないかを調べました。たとえば、GCC は、生成されたすべての最終的な exe にこれらすべてを残します。

libgcj_s.dll._Jv_RegisterClasses....\Data.ald.rb.Error.Data file is corrupt!
....Data for the application not found!.€.@.ř.@.0.@.€.@.°.@.p.@.p.@.p.@.p.@.
¸.@.$.@.€.@°.@.std::bad_alloc..__gnu_cxx::__concurrence_lock_error.__gnu_cxx
::__concurrence_unlock_error...std::exception.std::bad_exception...pure virt
ual method called..../../runtime/pseudo-reloc.c....VirtualQuery (addr, &b, s
ize of(b))............................/../../../gcc-4.4.1/libgcc/../gcc/conf    
ig/i386/cygming-shared-data.c...0 && "Couldn't retrieve name of GCClib share
d data atom"....ret->size == sizeof(__cygming_shared) && "GCClib shared data
 size mismatch".0 && "Couldn't add GCClib shared data atom".....-GCCLIBCYGMI
NG-EH-TDM1-SJLJ-GTHR-MINGW32........

ここでは、使用したコンパイラとバージョンを確認できます。数行下に、CreateMainWindow、GetCurrentThreadId など、使用したすべての Windows 関数のリストが表示されます。

これを非表示にしたり、暗号化したり、難読化したりする方法はあるのだろうか。

Visual C++ では、この情報は公開されません。代わりに、7 と XP のような 2 つの Windows システム間でさえ、C++ ランタイム、フレームワーク、または VC++ でコンパイルされたプログラムが必要とするものを必要としない GCC ほどクロスプラットフォームではありません。さらに、VC++ 実行可能ファイルには、アプリケーションで使用される Windows 関数へのプロシージャ エントリ ポイントも含まれています。

たとえば、NASMでさえ、呼び出されたWindows関数の名前を保存することを知っているので、Windowsの問題のようです。しかし、おそらくそれらは暗号化されているか、表示されないようにするためのトリックがあります.

GCC ソース コードを調べて、実行可能ファイルに保存するように指定された文字列がどこにあるかを確認します。おそらく、その命令をスキップしたり、何かしたりすることができます。

これは私の最後のパラノイアの 1 つであり、何らかの方法で治療できる可能性があります。ご意見とご回答ありがとうございます。

4

2 に答える 2

2

でコンパイルすると-nostdlib、GCC のものはなくなりますが、C++ サポートと std::* の一部も失われます。

Windowsでは、リンクするだけのアプリケーションを作成でき、LoadLibrary実行GetProcAddress時に必要な残りの機能を取得できます(機能の名前は暗号化された形式で保存でき、GetProcAddressに渡す前に文字列を復号化します)これを行うは大変な作業であり、Windows ローダーはおそらくコードよりも高速であるためGetLastError、 やのような単純な関数を呼び出しているという事実を難読化するのは無意味に思えますCreateWindow

于 2012-06-26T01:57:49.690 に答える
1

Windows API 関数は、kernel32.dll などの dll からロードされます。読み込まれた API 関数のメモリ アドレスを取得するために、dll からエクスポートされた関数名のテーブルが検索されます。したがって、これらの名前の存在。

LoadLibrary で参照する Windows API 関数を手動で読み込むことができます。GetProcAddress を使用して関数のアドレスを検索し、難読化された形式で格納されている関数名を調べることができます。または、各関数の「序数」(dll 内の各関数を識別する数値) を使用することもできます。このようにして、API 関数を呼び出すために使用する一連の関数ポインターを作成できます。

しかし、本当にきれいにするには、デフォルト ライブラリのリンクをオフにして、コンパイラによって暗黙的に使用される C ランタイム ライブラリのコンポーネントを置き換える必要があるでしょう。ただし、これを行うのは面倒です。

于 2012-06-26T01:58:39.287 に答える