27

ハードコードされた文字列をバイナリから抽出することが可能であることを発見しました。
たとえば、プロパティビューProcess Explorerは、3文字以上のすべての文字列を表示します。私はそれがあると思い
alt textexeまたはdllで文字列を隠すには?

#ifndef _WIN32_WINNT 
#define _WIN32_WINNT 0x0501 
#endif 
#include <stdio.h> 
#include <tchar.h> 
#include <Windows.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5"); 
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever"); 
    for (int i= 0; i<argc; i++) { 
     if (0 == _tcscmp(argv[i],hiddenString1)) { 
      _tprintf (_T("The guid argument is correct.\n")); } 
     else if (0 == _tcscmp(argv[i],hiddenString2)) { 
      _tprintf (_T("Do something here.\n")); } 
    } 

    _tprintf (_T("This is a visible string.\n")); 
    //Keep Running 
    Sleep(60000); 
    return 0; 
} 

文字列が明確に対応する実行から抽出することができます:ここでは

は、私は単にそれをテストするために書いた簡単な実行可能ファイルのコードがあります少しでも弦を見つけるのは簡単です。

私の質問は以下のとおりです。

  1. どのように単に隠すhiddenString1またはhiddenString2 実行可能に?
  2. 秘密のコードを使用する方法は、 よりも安全ですか?
+1

この質問はGUIDに関するものか、一般的な文字列に関するものですか? – xtofl

+0

GUIDは単なる例でした。私はあまりにも非表示にしたいと思うhttp要求のためのURLがあります。 – Winz

+2

http要求のURLを非表示にすることはできません。スニファを持っている人なら誰でもあなたのアプリが何をしているのかを正確に知ることができます。そうすれば、あなたのプロセスのメモリを調べるよりはるかに簡単です。 –

答えて

26

防衛プログラミングの世界へようこそ。

いくつかのオプションがありますが、私はそれらのすべてがいくつかの難読化のフォームに依存していると信じています。完璧ではありませんが、少なくとも何かです。

  1. ストレート値の代わりに、テキストを他のバイナリ形式(16進数)で保存できます。

  2. アプリに保存されている文字列を暗号化し、実行時に復号化することができます。

  3. コード内のさまざまなポイントに分割し、後で再構成することができます。

またはそれらのいくつかの組み合わせ。

実際のバイナリを見るよりも、いくつかの攻撃が進んでいることに注意してください。場合によっては、実行中にプログラムのメモリアドレス空間を調査することもあります。 MSはSecureString in .Net 2.0と呼ばれるものを思いついた。目的は、アプリケーションの実行中に文字列を暗号化しておくことです。

第4のアイデアは、アプリケーション自体に文字列を格納するのではなく、制御するサーバーに送信する検証コードに依存することです。サーバー上で、正当な "チートコード"かどうかを確認することができます。

+2

良いオプション。質問者は、WindowsのGUID文字列(16進数)を隠すことに特に関心を持っているため、データを数行の整数として格納することもできます。 –

+0

リンクが動作しない – user956584

+1

@Userpassword:updated link – NotMe

6

Chrisには、ハッシュアルゴリズムを使用することもできます。正しいIDが指定されているかどうかを確認するだけであれば、プログラムにID全体を格納する必要はありません。

  • 比較したい文字列/ password/idのハッシュ(MD5、SHAなど)を作成します。多分 'salt'値を追加してください。プログラムにこれを格納する
  • プログラムを実行するときは、入力文字列/ password/idに対して同じアルゴリズムを実行し、2つのハッシュを比較して一致するかどうかを確認します。

このようにして、実際のテキストはプログラムに格納されず、ハッシュアルゴリズムが一方向のみであるため、プログラムをリバースエンジニアリングして元のテキストが見つかったわけではありません。

+0

注意、いくつかのハッシュ(例:md5)は最近比較的簡単に見つかります。 –

+0

私はこの使用のために問題があるとは思っていません。 –

+1

さらに進むことができ、パブリックキー暗号化取引の公開鍵のみの側で行うことができます。衝突の問題を処理します。これはまた、暗号化アルゴリズムが16進エディタを介して掘り出された後であっても、それを安全に実行するための安全な方法の1つです。 –

9

最も簡単な方法は、xorやrot-13のような簡単な方法で暗号化し、使用時に即座に復号化することです。それは彼らのカジュアルな視聴を排除しますが、逆転に多くの経験を持つ人を止めることはありません。

+6

逆に多くの経験を持っている人は誰も止めることはできません; – n3rd

+2

プログラムを実行するためにメモリ内に復号鍵が必要なので、AESはそれらを停止することもありません。 –

2

特定の文字列が表示されないようにするには、その文字列を暗号化して実行時に復号化します。

const GUID SecretGuid = 
     { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } }; 
2

すべてのあなたの秘密のコードがGUIDのだろうか、単に一例ということであった:あなたは人々があなたのGUIDを表示したくない場合は

、その文字列から構築されたのではなく、バイトからそれを構築しますか?

おそらくバイナリGUIDとしてあなたの秘密を格納します。

const GUID SecretGuid = 
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } }; 

次に、あなたの供給GUIDは、文字列からバイナリ形式に変換して、2つのバイナリGUIDを比較します。

+0

GUIDは単なる例でした。私が隠したいと思っているHTTPリクエストのURLもあります。 – Winz

+7

あなたのexcutableで文字列を探す知識を持っているすべての人は、スニッファを起動し、あなたのアプリからHTTP-Requestを見ることができます。実際には、まず文字列を探す前にスニファを試してみましょう。 –

16

には多くの方法があります。のデータは実行可能です。他の人たちより優れた解決策を投稿した人もいます。私はそのリストに追加しません。

ただ、注意してください:それはすべてのいたちごっこだ:それは誰もがあなたの「秘密」を見つけるしないことを不可能に保証です。

どのような暗号化やその他のトリックを使用しても、どのくらいの努力やお金を入れても問題ありません。どれほど多くの "NASA/MIT/CIA/NSA"タイプがそれを隠していても関係はありません。

それはすべてがダウンして、単純な物理学に来る:
それはどのユーザーのために不可能であった場合は、実行ファイルからあなたの秘密を引き出し、その後、コンピュータはどちらかそれを再表示することができないであろう「再表示」へとあなたのプログラムはそれを使用することができません。十分なインセンティブを持つ適度に熟練した開発者は、秘密を再現する方法を見つけるでしょう。

実行可能ファイルをユーザーに渡した瞬間、秘密を知るために必要なものはすべてあります。

あなたが望むことができる最善のことは一生懸命任意の利点は、あなたが面倒な価値はないになる秘密を知っているから得ることができるという秘密を明らかにすることです。

したがって、データが公開されていないか、公開された結果が「不便」に過ぎない場合は、データを隠すようにしても問題ありません。しかし、あなたのプログラム "あなたのマスタークライアントデータベースへのパスワード"、秘密鍵、またはその他の重要な秘密を隠すことさえ考えないでください。あなたはできません。

プログラムに何らかの形で必要な秘密情報がありますが、秘密鍵などの公開情報になってはいけない場合は、自分の管理下にあるリモートサーバーとプログラムを話して、適切な認証を適用する必要があります()承認された人またはコンピュータだけがサーバに要求を行うことができることを確認し、そのサーバに秘密を保持して使用させるようにしてください。

+1

うーん。そして、本当のクラッカーはかなり恐ろしいです、あなたは小さなトリックでそれらを止めることができません。彼らは文字列で再生するホットスポットに気づくでしょうし、アプリケーションを実際に見て解読するために辛抱強くアプリケーションに気づくでしょう。 – toto

2

あなたが行うことができる最善の方法は、パスワードまたは文字配列として非表示にする他の文字列をコード化することです。たとえば:

std::string s1 = "Hello"; // This will show up in exe in hex editor 
char* s2 = "World"; // this will show up in exe in hex editor 
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor. 
+1

Cの 's3 [] = {'G'、 'O'、 'D'}のこの単純なプログラムでは、 int n = sizeof(s3)/ sizeof(s3 [0]); printf( "%d \ n"、n); 'は、16進エディタ - >' .D $ .G.D $ .O.D $ .D.D $ .'のテキストをビルド実行可能ファイルに格納します。 – Tuksn

5

私はあまりにも非表示にしたいhttp要求のためのURLがあります。

アプリがリクエストを行っている場合は、これを隠すことはありません。フィドラー、httpアナライザーなどのアプリを実行すると、数多くの無料で簡単に利用できるメソッドの1つに、アプリが作成しているすべてのトラフィックが表示されます。

+0

それは本当に悪いです。 : –

+0

@ ZeeshanMahmoodどの部分? – CaffGeek

+0

これは、コードでURLを非表示にすることはできません。これらは公開されます。 –

関連する問題