问题描述
|
因此,我想从文件中加载一组汇编指令,然后执行这些指令。
要么
我想再次从文件(非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,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 ++函数指针。