机器码运行

本文探讨了在iOS系统中,由于系统限制内存(堆)的可执行权限,导致直接运行机器码变得困难。为了执行机器码,开发者需要进行提权操作,以绕过这一安全机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>                                                                                            
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>

/*
首先我们要知道生成的所谓机器码到底是神马东西。一行看上去只是处理几个数字的代码,蕴含着的就是机器码。

unsigned char[] macCode = {0x48, 0x8b, 0x07};
macCode对应的汇编指令就是:

mov    (%rdi),%rax
其实可以看出机器码就是比特流,所以将它加载进内存并不困难。而问题是应该如何执行。

好啦。下面我们就模拟一下执行新生成的机器码的过程。一个求和函数的机器码:

long add(long num) {
  return num + 1;
}

//对应的机器码
0x48, 0x83, 0xc0, 0x01,           
0xc3 

动态的在内存上创建函数之前,我们需要在内存上分配空间。具体到模拟动态创建函数,其实就是将对应的机器码映射到内存空间中。这里我们使用c语言做实验,利用mmap函数来实现这一点。
头文件	
    #include <unistd.h>    
    #include <sys/mman.h>
定义函数	
    void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize)
函数说明	
    mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。


代表映射区域的保护方式,有下列组合:

    PROT_EXEC  映射区域可被执行;
    PROT_READ  映射区域可被读取;
    PROT_WRITE  映射区域可被写入;
*/

//分配内存
void* create_space(size_t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值