直接以二进制形式执行计算机指令

u8s*_*and 1 c binary assembly

在C.我需要一种在程序运行时直接执行计算机指令的方法.我知道如何以二进制编写指令的唯一方法是通过十六进制编辑器,然后将该文件作为应用程序运行.我如何使用程序编写二进制文件,然后从它们执行它而无需创建新的执行过程.看起来他们应该是一个简单的方法来做到这一点,但无论我在哪里,我都找不到它.

我能想到的另一种方法是通过内联汇编,但在我当前的项目中,这将是一个缺点,直接使用二进制执行是最好的方法.(这可能需要Windows上的驱动程序吗?如何在linux上执行?换句话说,跨平台方法会很好)

谢谢.

And*_*y S 5

你想做的是有点问题,很容易让很多人问"你为什么这样做?"

假设您的操作系统没有内存保护(这是非常罕见的),您只需将一个函数指向字节数组并调用该函数即可.这是它的要点:

unsigned char* code_to_execute = "\xB8\x13\x00\xCD\x10";
void (*runCode)();

runCode = code_to_execute;

runCode();
Run Code Online (Sandbox Code Playgroud)

但是,在做这样的事情时,有很多事情需要担心.你需要知道你的C编译器如何设置函数调用帧并尊重你的"二进制代码".以这种方式创建跨平台代码是不可能的.即使在单个平台上运行多个C编译器也很棘手.然后就是内存保护.大多数现代操作系统根本不会让您随意执行数据作为代码.您需要将内存明确标记为可执行文件,许多操作系统不允许您在没有特殊权限的情况下执行此操作.也没有跨平台的方法来做到这一点.

我想再次强调,这不是一个好主意.你最好使用内联汇编语言.或者更好的是,根本不要使用汇编语言.也许你可以解释一下你的项目以及为什么在你的C程序中直接编写"二进制代码"很重要.这将有助于我们制定一个可以帮助您的答案或建议.

  • 如果您很好奇,如果您可以编译DOS COM文件并在DOS中执行它,那么该示例代码实际上会起作用.它会将视频模式更改为320x200,256色.B8是"mov ax",1300是移动到ax的16位值.CD是"呼叫中断",10是VGA控制器的视频卡中断. (2认同)

old*_*mer 5

这个问题也许涵盖了这个主题

如何在 x86 汇编中编写自修改代码

不要让人们因为“你为什么要做这个问题”而放慢你的脚步......

您必须对语言或操作系统或两者有足够的了解,并突破保护系统或在保护系统内工作。然后就是将要执行的二进制文件(假设您已完成工作以使其位置独立和/或依赖于给定/找到/获取/任何内容的地址)放入内存中并分支到它。在 C 中,您可以声明一个函数指针,然后将地址分配给该函数作为该二进制文件的地址,然后调用该函数(如果您没有其他方法分支到地址,我通常更喜欢编写几行 asm 和将执行分支的它们链接到我传递 asm 的任何任意地址)。