android 逆向之 root 方式注入 apk

第一步,注入动态库到目标进程
启动注入程序,入口 main 函数中输入将被注入的进程名称以及欲注入动态库路径;
根据进程名获取进程 id:打开
/proc目录,读取/proc/%d/cmdline;attach 到目标进程:
ptrace(PTRACE_ATTACH, pid, NULL, 0)并暂停目前进程;读取寄存器值:
ptrace(PTRACE_GETREGS, pid, NULL, regs),并保持读取到的寄存器;获取被加载的动态库中 mmap 函数地址,获取被加载动态库中函数地址的方法是,获取本地 libc.so 模块和被加载动态库中 libc.so 模块中各自起始地址,local_addr-local_handle 的值为指定函数(如 mmap)在该模块中的偏移量,然后再加上 remote_handle,结果就为指定函数在目的进程的虚拟地址,获取模块起始地址的方法是读取进程对应的
/proc/self/maps或/proc/%d/maps文件;调用被加载库的 mmap 方法申请空间:
ptrace_call(target_pid, (uint32_t)func_addr, parameters, param_num, regs);获取申请空间时的 R0 寄存器,arm 中 R0~R3 作为传递参数的寄存器,R0 可以获取到申请空间的起始地址;
获取被加载库中 dlopen,dlsym,dlclose,dlerror 函数地址;
将被加载动态库的路径写入到 mmap 分配的栈空间:
ptrace(PTRACE_PEEKTEXT, pid, dest, 0);;调用远程函数的 dlopen 函数打开要被注入的动态库;
调用
dlsym获取加载动态库目标函数符号对应地址,并调用目标函数,完成注入;调用 dlclose 关闭被注入库;
完成注入;
第二步动态库中加载目标 apk(aar)
入口函数中启动新线程,并调用
pthread_detach(tid)将新线程设置为 detach 状态,可自动回收资源;新线程中调用
AndroidRuntime::getJavaVM();获取 JavaVM 对象并 Attach 当前线程到 JavaVM:jvm->AttachCurrentThread(&jni_env, NULL);获取到 jni env;找到
dalvik/system/DexClassLoader类,并获取其构造方法public DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent)的 methodid 及public Class<?> loadClass(String name) throws ClassNotFoundException的 methodid;找到类
java/lang/ClassLoader,获取其静态方法Gpublic static ClassLoader getSystemClassLoader()的 MethodID,调用静态方法 getSystemClassLoader 获取系统 ClassLoader;基于系统 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;调用 DexClassLoader 的 loadClass 方法 id 加载 apk 中被调起的类:
jclass entry_class = static_cast<jclass>(jni_env->CallObjectMethod(dex_loader_obj, loadClass_method, class_name));;调用动态加载到的 apk 中类的方法:
jclass entry_class = static_cast<jclass>(jni_env->CallObjectMethod(dex_loader_obj, loadClass_method, class_name));;线程与 JavaVM 脱离:
jvm->DetachCurrentThread();
版权声明: 本文为 InfoQ 作者【轻口味】的原创文章。
原文链接:【http://xie.infoq.cn/article/17c36d0d2bb75ff0d1e8390d6】。文章转载请联系作者。











评论