Android Xpose Hook(一)


实验环境:

Droid4x模拟器 (目前Android版本4.2.2)

Android Studio

1.下载相关工具

XposedInstaller下载

http://repo.xposed.info/module/de.robv.android.xposed.installer

XposedBridged.jar下载

https://github.com/rovo89/XposedBridge/releases

2.安装XposedInstaller并激活

激活步骤: 启动XposedInstaller -> 框架 -> 安装更新 ->模拟器重启 (ps:模拟器会直接屏幕黑掉,直接结束进程即可,不行就反复试几下 )

激活后这里会有绿色的数字信息

3.Android Studio新建一个测试工程(被Hook的APP)

UI如下:

MainActivity类新建如下被Hook函数 (如上3个按钮点击分别传递对应的参数进入,返回值显示在textview控件上)

public String sayhello(int num1, int num2 ){    if (num1 + num2 < 100) {        return "so small than 100!";    }    if (num1 + num2 == 100) {        return "equal 100!";    }    if (num1 + num2 > 100) {        return "so big than 100!";    }    return "error";}

4.新建我们的XposedHook工程(建议SDK版本选择4.0.3)

●在AndroidManifest文件中加入如下代码

<meta-data    android:name="xposedmodule"    android:value="true" /><meta-data    android:name="xposeddescription"    android:value="Easy example" /><meta-data    android:name="xposedminversion"    android:value="54" />

●新建lib目录
将下载好的XposedBridged.jar放入该目录

并右键->Add To Library   这个步骤会在grandlew中添加

dependencies {    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])    testCompile ‘junit:junit:4.12‘    compile ‘com.android.support:appcompat-v7:23.1.1‘    compile files(‘lib/XposedBridgeApi-54.jar‘)}

我们要将compile files修改为provided files,最后效果如下

dependencies {    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])    testCompile ‘junit:junit:4.12‘    compile ‘com.android.support:appcompat-v7:23.1.1‘    provided files(‘lib/XposedBridgeApi-54.jar‘)}

●添加assets目录

在该目录下添加xposed_init

该文件的作用是指定module入口类,Hook的实现代码在该类中

格式: 包名称 + 类名

com.bingghost.xposeddemo.XposedHook

●新建xposed_init中指明的入口类XposedHook

public class XposedHook implements IXposedHookLoadPackage {    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {        XposedBridge.log("Loaded app: " + lpparam.packageName);

if (!lpparam.packageName.equals("com.bingghost.simplehelloworld"))        {            return;        }

findAndHookMethod("com.bingghost.simplehelloworld.MainActivity", lpparam.classLoader, "sayhello", int.class, int.class, new XC_MethodHook() {            protected void afterHookedMethod(MethodHookParam param) {                String str = (String) param.getResult();                Log.v("hook after result :", str);                Integer  para1 =  (Integer) param.args[0];   //获取参数1                Integer para2 = (Integer) param.args[1];     //获取参数2                String s1 = Integer.toString(para1);                String s2 = Integer.toString(para2);                param.setResult("i am new result! after");   //设置返回值

Log.v("hook param1:", s1);                Log.v("hook param2:", s2);                Log.v("hook result:", "i am new result! after");            }

protected void beforeHookedMethod(MethodHookParam param) {                param.setResult("i am new result! before");  //                Integer  para1 =  (Integer) param.args[0];   //获取参数1                Integer para2 = (Integer) param.args[1];     //获取参数2                String s1 = Integer.toString(para1);                String s2 = Integer.toString(para2);                Log.v("hook before param1:", s1);                Log.v("hook before param2:", s2);

param.args[0] = 100;  //设置参数1                param.args[1] = 200;  //设置参数2

Log.v("hook", "before hook!");            }

});    }}

handleLoadPackage           包加载时会调用

afterHookedMethod         Hook函数调用前

beforeHookedMethod     Hook函数后

XposedBridge.log              打印的内容将在XposedInstall的日志界面

安装好XposedDemoAPP 在模块中勾选上重启系统

5.运行结果

测试APP显示结果如下:

点击第2个按钮logcat输出

来自为知笔记(Wiz)

时间: 2024-10-27 19:29:41

Android Xpose Hook(一)的相关文章

使用cydia substrate 来进行android native hook

? cydia不仅可以hook java代码,同样可以hook native代码,下面举一个例子来进行android native hook 我是在网上找到的supermathhook这个项目,在他基础上修改的,本来是为了仓促应对阿里的ctf 这个项目位置: 这个项目是用来hook jni 代码的,而我是用来hook dvmDexFileOpenPartial这个函数的,所以必须使用 Mshookfunction这个函数,这个函数在libsubstrate.so中,自己去官网下载就可以了. 接下

Android Art Hook 技术方案

Android Art Hook 技术方案 by 低端码农 at 2015.4.13 www.im-boy.net 0x1 开始 Anddroid上的ART从5.0之后变成默认的选择,可见ART的重要性,目前关于Dalvik Hook方面研究的文章很多,但我在网上却找不到关于ART Hook相关的文章,甚至连鼎鼎大名的XPosed和Cydia Substrate到目前为止也不支持ART的Hook.当然我相信,技术方案他们肯定是的,估计卡在机型适配上的了. 既然网上找不到相关的资料,于是我决定自己

Android inline hook手记[转载]

原网址:http://blog.dbgtech.net/blog/?p=51 作者:NetRoc Android inline hook手记 说到Inline hook,了解这个词的同志们都应该知道,无非是修改目标函数处的指令,跳转到自己的函数,并且提供调用原函数的stub,即可完成整个流程.但是在ARM下面情况和我们熟悉的x86有所不同.ARM芯片的运行状态分为arm和thumb两种模式,分别有不同的指令集,arm指令为定长32位,thumb指令为定长16位(thumb-2中进行了扩展,可以使

Cydia Substrate框架Android so hook分析

最近需要用到Android so hook,于是分析了一下比较流行的Cydia Substrate框架 CydiaSubstrate框架的核心函数是MSHOOKFunction,官方使用说明如下: 现在Android 默认编译出来的都是thumb指令集的,就分析一下这个模式下的HOOK吧. 在使用MSHOOKFunction HOOK前,先用IDA attach到进程先看下准备HOOK的函数,前面18个字节的二进制指令如下: 52ABF480 30 B5       PUSH          

android 5 HOOK 技术研究之 ADBI 项目

简介 adbi 是一个android平台的二进制注入框架,源码开放在github上 :  ADBI 项目 ,从hook技术的分类来说,其属于so注入+inline hook, 这种方式的套路是:基于linux系统的ptrace机制,attach一个目标进程,注入一个动态链接库进入目标进程的地址空间,然后用so里边的函数地址替换目标进程地址空间里原有的函数地址(老的函数地址一般也需要保存起来). 源码目录 hijack:  可执行程序,用于注入一个so到目标进程 libbase:  注入库,提供h

android 5 HOOK 技术研究之 ADBI 项目 02

源码分析 hijack.c 这个文件实现了一个注入工具,可以向 -p 参数指定的进程注入一个so. 要实现这个效果,首先,需要得到目标进程若干函数如dlopen函数的地址,其次,需要能影响目标进程的正常执行流,让其中间某个时候执行dlopen加载指定的库,最后,还要能用动态加载的so里的函数覆盖原有内存里的函数. 下面开始研究,如何得到目标进程指定函数的地址,首先要得到的是dlopen函数的地址,adbi是这么做的: void *ldl = dlopen("libdl.so", RTL

android inline hook

最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline hook的大致流程如下: 首先将目标指令替换为跳转指令,跳转地址为一段我们自己编写的汇编代码,这段汇编代码先是执行用户指定的代码,如修改寄存器的值,然后执行被替换掉的原指令2,最后再跳转回原指令3处,恢复程序的正常运行. 为了避开注入过程,我们通过hook自己进程加载的动态连接库进行演示. 1.实现

Android Native Hook技术(一)

原理分析 ADBI是一个著名的安卓平台hook框架,基于 动态库注入 与 inline hook 技术实现.该框架主要由2个模块构成:1)hijack负责将so注入到目标进程空间,2)libbase是注入的so本身,提供了inline hook能力. 源码目录中的example则是一个使用ADBI进行hook epoll_wait的示例. hijack hijack实现动态库注入功能,通过在目标进程插入dlopen()调用序列,加载指定so文件.要实现这个功能,主要做两件事情: 获得目标进程中d

Hook android系统调用的实践

本文博客地址:http://blog.csdn.net/qq1084283172/article/details/71037182 一.环境条件 Ubuntukylin 14.04.5 x64bit Android 4.4.4 Nexus 5 二.Android内核源码的下载 执行下面的命令,获取 Nexus 5手机 设备使用的芯片即获取Nexus 5手机设备内核源码的版本信息. $ adb shell # 查看移动设备使用的芯片信息 $ ls /dev/block/platform 执行的结果