进击的Android Hook 注入术《四》
目录(?)[-]
- 继续
- 注入之后
- 示例三
- 输出
- 最后
继续
注入之后
- void Main();
- static void* _main(void*){
- Main();
- return NULL;
- }
- class EntryClass {
- public:
- EntryClass() {
- pthread_t tid;
- pthread_create(&tid, NULL, _main, NULL);
- pthread_detach(tid);
- }
- } boy;
当so被注入后,我们的逻辑代码实际上是跑在一个Linux线程上,这样做的目的是为了不对主线程造成干扰。我们的目标是打通Java层,很自然的联想到JNI,通过JNI我们就是可以跟Java层互动了。但这里缺少了一个非常重要的元素——JNIEnv,没有这个对象,JNI就无从说起了。
示例三
- JNIEnv *jni_env = NULL;
- JavaVM *jvm = AndroidRuntime::getJavaVM();
- jvm-AttachCurrentThread(&jni_env, NULL);
- //TODO 使用JNIEnv
- jvm->DetachCurrentThread();
至此,我们就拿到了至关重要的JNIEnv对象了。接下来,我们通过DexClassLoader加载我们的dex文件,关键代码如下所示:
- //ClassLoader.getSystemClassLoader()
- static jobject getSystemClassLoader(){
- jclass class_loader_claxx = jni_env->FindClass("java/lang/ClassLoader");
- snprintf(sig_buffer, 512, "()%s", JCLASS_LOADER);
- jmethodID getSystemClassLoader_method = jni_env->GetStaticMethodID(class_loader_claxx, "getSystemClassLoader", sig_buffer);
- return jni_env->CallStaticObjectMethod(class_loader_claxx, getSystemClassLoader_method);
- }
然后通过SystemClassLoader,生成DexClassLoader对象
- snprintf(sig_buffer, 512, "(%s%s%s%s)V", JSTRING, JSTRING, JSTRING, JCLASS_LOADER);
- jmethodID dexloader_init_method = jni_env->GetMethodID(dexloader_claxx, "<init>", sig_buffer);
- snprintf(sig_buffer, 512, "(%s)%s", JSTRING, JCLASS);
- jmethodID loadClass_method = jni_env->GetMethodID(dexloader_claxx, "loadClass", sig_buffer);
- jobject class_loader = getSystemClassLoader();
- check_value(class_loader);
- jobject dex_loader_obj = jni_env->NewObject(dexloader_claxx, dexloader_init_method, apk_path, dex_out_path, NULL, class_loader);
最后再通过dex_loader_obj加载dex,找到自定义方法的入口,并调用
- jstring class_name = jni_env->NewStringUTF("com.demo.inject2.EntryClass");
- jclass entry_class = static_cast<jclass>(jni_env->CallObjectMethod(dex_loader_obj, loadClass_method, class_name));
- jmethodID invoke_method = jni_env->GetStaticMethodID(entry_class, "invoke", "(I)[Ljava/lang/Object;");
- check_value(invoke_method);
- jobjectArray objectarray = (jobjectArray) jni_env->CallStaticObjectMethod(entry_class, invoke_method, 0);
至此我们的dex逻辑开始执行了。我让com.demo.inject2.EntryClass.invoke作为的入口函数,从invoke里用上《三》示例中的com.demo.inject的代码,对com.demo.host打印的数据再进行修改(同一个进程被连续注入两次,应该是比较痛苦的)。下面看看inject2中invoke的代码:
- package com.demo.inject2;
- import java.lang.reflect.Method;
- import android.content.Context;
- import android.util.Log;
- /**
- *
- * @author boyliang
- *
- */
- public final class EntryClass {
- public static Object[] invoke(int i) {
- try {
- Log.i("TTT", ">>>>>>>>>>>>>I am in, I am a bad boy 2!!!!<<<<<<<<<<<<<<");
- Context context = ContexHunter.getContext();
- Class<?> MainActivity_class = context.getClassLoader().loadClass("com.demo.host.MainActivity");
- Method setA_method = MainActivity_class.getDeclaredMethod("setA", int.class);
- setA_method.invoke(null, 1);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
代码跟《三》的示例非常相似,只是入口点不一样罢了。注意,这里同样有双亲委派的限制。
输出
- com.demo.inject starts.
- I/TTT ( 738): com.demo.host starts
- I/TTT ( 738): 1
- I/TTT ( 738): 2
- I/TTT ( 738): 3
- I/TTT ( 738): 4
- I/TTT ( 738): 5
- I/TTT ( 738): >>>>>>>>>>>>>I am in, I am a bad boy!!!!<<<<<<<<<<<<<<
- I/TTT ( 738): 998
- I/TTT ( 738): 999
- I/TTT ( 738): 1000
- I/TTT ( 738): 1001
- I/TTT ( 738): 1002
- I/TTT ( 738): 1003
- I/TTT ( 738): >>>>>>>>>>>>>I am in, I am a bad boy 2!!!!<<<<<<<<<<<<<<
- I/TTT ( 738): 1
- I/TTT ( 738): 2
- I/TTT ( 738): 3
- I/TTT ( 738): 4
- I/TTT ( 738): 5
- I/TTT ( 738): 6
- I/TTT ( 738): 7
从两次的字符串输出,证明这次的注入修改已经成功了。
最后
到目前为止,我们已经实现如下功能:
- 注入目标进程
- 获取JNIEnv地址;
- 另目标进程加载Dex,并执行指定的方法;
距离我们的目标,还差一步——截获broadcastIntent方法,在《五》里我会再介绍一种叫BinderProxy的技术,通过这种技术,我们可以截获任意的BinderService的方法。
原文地址: http://blog.csdn.net/l173864930/article/details/38467497
进击的Android Hook 注入术《四》相关推荐
- 进击的Android Hook 注入术《二》
目录(?)[-] 继续 注入 分类 本质 目的 过程 示例一 Host代码 libmysoso代码 调用 示例代码 继续 在<一>里,我把基本思路描述了一遍,接下为我们先从注入开始入手. ...
- 进击的Android Hook 注入术《三》
目录(?)[-] 继续 Component Injection 原理 示例二 comdemohost comdemoinject 绕过ClassLoader双亲委托 输出 最后 继续 在<二&g ...
- 进击的Android Hook 注入术《一》
目录(?)[-] 写在前面 短信拦截 场景 问题 解决方案 问题来了 基本思路 写在前面 这个系列本来是在公司的一个分享,内容比较多,所以就把这个PPT重新组织整理成博客,希望对大家学习有所帮助.我会 ...
- 进击的Android Hook 注入术《五》
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 继续 BinderProxy 原理 获取AMS引用 获取JavaBBinder 替换mObject对象 示例四 最后 继续 在A ...
- xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析
章节内容 一. Android Hook 系列教程(一) Xposed Hook 原理分析 二. Android Hook 系列教程(二) 自己写APK实现Hook Java层函数 三. Androi ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )
文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...
- linux qt getpid,[QTA] Android 动态注入原理分析
一.前言 Android 的 UI 自动化测试可以通过注入式和非注入式分别实现,通过注入式可以更加方便地与应用进行交互.QTA 团队提供的 Android UI 自动化测试框架QT4A, 是通过动态注 ...
- Frida Android hook
From:https://eternalsakura13.com/2020/07/04/frida/ 目录 1.r0ysue 大佬 2.Frida 环境 2.1 pyenv 2.2 frida 安装 ...
- android hook 第三方app_基于 VirtualApp 结合 whale hook框架实现hook第三方应用
要点 1. whale hook framework 使用示例: 2. 参考项目:VirtualHook: 3. 按照 VirtualHook 修改 VirtualApp: 4. 编写 hook pl ...
最新文章
- nagios 使用MSN 发报警消息
- Fedora 18下 升级内核后VirtualBox不能正常使用的问题
- php socket
- 数据表操作(DQL)
- Quartz-Trigger详解
- 阿里面试题:如何检测并避免 Java 中的死锁?
- win7乱码 字符集解决方案
- 逻辑斯蒂回归_逻辑斯蒂回归详细解析 | 统计学习方法学习笔记 | 数据分析 | 机器学习...
- Java高级开发面试,Java面试没有项目经验
- 大数据技术对互联网的影响
- 电商平台环境下的图像分析在线服务产品——电商图像分析
- 数据结构和算法(十三)排序算法
- 飞机飞行原理之空气流动基本规律
- Python初学者必刷的五个项目,你做过几个?
- 黑苹果10.15.7使用
- 托福高频真词List13 // 附托福TPO阅读真题
- MindManager思维导图软件中如何下载使用行业分析模板教程分享
- 【USACO题库】1.5.4 Checker Challenge跳棋的挑战
- Luogu P2129 小Z的情书
- Linux 第九章-系统进程和服务管理
热门文章
- 重写StyleSheetTheme
- shell中条件判断if中的-z到-d的意思
- f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码
- WPS for Linux(ubuntu)字体缺失解决办法(转)
- Report20201016 benchmark vs袁颖 PANTHER初步模拟结果
- [MATLAB粒子模拟笔记]差分泊松方程求静电场分布
- VTK修炼之道6_仔细分析一个复杂程序
- 删除数据库中所有存储过程和函数的sql语句
- 【CyberSecurityLearning 37】网络安全常用Linux系统命令以及 源码包的安装过程
- 操作系统课设——吃水果问题