2011-06-15 50 views
2

所以我想从文件中加载一组汇编指令,并执行这些指令。内联ASM跳转到新内存

OR

我想从一个文件(non-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注入为我做鼠标共享程序(两台计算机彼此相邻,都具有显示器,但是你只有一个鼠标/键盘。我想知道在那里我可以在主题找到一些好的资源?谷歌一直乐于助人,但我感兴趣的是也许有些IRC频道或类似的东西。不管怎么说,感谢您的阅读!

+0

真的有一个问题太多的问题。 – 2011-06-15 15:27:57

回答

6

这听起来像是你有种想一些x86汇编在一个单独的文件中的一些JIT编译?

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

有过以下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相同的东西。

+0

+1简单的指导!作为将来的参考,由于API不可移植,因此Windows上的“等效”内存保护过程首先调用['VirtualAlloc()'](http://msdn.microsoft.com/zh-cn/library/aa366887 (VS.85).aspx)并使用[内存保护常量](http://msdn.microsoft.com/en-us/library/aa366786(VS.85).aspx)是必需的。 WOW !! – 2011-06-15 16:08:10

+0

那很完美!谢谢!! – ultifinitus 2011-06-15 18:24:53

2

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

而且没有你不需要使用ASM存储这一点 - 你可以使用C或C++函数指针。

+0

您可以使用常规函数指针* iff *代码实际上是一个函数*和*您100%确定调用约定(在Windows上)。 – 2011-06-15 16:08:19