相关疑难解决方法(0)

如何将二进制数据添加(和使用)到已编译的可执行文件?

有几个问题涉及这个问题的某些方面,但似乎都没有完全回答它.整个问题可归纳如下:

  • 你有一个已编译的可执行文件(显然希望使用这种技术).
  • 你想为它添加一个任意大小的二进制数据(不一定是它自己,这将是另一个令人讨厌的问题).
  • 您希望已编译的可执行文件能够访问此添加的二进制数据.

我的特定用例是一个解释器,我想让用户能够用解释器二进制文件和他提供的代码生成一个单独的文件可执行文件(解释器二进制文件是必须用它修补的可执行文件).用户提供的代码作为二进制数据).

类似的情况是自解压存档,其中程序(存档实用程序,如zip)能够构造这样的可执行文件,其中包含预构建的解压缩程序(已编译的可执行文件)和用户提供的数据(内容)存档).显然,此过程中不涉及编译器或链接器(感谢,Mathias为注释并指出7-zip).

使用现有问题,解决方案的特定路径如下所示:

将数据附加到exe - 这涉及向任意exes添加任意数据的方面,而不涉及如何实际访问它(基本上简单的追加通常有效,对于Unix的ELF格式也是如此).

在没有/ proc/self/exe的情况下查找当前可执行文件的路径 - 与上述相同,这将允许获取用于打开exe的文件名,以访问添加的数据.还有更多这类问题,但是它们都没有特别关注获得适合于实际将二进制文件作为文件打开的目的的路径问题(单独的目标可能(?)更容易实现 - 真的你不要甚至不需要路径,只是打开阅读的二进制文件.

除了填充二进制文件并打开文件以进行读取之外,还可能存在其他可能更优雅的方法.例如,可执行文件可以使得以后使用任意大小的数据对其进行修补变得相当简单,因此它它出现在某个正确的数据段"内"?(我真的找不到任何东西,对于固定大小的数据,它应该是微不足道的,尽管除非可执行文件有一些哈希值)

这可以做得相当好,与标准C的偏差尽可能小吗?甚至或多或少的跨平台?(至少从维护的角度来看)请注意,如果执行二进制数据添加的程序不依赖于编译器工具(用户可能没有),那么首选,但是需要这些工具的解决方案也可能有用. .

请注意已经编译的可执行标准(上面列表中的第一点),这需要一种完全不同于C/C++与GCC之类的问题中描述的解决方案:静态地将资源文件添加到可执行文件库SDL嵌入图像内部的程序可执行文件中,要求嵌入数据编译时.

补充说明:

上面列出并在一些注释中提出的明显方法的问题,即只是附加到二进制文件并使用它,如下所示:

  • 打开当前正在运行的程序的二进制文件似乎并不简单(打开可执行文件进行读取,但没有找到提供给文件打开调用的路径,至少不是以合理的跨平台方式).
  • 获取路径的方法可以提供可能不存在的攻击面.这意味着潜在的攻击者可以欺骗程序以查看可执行文件实际具有的不同二进制数据(由他提供),从而暴露可能存在于数据解析器中的任何漏洞.

c exe elf portable-executable

7
推荐指数
1
解决办法
1435
查看次数

获取exe文件夹路径的最佳方法?

我在另一个论坛上找到了这个,应该可以给你。但我认为这可能不是最好的方法,而且我认为它会由于数组未被删除而导致内存泄漏。这是真的?

这也是最好的方法吗?最好的方法是直接提供文件夹目录的跨平台命令(如果不存在则使用 Windows)。

std::string ExePath() 
{
    using namespace std;

    char buffer[MAX_PATH];

    GetModuleFileName(NULL, buffer, MAX_PATH);

    string::size_type pos = string(buffer).find_last_of("\\/");

    if (pos == string::npos)
    {
        return "";
    }
    else 
    {
        return string(buffer).substr(0, pos);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
1
解决办法
6682
查看次数

C程序,打印其可执行文件名

假设源代码文件名是test.cpp.编译时,它会生成test.exe文件.当我执行它时,它应该识别它的文件名test.exe并打印它.

我可以使用以下代码获取当前目录中存在的所有文件和目录的列表:

DIR * directory;
struct dirent * direct;
direct = readdir(directory);
Run Code Online (Sandbox Code Playgroud)

但是,如何识别相关的文件名,在这种情况下是哪个"test.exe"

c c++

5
推荐指数
3
解决办法
6731
查看次数

C++:ofstream类将文件保存到哪里?

我从Windows迁移到Mac,现在我遇到了文件输入/输出类的问题:ifstream&ofstream.

在Windows中使用g ++ /代码块运行时

ofstream out("output.txt");
out << "TEST";
out.close();
Run Code Online (Sandbox Code Playgroud)

将在同一目录中创建一个新文件"output.txt" .

但是在MAC OS X中,此文件是在我的主目录中创建的:/Users/USER_NAME/output.txt

如何将此文件与可执行文件一起放在同一目录中?

PS我正在使用GCC和CodeBlocks.没有项目 - 我只是编译一个源文件.

c++ io macos file codeblocks

4
推荐指数
1
解决办法
1万
查看次数

在编写便携式c/c ++程序时,使用外部文件的最佳方法是什么?

我对c/c ++场景很陌生,我已经在虚拟机上用勺子喂了太长时间.

我正在修改我们在整个公司使用的现有C++工具.该工具正在所有主要操作系统(Windows,Mac,Ubuntu,Solaris等)上使用.我正在尝试使用另一个编写Java的工具来桥接该工具.基本上我只需要从C++工具中调用java -jar.

问题是,我怎么知道jar在用户计算机上的位置?c ++可执行文件当前被检入Perforce,用户同步然后调用exe,可能会将exe留在原位(尽管他们可以将其复制到其他地方).我当前的解决方案检查exe旁边的jar文件.

我已经看过多种方法来计算来自C++的exe的位置,但它们似乎都不是可移植的.在Windows上有一个'GetModuleLocation',在posix上你可以查看procs/process.exe信息来确定进程的位置.在大多数系统中,您可以查看argv [0]以确定exe的位置.但是由于用户使用$ PATH,符号链接等来调用exe,因此大多数这些技术都是100%保证的.

那么,任何关于正确的方法的指导总能奏效吗?我想如果有多个解决方案我没有问题,但似乎应该有更优雅的方式来做到这一点.

c c++

3
推荐指数
1
解决办法
264
查看次数

如何在 gcc 编译器的 c/c++ 中获取正在运行的可执行文件名称

我的目的是使用相同的代码在每个平台(Windows、Mac Os x、Linux)中获取正在运行的可执行文件的名称。

每个平台都有单独的代码来查找可执行文件的名称。

在Windows中有GetModuleFileName()获取可执行文件名称的函数,但它可以在Visual Studio上使用。

我还用来argv[0]获取当前可执行文件的路径。

我正在使用gcc编译器,我需要生成适用于所有平台(Windows、Mac Os x、Linux)的代码来获取正在运行的可执行文件的名称。

c c++ gcc

1
推荐指数
1
解决办法
2402
查看次数

标签 统计

c++ ×5

c ×4

codeblocks ×1

elf ×1

exe ×1

file ×1

gcc ×1

io ×1

macos ×1

portable-executable ×1