android逆向(1)之root方式注入apk

android逆向(1)之root方式注入apk

第一步,注入动态库到目标进程

  1. 启动注入程序,入口main函数中输入将被注入的进程名称以及欲注入动态库路径;

  2. 根据进程名获取进程id:打开/proc目录,读取/proc/%d/cmdline;

  3. attach到目标进程:ptrace(PTRACE_ATTACH, pid, NULL, 0)并暂停目前进程;

  4. 读取寄存器值:ptrace(PTRACE_GETREGS, pid, NULL, regs),并保持读取到的寄存器;

  5. 获取被加载的动态库中mmap函数地址,获取被加载动态库中函数地址的方法是,获取本地libc.so模块和被加载动态库中libc.so模块中各自起始地址,local_addr-local_handle的值为指定函数(如mmap)在该模块中的偏移量,然后再加上remote_handle,结果就为指定函数在目的进程的虚拟地址,获取模块起始地址的方法是读取进程对应的/proc/self/maps/proc/%d/maps文件;

  6. 调用被加载库的mmap方法申请空间:ptrace_call(target_pid, (uint32_t)func_addr, parameters, param_num, regs);

  7. 获取申请空间时的R0寄存器,arm中R0~R3作为传递参数的寄存器,R0可以获取到申请空间的起始地址;

  8. 获取被加载库中dlopen,dlsym,dlclose,dlerror函数地址;

  9. 将被加载动态库的路径写入到mmap分配的栈空间:ptrace(PTRACE_PEEKTEXT, pid, dest, 0); ;

  10. 调用远程函数的dlopen函数打开要被注入的动态库;

  11. 调用dlsym获取加载动态库目标函数符号对应地址,并调用目标函数,完成注入;

  12. 调用dlclose关闭被注入库;

  13. 完成注入;

动态库中加载目标apk(aar)

  1. 入口函数中启动新线程,并调用pthread_detach(tid)将新线程设置为detach状态,可自动回收资源;

  2. 新线程中调用AndroidRuntime::getJavaVM();获取JavaVM对象并Attach当前线程到JavaVM:jvm->AttachCurrentThread(&jni_env, NULL);获取到jni env;

  3. 找到dalvik/system/DexClassLoader类,并获取其构造方法public DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent)的methodid及public Class<?> loadClass(String name) throws ClassNotFoundException的methodid;

  4. 找到类java/lang/ClassLoader,获取其静态方法Gpublic static ClassLoader getSystemClassLoader()的MethodID,调用静态方法getSystemClassLoader获取系统ClassLoader;

  5. 基于系统ClassLoader,以及DexClassClassLoader构造方法MethodID创建DexClassLoader对象:jni_env->NewObject(dexloader_claxx, dexloader_init_method, apk_path, dex_out_path, lib_path, class_loader);,要传入DexClassloader jclass,DexClassLoader构造方法id,要被加载的apk路径,dex输出路径,动态库路径,以及父(即系统)ClassLoader;

  6. 调用DexClassLoader的loadClass方法id加载apk中被调起的类:jclass entry_class = static_cast<jclass>(jni_env->CallObjectMethod(dex_loader_obj, loadClass_method, class_name));;

  7. 调用动态加载到的apk中类的方法:jclass entry_class = static_cast<jclass>(jni_env->CallObjectMethod(dex_loader_obj, loadClass_method, class_name));;

  8. 线程与JavaVM脱离:jvm->DetachCurrentThread();;

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻口味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值