Android逆向(前7章打包下载)|Xposed Hook(上)

一颗小胡椒2022-03-18 07:41:49

声明:所有实验含部分虚构,纯属技术练习,未对真实环境造成任何影响。也请勿将相关技术用于非法操作,否则责任自负。

0x01 Hook修改变量

 在编写hook类的时候会去实现一个IXposedHookLoadPackage接口(加载应用程序,即“ Android软件包”时获得通知), 重写了handleLoadPackage方法(加载应用程序时将调用此方法),该方法有一个参数lpparam(有关该应用程序的信息), 这个方法向被实现的模块提供更多关于运行环境上下文的信息。首先我们实验的app是一款编写好的XposedDemo,将其安装到模拟器上,打开运行后没有任何效果,如图所示:

使用jadx-gui反编译工具查看其代码,注意在一个Activity在启动的时候,都会在onCreat()方法中执行setContentView(R.layout.activity_main)这行代码,来将指定的资源xml文件加载到对应的activity中。

然后定位到res/layout/activity_main.xml,可以发现当我们点击button的时候会触发myTest方法,回到MainActivity,跟进myTest()的Demo类。

经过分析test()方法可以发现,当我们点击按钮时会在日志中输出很多对应的日志信息,其中包括静态变量staticInt = 100,注意静态全局变量hook的时候调用的是使用的XposedHelpers.setStaticIntField(),若是全局普通变量用XposedHelpers.setIntField()。

我们再次运行app点击按钮,不过此次打开我们的ddms查看日志输出。

然后编写hook代码如下:

package com.xposed;

import de.robv.android.xposed.IXposedHookLoadPackage;

import de.robv.android.xposed.XC_MethodHook;

import de.robv.android.xposed.XposedBridge;

import de.robv.android.xposed.XposedHelpers;

import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

import android.util.Log;

public class Hook implements IXposedHookLoadPackage {

public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {

Log.d("feichen", "hook..."); //日志输出方式一

XposedBridge.log("Loaded app: " + lpparam.packageName); //日志输出方式二

if (lpparam.packageName.equals("com.feichen.xposeddemo")){

final Class clazz = XposedHelpers.findClass("com.feichen.xposeddemo.Demo",lpparam.classLoader);

XposedHelpers.setStaticIntField(clazz,"staticInt",520);

}

}

}

将写好的xposed编译安装到xposed后,勾选上写好的xposed模块,并重启手机,然后运行app,打开ddms,点击button按钮,查看ddms中的staticInt初始化值已经被我们hook修改为520,如图:

然后hook字符串变量的话使用XposedHelpers.setStaticObjectField(clazz,"Tag","Lvmeng");这一条语句,具体的效果这里不再演示,有兴趣的小伙伴下去可以自己尝试。

0x02 Hook普通方法

Hook普通方法使用的是XposedHelpers下的findAndHookMethod(类的字节码,方法名,回调函数)方法(用于Hook当前类下的所有方法),它有一个重载函数接收四个参数,

findAndHookMethod(类名全路径,类加载器,方法名,回调函数),其中回调函数除了使用

XC_MethodHook()之外,还有XC_MethodReplacement()。对于有参数的函数需要带上参数的字节码。在0x03的地方就是四个参数的findAndHookMethod。

因此,Hook普通方法的代码如下:

XposedHelpers.findAndHookMethod(clazz, "test", new XC_MethodHook(){

public void beforeHookedMethod(MethodHookParam param){

Log.d("Lvmeng","Lvmeng===============before");

}

public void afterHookedMethod(MethodHookParam param){

Log.d("Lvmeng","Lvmeng=============after");

}

});

其中beforeHookedMethod 会在调用原方法前执行,如果使用setResult则跳过原方法,并返回setResult参数中的值。

afterHookedMethod 会在调用原方法后执行,setResult可改变返回值。

replaceHookedMethod 会完全替换原方法,即原方法不执行,且返回值可以直接return,setResult不生效。

然后将写好的xposed编译安装到xposed后,勾选上写好的xposed模块,并重启手机,然后运行app,打开ddms,点击button按钮,查看ddms中日志情况如下,可以发现test()函数已经被成功hook,并且添加上两条日志信息

0x03 Hook获取参数与返回值

Hook获取参数是方法中要传入的参数,我们也是可以在beforeHookedMethod和afterHookedMethod方法中获取我们的参数值,其hook代码如下:

XposedHelpers.findAndHookMethod(clazz, "publicFunc",String.class, new XC_MethodHook(){

public void beforeHookedMethod(MethodHookParam param){

Log.d("Lvmeng","Lvmeng===============before");

Log.d("before-获取参数", ""+param.args[0]);

}

public void afterHookedMethod(MethodHookParam param){

Log.d("Lvmeng","Lvmeng=============after");

Log.d("after-获取参数", ""+param.args[0]);

}

});

其中,我们hook的方法是publicFunc,查看代码可以发现该方法是接收参数的,如图所示:

然后安装运行后的日志信息如下:

Hook获取返回值一般都是在afterHookedMethod方法中,Hook的代码如下:

public void afterHookedMethod(MethodHookParam param){

Log.d("Lvmeng", ""+param.getResult());

}

在这里不再进行演示获取返回值,有兴趣的小伙伴可以下去自行测试。

0x04 Hook构造函数

Hook构造函数可分为有参构造函数前、无参构造函数前、有参构造函数后和无参构造函数后。这里Hook构造函数使用的是XposedHelpers下的findAndHookConstructor,详细代码如下:

XposedHelpers.findAndHookConstructor(clazz, new XC_MethodHook() {

public void beforeHookedMethod(MethodHookParam param) throws Throwable {

Log.d("===================", "这是无参构造函数前");

}

public void afterHookedMethod(MethodHookParam param) throws Throwable {

Log.d("===================", "这是无参构造函数后");

XposedHelpers.setIntField(param.thisObject, "publicInt", 20000000);

}

});

XposedHelpers.findAndHookConstructor(clazz, String.class, new XC_MethodHook() {

public void beforeHookedMethod(MethodHookParam param) throws Throwable {

Log.d("===================", "这是有参构造函数前");

param.args[0] = "= - =";

}

public void afterHookedMethod(MethodHookParam param) throws Throwable {

Log.d("===================", "这是有参构造函数后");

}

});

然后安装运行后的Hook日志如下:

xposed构造函数
本作品采用《CC 协议》,转载必须注明作者和本文链接
也请勿将相关技术用于非法操作,否则责任自负。
Activity漏洞挖掘详解
2021-10-18 16:22:12
2Activity漏洞初步介绍1.Activity基本介绍在学习Activity的漏洞挖掘之前,我们先对Activity的基本运行原理有一个初步的认识。
一前言为了帮助更加方便的进行漏洞挖掘工作,前面我们通过了几篇文章详解的给大家介绍了动态调试技术、过反调试技术、Hook技术、过反Hook技术、抓包技术等,掌握了这些可以很方便的开展App漏洞挖掘工作,而最后我们还需要掌握一定的脱壳技巧,进行进一步助力我们漏洞挖掘的效率。本文第二节主要讲述Android启动流程和加壳原理。本文第三节主要介绍整体加壳的实现。本文第四节主要讲当下脱壳点的概念。
Xposed检测绕过
2023-03-06 14:36:15
分享一些Xposed检测绕过的总结,很多加壳软件检测到xposed就会杀死当前软件进程。
最近在学习Android APP客户端漏洞挖掘过程中,对Android APP端漏洞挖掘做了一个基本的梳理总结本节主要是在介绍Android APP漏洞挖掘过程中,使用常见的Android漏洞挖掘工具的安装和使用办法,帮助Android漏洞挖掘人员提供便利。本文里面一部分的介绍采摘与网络博客,大家可以点击对应的网址进行查看。
某加速器APP分析
2023-07-14 09:51:27
(这样检测是因为正常手机不会是intel或AMD型号的CPU。② 修改对应的smali语句,将eqz修改成nez。这里将eqz改成nez即可绕过检测。解码后结果是乱码。
VX小程序逆向分析
2023-06-29 09:16:31
Frida虽然确实调试起来相当方便,但是Xposed由于能够安装在用户手机上实现持久化的hook,至今受到很多人的青睐,对于微信小程序的wx.request API。背景知识众所周知,Xposed主要用于安卓Java层的Hook,而微信小程序则是由JS编写的,显然无法直接进行hook。对于Xposed则没有这个问题,只需指定微信的包名就会自动hook上所有的子进程。答案是可以的,如下所示:Xposed hook wx.request java层代码得到发送的数据实现如下所示:得到响应数据的Xposed代码就不贴了,方法同上。
前言市面的Android模拟器大多为游戏而定制,几乎没有使用原生AOSP并提供root和拓展性(可安装xpo
Frida工作原理学习
2022-07-12 16:28:29
frida是一款便携的、自由的、支持全平台的hook框架,可以通过编写JavaScript、Python代码来和frida_server端进行交互,还记得当年用xposed时那种写了一大堆代码每次修改都要重新打包安装重启手机、那种调试调到头皮发麻的痛苦,百分之30的时间都是在那里安装重启安装重启。
记一次试岗实战项目
2023-05-06 09:12:33
试岗项目项目内容开发一个 xposed 插件,可以在 whatsApp 中导入通讯录功能,输入是手机号,输出是这个手机号对应的id和个人信息,对方还跟贴心的给出了项目预览图,应该是对方近期接到的项目,也可以看出对方没有白嫖我的意思。关键代码定位点开APP随便浏览了一下功能,根据对方给出的预览图,可以知道首先是需要定位这个界面的 onCreat 界面,首先考虑的就是直接搜字符串,比如“邀请使用”这四个字,但是拖入 jadx 一番搜索后什么也没有。
一颗小胡椒
暂无描述