内联ASM jmp到新的内存

| 因此,我想从文件中加载一组汇编指令,然后执行这些指令。 要么 我想再次从文件(非exe)加载已编译的机器代码 我的想法: 到目前为止,我已经学习了足够的内联汇编语言,可以轻松地使用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 ++将文件加载到内存中,我想知道是否有一种方法可以从该空间执行内存,或者它是否在内存的不可执行部分中? .. 原因: 目前,有几个原因我想这样做。我希望为我的程序创建一个基本的加密,以便有一个简单的密钥来运行该程序。虽然我可以轻松地加密和解密实际代码,但我希望程序在每次运行时都不会被加密,并且永远不要存储在硬盘驱动器上。我知道一些问题,但是我对此很感兴趣。 最后的问题: 我可以在asm中的c ++中从程序的内存空间执行机器代码吗? asm是否必要? 还有其他方法可以更有效地完成此任务,如果可以,这些方法是什么? 我还在为正在制作的鼠标共享程序读一些DLL注入文件(两台计算机彼此相邻,都有显示器,但是您只有一个鼠标/键盘。而且我想知道在哪里我可以在该主题上找到一些很好的资源吗?Google很有帮助,但是我对某些IRC频道或类似内容感兴趣,无论如何,谢谢阅读!     
已邀请:
        听起来您有点想要在单独的文件中对某些x86程序集进行JIT编译? 当您说“内存空间”时,我可能会误解您对术语的概括。我假设您不是要用特定的汇编集对其进行编译,而是能够在运行时交换汇编指令吗? 阅读以下动态生成和执行x86代码的内容 你会看到的
#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的等效功能。     
        如果要将代码作为数据加载然后执行,则可能需要将包含代码的内存标记为可执行文件(这是由于大多数现代操作系统中的安全性,以防止各种攻击)。在Linux,Mac OS X等系统下,您将使用mprotect,但听起来好像您正在使用Windows(?),因此在这种情况下,您将需要找到等效的API。 而且不,您不需要使用asm-您可以只使用C或C ++函数指针。     

要回复问题请先登录注册