2

exe内のconst変数の場所を知ることは可能ですか? サーバーからプログラムをダウンロードする各ユーザーがコードに埋め込まれた一意のキーを持つように、プログラムに透かしを入れることを考えていました。

これを行う別の方法はありますか?

4

4 に答える 4

3

定数として .net 型の GUID の文字列表現である透かしを使用してバイナリを構築できます。ビルド後、バイナリ ファイルで GUID 文字列を検索して、その場所を確認します。この GUID 値を別の GUID 値に変更してからバイナリを実行すると、コード出力で変更された値を実際に確認できます。

注:コンパイルされたバイナリをいじっているので、長さが非常に重要になるため、フォーマットは重要です。たとえば、GUID の先頭のゼロを保持して、すべてのインスタンスが文字列に変換されたときに同じ文字長になるようにする必要があります。

私は実際に、Win32 DLL や Sql Server 2000 Desktop exe でこの種のことを行いました。(バイナリのスイッチを切り替えることで、デスクトップ エディションを本格的な SQL サーバーに切り替えることができるハックがありました。)

その後、このプロセスは自動化され、DLL の新しいコピーは、クライアントのダウンロードごとにサーバー側の小さなユーティリティによってプログラムによって変更されます。

こちらもご覧ください:リンク

設定を .Net DLL に保存する方法について説明し、クラスベースのアプローチを使用してアプリ設定ファイルを埋め込み、コンパイル後に構成可能にします。

于 2009-08-14T04:13:38.857 に答える
1

重要な考慮事項 #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 つあります。

  1. 埋め込まれたスプラッシュ スクリーンまたは [About] ボックスのロゴ画像に透かしを入れます。
  2. 文字列リソースを読み込むための対称キーに透かしを入れます。キャッシュを保持して、一度デコードするだけでパフォーマンスの問題が発生しないようにします。これは、一般的に使用される難読化手法に適用される変数です。文字列は、UTF-8 でエンコードされた文字列としてバイナリに格納され、新しい文字列の null で終わる長さがバイナリで現在検出されている文字列の長さ以下である限り、インラインで置き換えることができます。

最後に、Google は透かしソフトウェアに関する次の記事を報告しました。

于 2009-08-15T16:04:50.897 に答える
1

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)。短い文字列でタグ付けする場合は、長さを埋める必要があります。

于 2009-08-15T15:34:31.317 に答える
0

const値の「場所」が何を意味するのかわかりません。確かに、リフレクションのようなアイテムを使用して、特定の型の const フィールドにアクセスできます。const フィールドは、同じアクセシビリティの他の非インスタンス フィールドと同様にバインドします。それがあなたの場所の定義に合っているかどうかはわかりません。

于 2009-08-14T04:08:39.100 に答える