在运行时创建可执行文件

时间:2010-02-15 15:00:40

标签: c# c++ c executable

好的,所以我想知道如何创建程序,创建第二个程序(就像大多数压缩程序可以创建自解压自解法一样,但这不是我需要的。)

说我有2个节目。每一个都包含一个类。我将使用一个程序来修改和填充数据类。第二个文件是一个程序,它也有类,但是空的,它的唯一目的是以特定的方式访问这些数据。我不知道,我在想是否序列化特定类,然后“注入”第二个文件。但是如何才能做到这一点呢?我发现修改已编译的文件非常有趣,但我从来没有能够进行不会导致错误的更改。

这只是一个想法。我不知道解决方案会是什么,这只是我想到的事情。

我更喜欢c或c ++中的跨平台信息。我唯一接受的另一种语言是c#。

我不是在寻找第三方派对,或者像Boost这样的东西。如果有任何正确方向的推动可能是我所需要的。

++也

我不想使用编译器。

Jalf实际上读了我写的内容

这正是我想知道该怎么做的。我认为上面提到的内容相当明显。我没有说过编译文件或编写脚本。

引用“我发现修改已经编译过的文件非常吸引人”

在发布之前,请先阅读并了解这个问题。

感谢。

7 个答案:

答案 0 :(得分:5)

从头开始构建可执行文件很难。首先,您需要为程序执行的操作生成机器代码,然后您需要将此类代码封装在可执行文件中。除非你想为一种语言编写一个编译器,否则这太过分了。

这些生成自解压可执行文件的实用程序并不能真正从头开始生成可执行文件。它们具有预生成的可执行文件,并且数据文件仅附加到它的末尾。由于Windows可执行格式允许您将数据放在文件的末尾,仅关注“真正的可执行文件”部分(exe标头告诉它有多大 - 其余部分被忽略)。

例如,尝试生成两个自解压zip,并对它们执行二进制diff。你会看到他们的第一个X KB字节完全相同,其余的是什么变化,根本不是可执行文件,它只是数据。执行文件时,它会查看文件末尾的内容(数据)并将其解压缩。

查看维基百科条目,转到外部链接部分深入挖掘: http://en.wikipedia.org/wiki/Portable_Executable

我这里只提到了Windows,但同样的原则适用于Linux。但是不要指望有跨平台的结果,你必须重新实现它到每个平台。我无法想象比可执行文件更依赖平台的东西。即使您使用C#,您也必须生成本机存根,如果您在Windows(在.net下)或Linux(在Mono下)运行,则会有所不同。

答案 1 :(得分:3)

使用程序生成的数据调用编译器(必要时将临时文件写入磁盘)和/或存储在磁盘上?

或者是关于编写本地可执行格式的详细信息?

答案 2 :(得分:3)

不幸的是,对于C,C ++,Java或C#等编译语言,您无法在运行时“运行”新代码,就像在PHP,Perl和ECMAscript等解释语言中一样。 。必须首先编译代码,为此你需要一个编译器。没有解决这个问题。

如果您需要在两个单独的EXE之间复制保存/恢复功能,那么最好的办法是创建两个程序之间共享的静态库,或两个程序之间共享的DLL。这样,您只需编写一次该代码,就可以使用任意数量的程序。

另一方面,如果你真的碰到这样的场景,我的主要问题是,你想用这个来完成什么?即使在支持eval()之类的语言的语言中,自修改代码通常也是一些你将要找到的最恶劣和最错误的东西。它甚至比使用GOTO完全编写的程序更糟糕。像这样有自我修改代码的用途,但99%的时候这是错误的方法。

希望有所帮助:)

答案 3 :(得分:1)

我有同样的问题,我认为this解决了所有问题。 您可以放置​​任何代码,如果正确,它将在运行时生成第二个可执行文件。

- ADD -

所以简而言之,你有一些代码,你可以硬编码并存储在你的第一个exe文件的代码中或放在它之外。然后运行它并编译上述代码。如果eveything正常,您将获得第二个可执行运行时编译。这一切都没有任何外部的库!!

答案 4 :(得分:0)

  

好的,所以我想知道会怎么样   去创建一个程序,那个   创建第二个程序

您可以查看CodeDomHere is a tutorial

答案 5 :(得分:0)

您是否考虑过在您的应用中嵌入Lua或Python等脚本语言?这将使您能够动态在运行时生成和执行代码。

来自wikipedia

  

动态编程语言是计算机科学中广泛使用的术语,用于描述一类高级编程语言,这些语言在运行时执行许多其他语言在编译期间可能执行的常见行为(如果有的话)。这些行为可以包括程序的扩展,添加新代码,扩展对象和定义,或者通过修改类型系统,所有这些都在程序执行期间完成。这些行为几乎可以用任何足够复杂的语言进行模拟,但动态语言提供了直接使用它们的工具。

答案 6 :(得分:0)

根据您所说的程序,Self-modifying code可能会有所帮助。

基本上,你在内存中的某个地方编写代码,好像它是普通数据一样,你可以调用它。 通常这是一个坏主意,但它很有趣。