3

我正在寻找程序示例,该程序修改其 exe 中的字符串。

我在 Windows 下使用 C++、Visual Studio。

我在 Windows 中搜索了工作示例,但找不到任何工作代码。

我需要简单的代码,它将向用户询问字符串:

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

并且代码应该重写:

string strTest = "";

要对该键入的用户进行字符串化:

string strTest = "SomeStringFromUser"; 

在 C++ 中,如何将字符串(从字符串 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 中的开始位置。
  • 添加这两个数字以获取 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 回答