将ASM jmp内联到新内存
Inline ASM jmp to new memory
所以我想从文件中加载一组汇编指令,并执行这些指令。
或
我想再次从文件(非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手册。我(在某种程度上)了解硬件的基本工作原理。
我知道我可以用c++和fstream将文件加载到内存中,我想知道是否有办法从这个空间执行内存,或者它是否在内存的不可执行部分或其他什么地方。。
原因:
目前有几个原因我想这样做。我希望为我的程序创建一个基本加密,以获得运行程序的简单密钥。虽然我可以很容易地对实际代码进行加密和解密,但我希望程序每次运行都不加密,永远不要存储在硬盘上。我知道有几个问题,但我对此很感兴趣
最终问题:
我可以在asm中从c++的程序中从内存空间执行机器代码吗?
asm有必要吗?
有没有其他方法可以更有效地完成这项任务?如果有,这些方法是什么?
我也在阅读我正在制作的鼠标共享程序的一些DLL注入(两台电脑相邻,都有显示器,但你只有一个鼠标/键盘。我想知道在哪里可以找到一些关于这个主题的好资源?谷歌很有帮助,但我可能对一些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: %sn", strerror(errno));
return 1;
}
int (*ptr)(void) = (int (*)(void)) buf;
printf("return is %dn", ptr());
return 0; }
在这里,您正在为缓冲区分配内存。将指令放入缓冲区,然后从分配的内存中创建一个函数指针。请注意,内存也受到保护。
为了更好地理解这篇文章,它还为您提供了一些Windows等效程序。
如果你想将代码加载为数据,然后执行它,那么你可能需要将包含代码的内存标记为可执行的(这是由于大多数现代操作系统中的安全功能可以防止各种漏洞)。在Linux、Mac OS X、等下,您将使用mprotect,但听起来您可能正在使用Windows(?),因此在这种情况下,您需要找到等效的API。
不,你不需要使用asm——你只需要使用C或C++函数指针。
- 正在调试 malloc():新内存损坏
- C 新操作员分配新内存
- std::函数 创建临时内存时内存访问错误
- 在插入C STL地图之前,我需要使用新的内存分配内存
- 如果我的C++“新”内存分配失败,如何找出返回值
- 使用指针调用重载而不分配新内存
- 新内存和重新分配内存
- C++ 中新内存的范围
- 指向存储胡言乱语的新内存的C++指针
- 我正在尝试在函数中新内存新堆内存,但它给出了错误
- 返回未引用的新内存泄漏
- c++新内存替换和作用域解析
- 删除标准::映射中的新内存?
- 在不分配新内存的情况下,将已知长度的char指针转换为char的向量
- 将ASM jmp内联到新内存
- 我可以使用static关键字只分配一次新内存吗
- 按新内存分配
- 赋值运算符是否应为数据成员分配新内存或重用现有内存
- 分配新内存后出现分段错误
- 指针在删除指针并在 c++ 中再次分配新内存后是否获得相同的内存地址?