Last active 1726649765

Embed Assembly in C

main.c Raw
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <sys/mman.h>
5#include <unistd.h>
6
7unsigned char add_bin[] = {
8 // 这里是针对 x86_64 架构的 add 函数的二进制机器码
9 0x55, // push %rbp
10 0x48, 0x89, 0xe5, // mov %rsp,%rbp
11 0x89, 0x7d, 0xfc, // mov %edi,-0x4(%rbp)
12 0x89, 0x75, 0xf8, // mov %esi,-0x8(%rbp)
13 0x8b, 0x55, 0xfc, // mov -0x4(%rbp),%edx
14 0x8b, 0x45, 0xf8, // mov -0x8(%rbp),%eax
15 0x01, 0xd0, // add %edx,%eax
16 0x5d, // pop %rbp
17 0xc3 // retq
18};
19
20void load_and_execute() {
21 // 获取页面大小
22 size_t pagesize = sysconf(_SC_PAGESIZE);
23
24 // 分配可读、可写、可执行的内存页
25 void *exec_mem = mmap(NULL, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC,
26 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
27 if (exec_mem == MAP_FAILED) {
28 perror("mmap");
29 exit(EXIT_FAILURE);
30 }
31
32 // 将函数的机器码复制到可执行内存中
33 memcpy(exec_mem, add_bin, sizeof(add_bin));
34
35 // 定义一个函数指针并指向加载到内存中的代码段
36 int (*add_func)(int, int) = (int (*)(int, int))exec_mem;
37
38 // 调用加载的函数
39 int result = add_func(2, 3);
40 printf("Result of add(2, 3): %d\n", result);
41
42 // 释放内存
43 if (munmap(exec_mem, pagesize) == -1) {
44 perror("munmap");
45 exit(EXIT_FAILURE);
46 }
47}
48
49int main() {
50 load_and_execute();
51 return 0;
52}
53