exe内のconst変数の場所を知ることは可能ですか? サーバーからプログラムをダウンロードする各ユーザーがコードに埋め込まれた一意のキーを持つように、プログラムに透かしを入れることを考えていました。
これを行う別の方法はありますか?
exe内のconst変数の場所を知ることは可能ですか? サーバーからプログラムをダウンロードする各ユーザーがコードに埋め込まれた一意のキーを持つように、プログラムに透かしを入れることを考えていました。
これを行う別の方法はありますか?
定数として .net 型の GUID の文字列表現である透かしを使用してバイナリを構築できます。ビルド後、バイナリ ファイルで GUID 文字列を検索して、その場所を確認します。この GUID 値を別の GUID 値に変更してからバイナリを実行すると、コード出力で変更された値を実際に確認できます。
注:コンパイルされたバイナリをいじっているので、長さが非常に重要になるため、フォーマットは重要です。たとえば、GUID の先頭のゼロを保持して、すべてのインスタンスが文字列に変換されたときに同じ文字長になるようにする必要があります。
私は実際に、Win32 DLL や Sql Server 2000 Desktop exe でこの種のことを行いました。(バイナリのスイッチを切り替えることで、デスクトップ エディションを本格的な SQL サーバーに切り替えることができるハックがありました。)
その後、このプロセスは自動化され、DLL の新しいコピーは、クライアントのダウンロードごとにサーバー側の小さなユーティリティによってプログラムによって変更されます。
こちらもご覧ください:リンク
設定を .Net DLL に保存する方法について説明し、クラスベースのアプローチを使用してアプリ設定ファイルを埋め込み、コンパイル後に構成可能にします。
重要な考慮事項 #1: アセンブリ署名
アプリケーションを配布しているので、明らかに署名しています。そのため、バイナリ コンテンツを変更しているため、署名プロセスをダウンロード プロセスに直接統合する必要があります。
重要な考慮事項 #2:const
またはreadonly
多くの人が知らないconst
と変数の間には重要な違いがあります。readonly
特に、次のことを行う場合:
private readonly int SomeValue = 3;
...
if (SomeValue > 0)
...
次に、次のようなバイトコードにコンパイルされます。
ldsfld [SomeValue]
ldc.i4.0
ble.s
次のようにすると:
private const int SomeValue = 3;
...
if (SomeValue > 0)
...
次に、次のようなバイトコードにコンパイルされます。
{contents of if block here}
const
変数は、実行時にではなく、コンパイラによって置き換えられ、評価されreadonly
ます。変数は常に実行時に評価されます。これは、フィールドを他のアセンブリに公開する場合に大きなconst
違いをもたらします。変数への変更は、すべての依存アセンブリの再コンパイルを強制する重大な変更であるためです。
私のおすすめ
私はこの分野の専門家ではないので、透かしを入れるためのかなり簡単なオプションが 2 つあります。
最後に、Google は透かしソフトウェアに関する次の記事を報告しました。
C++ の場合 (例):
#define GUID_TO_REPLACE "CC7839EB7EC047B290D686C65F98E0F4"
printf(GUID_TO_REPLACE);
PHPで:
<?php
exec("sed -e 's/CC7839EB7EC047B290D686C65F98E0F4/replacedreplacedreplacedreplaced/g' TestApp.exe > TestAppTagged.exe");
?>
コンパイルしたバイナリをサーバーに貼り付ける場合は、php スクリプトにアクセスし、タグ付けされた exe をダウンロードして実行します...GUID ではなく「置換された」文字列が出力されることがわかります:)
置換された文字列の長さは元の文字列と同じでなければならないことに注意してください (この場合は 32)。短い文字列でタグ付けする場合は、長さを埋める必要があります。
const値の「場所」が何を意味するのかわかりません。確かに、リフレクションのようなアイテムを使用して、特定の型の const フィールドにアクセスできます。const フィールドは、同じアクセシビリティの他の非インスタンス フィールドと同様にバインドします。それがあなたの場所の定義に合っているかどうかはわかりません。