内联ASM jmp到新内存

时间:2011-06-15 15:23:20

标签: c++ inline-assembly

所以我想从文件中加载一组汇编指令,并执行这些指令。

OR

我想从文件(非exe)

再次加载已编译的机器代码

我的想法:

到目前为止,我已经学会了足够的内联asm来轻松使用c / c ++变量。

  asm volatile (
    "mov     %1, %%ecx;" // yes unnecessary, I know
    "add     %2, %%ecx;" // I know they're already loaded in a register
    "mov     %%ecx ,%0 ;"// just demonstrating what I've learned
    :"=r"(address)
    :"r"(address),"r"(offset)
    :"%ecx"
  );

我已经开始了解操作码,我已经获得了一些x86手册。我(在某种程度上)了解硬件如何在基本级别上工作。

我知道我可以使用带有fstream的c ++将文件加载到内存中,我想知道是否有办法从该空间执行内存,或者它是否存在于内存的不可执行部分或其他内容中。 / p>

原因:

目前有几个原因我想这样做。我希望为我的程序创建一个基本加密,以便运行该程序的简单密钥。虽然我可以轻松加密和解密实际代码,但我希望程序在每次运行时都不加密,并且永远不会存储在硬盘上。我知道几个问题,但是我对这样做非常感兴趣。

最终问题:

我可以从asm中的c ++程序的程序中的内存空间执行机器代码吗?

是必要的吗?

是否还有其他方法可以更有效地完成此任务,如果有,那些方法是什么?

我也正在阅读我正在制作的鼠标共享程序的一些DLL注入(两台计算机彼此相邻,都有显示器,但是你只有一个鼠标/键盘。而且我想知道在哪里我可以在这个主题上找到一些很好的资源吗?谷歌一直很有帮助,但是我对一些IRC频道或者类似的东西感兴趣。不管怎样,谢谢阅读!

2 个答案:

答案 0 :(得分:7)

这听起来好像你想在一个单独的文件中编译一些x86程序集?

我可能误解了,当你说'记忆空间'时,你的术语非常广泛。我假设你并不是说你想用一组特定的程序集编译它,但是能够在运行时交换汇编指令吗?

阅读以下Dynamically generating and executing x86 code

你会看到

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>

 int main(int argc, char *argv[]) {
     uint8_t *buf = mmap(NULL, 1000, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

     buf[0] = 0xb8;
     uint32_t u32 = 42;
     memcpy(buf + 1, &u32, 4);
     buf[5] = 0xc3;

     if (mprotect(buf, 1000, PROT_EXEC | PROT_READ) < 0) {
         fprintf(stderr, "mprotect failed: %s\n", strerror(errno));
         return 1;
     }
     int (*ptr)(void) = (int (*)(void)) buf;

     printf("return is %d\n", ptr());

     return 0; }

这里是为缓冲区分配内存。将指令放入缓冲区,然后从分配的内存中创建一个函数指针。请注意,内存也受到保护。

阅读本文以便更好地理解,它还为您提供了一些Windows等价物。

答案 1 :(得分:2)

如果要将代码作为数据加载然后执行它,那么您可能需要将包含代码的内存标记为可执行(这是由于大多数现代操作系统中的安全功能可以防止各种漏洞利用)。在Linux,Mac OS X,下你会使用mprotect,但听起来你可能正在使用Windows(?)所以在这种情况下你需要找到等效的API

并且你不需要为此使用asm - 你可以只使用C或C ++函数指针。