3

exe内の文字列を変更するプログラムの例を探しています。

私はWindowsでC++、VisualStudioを使用しています。

Windowsで動作例を検索しましたが、動作するコードが見つかりません。

ユーザーに文字列を要求する簡単なコードが必要です。

string strTest = "";
(if strTest != "")
{
   cout << "Modified: " << strTest << endl;
}
cin >> strText;

そして、コードは書き直す必要があります:

string strTest = "";

その型付けされたユーザーを文字列化するには:

string strTest = "SomeStringFromUser"; 

C ++では、文字列(string strTest = ""から)をユーザーが入力した文字列にどのように変更しますか?(たとえば、strTest = "foo")?

4

3 に答える 3

14

EXEがWindowsマシンで実行されている場合、exeファイルはオブジェクトとして開いたままになり、CreateFileMappingページはREADONLYまたはCOPY_ON_WRITEとしてマークされます。

したがって、exeがそれ自体に書き込む場合、ファイルは変更されません。スワップファイルに裏打ちされた新しいページを作成するだけです。ただし、ファイルは開いたままなので、他の誰もEXEファイルを開いて書き込むことはできません。

ページ保護をハッキングしてCOPY_ON_WRITEをオフにする以外に、これが可能かどうかはわかりません。これを行うために私が考えることができる唯一の方法は、exeが終了して.exeファイルを開き、それに書き込む後に実行される小さなプログラムを作成することです。

私はあなたが何をしようとしても、それを回避するためのより良い方法があると信じなければなりません。

- - 後で - -

はい、わかりました。あなたはあなたのexeに透かしを入れようとしています。これが、exeが起動する前にインストーラーで行うのが非常に簡単なことです。ただし、.exeが実行されると、実行が非常に困難になります。

これが私がすることです。

  • 必要なサイズのグローバル文字列変数を宣言します。const char g_szWatermark[100] = "";
  • exeをビルドしてから、マップファイルを調べて、そのセグメント内の変数のアドレスを見つけます(C ++の名前の装飾について覚えておいてください)。
  • EXEヘッダーを解析して、exeのどこからセグメントが始まるかを見つけます。
  • これらの2つの数値を追加して、exeファイル内の文字列の場所を取得し、この数値をインストーラーに渡します
  • インストーラーに、ユーザーに情報を要求し、それを.exeに書き込む小さなプログラムを実行させます。注:exeを実行する前にこれを行う必要があります。そうしないと、機能しません。
于 2009-12-23T18:21:32.410 に答える
2

いくつかのオープンで確立された暗号化メカニズムに基づくライセンススキームは、最も堅牢なソリューションになります。標準のPKIを使用するものは、自己変更コードを実装しようとするよりもはるかに単純で安全なはずです。

正直なところ、コピー防止を作成するための研究開発に多額の費用を費やしている企業はたくさんあり、それらのシステムはリリースから数日以内にクラックされます。したがって、クラッカーを阻止しようとしている場合は、長く困難な道のりがあります。

正直な人を正直に保ちたいだけの場合は、GUIDを「ライセンスキー」として使用する単純なオンラインアクティベーションが非常に効果的です。

于 2009-12-23T18:45:43.577 に答える
0

これはどう:

#include <string>
#include <iostream>

int main()
{
    std::string strTest = "";
    std::getline(std::cin,strTest);

    if (strTest != "")
    {
        std::cout << "Modified String: " << strTest << "\n";
    }
    else
    {
        std::cout << "Not modified\n";
    }
 }
于 2009-12-23T19:59:56.720 に答える