Android arm64(aarch64)中的so注入(inject) - 兼容x86 and arm

这篇博客详细介绍了如何在Android arm64环境下进行so注入,并确保兼容x86和arm架构。作者提供了相关代码示例,包括inject.c、Android.mk和Application.mk文件。需要注意的是,由于arm64设备通常运行Android 5.0+,可能遇到selinux权限问题导致注入失败。为解决此问题,可以临时关闭selinux或者配置相应的selinux策略。

实现Android arm64(aarch64)中的so注入(inject) ,并且兼容x86和arm。如果没有搞错,这是国内外第一份公开的arm64注入的针对性完整资料~~微笑

代码基于 ariesjzj 的 《Android中的so注入(inject)和挂钩(hook) - For both x86 and arm 》,增加了对arm64的支持。(目前已经开始有64位安卓手机)

同样,代码由jni中以下三个文件构成。

    inject.c
    Android.mk
    Application.mk

其中Android.mk一样,Application.mk中

APP_ABI := arm64-v8a
inject.c如下:

#include <stdio.h>    
#include <stdlib.h>    
#include <asm/user.h>    
#include <asm/ptrace.h>    
#include <sys/ptrace.h>    
#include <sys/wait.h>    
#include <sys/mman.h>    
#include <dlfcn.h>    
#include <dirent.h>    
#include <unistd.h>    
#include <string.h>    
#include <elf.h>    
#include <android/log.h>    
#include <sys/uio.h>
    
#if defined(__i386__)    
#define pt_regs         user_regs_struct    
#elif defined(__aarch64__)
#define pt_regs         user_pt_regs  
#define uregs	regs
#define ARM_pc	pc
#define ARM_sp	sp
#define ARM_cpsr	pstate
#define ARM_lr		regs[30]
#define ARM_r0		regs[0]  
#define PTRACE_GETREGS PTRACE_GETREGSET
#define PTRACE_SETREGS PTRACE_SETREGSET
#endif    
    
#define ENABLE_DEBUG 1    
    
#if ENABLE_DEBUG    
#define  LOG_TAG "INJECT"    
#define  LOGD(fmt, args...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, fmt, ##args)    
#define DEBUG_PRINT(format,args...) \    
    LOGD(format, ##args)    
#else    
#define DEBUG_PRINT(format,args...)    
#endif    
    
#define CPSR_T_MASK     ( 1u << 5 )    
    
#if defined(__aarch64__)    
const char *libc_path = "/system/lib64/libc.so";    
const char *linker_path = "/system/bin/linker64";    
#else
const char *libc_path = "/system/lib/libc.so";    
const char *linker_path = "/system/bin/linker";    
#endif
    
int ptrace_readdata(pid_t pid,  uint8_t *src, uint8_t *buf, size_t size)    
{    
    long i, j, remain;    
    uint8_t *laddr;       
    size_t bytes_width = sizeof(long);
	
    union u {    
        long val;    
        char chars[bytes_width];    
    } d;    
    
    j = size / bytes_width;    
    remain = size % bytes_width;    
    
    laddr = buf;    
    
    for (i = 0; i < j; i ++) {    
        d.val = ptrace(PTRACE_PEEKTEXT, pid, src, 0);    
        memcpy(laddr, d.chars, bytes_width);    
        src += bytes_width;    
        laddr += bytes_width;    
    }    
    
    if (remain > 0) {    
        d.val = ptrace(PTRACE_PEEKTEXT, pid, src, 0);    
        memcpy(laddr, d.chars, remain);    
    }    
    
    return 0;    
}    
    
int ptrace_writedata(pid_t pid, uint8_t *dest, uint8_t *data, size_t size)    
{    
    long i, j, remain;    
    uint8_t *laddr;    
    size_t bytes_width = sizeof(long);
	
    union u {    
        long val;    
        char chars[bytes_width];    
    } d;    
    
    j = size / bytes_width;    
   
<think>我们已知工具链前缀为 `aarch64-linux-android-`,那么对应的C编译器应该是 `aarch64-linux-android-gcc`。 在Makefile中,CC变量通常用于指定C编译器,因此应设置为工具链路径下的`aarch64-linux-android-gcc`。 例如,如果工具链所在的目录是`/path/to/toolchain/bin`,那么CC应该设置为: CC = /path/to/toolchain/bin/aarch64-linux-android-gcc 注意:有时工具链路径已经添加到系统的PATH环境变量中,那么也可以直接写编译器名称,但是为了保证可靠性,通常建议写绝对路径。 参考引用[3]中提到的,对于ARM64架构,工具链名称就是`aarch64-linux-android-<gcc-version>`,因此编译器名称通常是`aarch64-linux-android-gcc`(可能带有版本号后缀,也可能没有,具体看你的工具链文件命名)。 另外,引用[5]提到,在替换编译系统中的CC变量时,可以直接使用工具链的绝对路径。 因此,在Makefile中设置CC变量时,应该这样写(假设工具链在`/opt/android-ndk/toolchains/bin`目录下): CC = /opt/android-ndk/toolchains/bin/aarch64-linux-android-gcc 如果工具链路径已经加入PATH,也可以写成: CC = aarch64-linux-android-gcc 但为了确保在不同环境中都能正确找到编译器,推荐使用绝对路径。 此外,还需要注意,在编译Android程序时,通常需要指定sysroot(如引用[4]所示)以及目标平台(API级别)等参数。 总结:在Makefile中,CC变量应该设置为`aarch64-linux-android-gcc`的绝对路径(或者如果已在PATH中,则可以直接写命令名称)。 </think>在已有 `aarch64-linux-android-` 系列工具链的情况下,Makefile 中 `CC` 变量对应的工具是 **aarch64-linux-android-gcc**。这是用于编译 ARM64 架构 Android 程序的 C 编译器。 ### 详细说明 1. **工具链命名规则**: - 工具链前缀 `aarch64-linux-android-` 表示目标平台: - `aarch64`:ARM64 架构 - `linux`:Linux 内核兼容 - `android`:Android 操作系统 - 编译器后缀 `gcc` 表示 GNU C 编译器 2. **Makefile 配置示例**: ```makefile # 设置工具链路径(根据实际路径修改) TOOLCHAIN_PATH = /path/to/your/toolchain/bin # CC 变量指向 C 编译器 CC = $(TOOLCHAIN_PATH)/aarch64-linux-android-gcc # 示例编译规则 %.o: %.c $(CC) -c $< -o $@ -fPIC -DANDROID ``` 3. **关键说明**: - `aarch64-linux-android-gcc` 是交叉编译工具链的核心组件,负责将 C 源码编译为 ARM64 架构的机器码[^1][^3] - 必须与 `--sysroot` 参数配合使用,指定 Android NDK 的系统根目录(如 `android-21/arch-arm64`)[^4] - 实际路径可能包含版本号(如 `aarch64-linux-android4.9-gcc`),具体取决于工具链版本[^1] 4. **完整工具链构成**: | 工具 | Makefile 变量 | 功能 | |------|---------------|------| | `aarch64-linux-android-gcc` | `CC` | C 编译器 | | `aarch64-linux-android-g++` | `CXX` | C++ 编译器 | | `aarch64-linux-android-ar` | `AR` | 静态库打包 | | `aarch64-linux-android-ld` | `LD` | 链接器 | | `aarch64-linux-android-strip` | `STRIP` | 二进制精简 | ### 验证方法 执行以下命令验证工具链有效性: ```bash # 检查编译器版本 /path/to/toolchain/bin/aarch64-linux-android-gcc --version # 输出应包含目标平台信息 aarch64-linux-android-gcc (GCC) x.x.x Target: aarch64-linux-android ```
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值