0x1 xposed简介
1.介绍
由于frida和objection每次都需要我们注入到app来对程序进行修改,有了xposed hook框架,我们可以编写xposed模块,实现对app的永久修改。
0x2 xposed原理
1.原理
所有的app都是通过zygote fork出来的,xposed通过替换zygote的进程文件app_process, 就实现了对所有app进程的控制。
0x3 xposed的使用
1.安装XposedInstaller_3.1.5.apk
1)打开模拟器,安装XposedInstaller_3.1.5.apk,运行,提示xposed框架未安装。
2)去https://dl-xda.xposed.info/framework/下载SDK,我们看到上一步的图片中API是25,所以这里下载x86版本的sdk25。
3)adb push /sdcard/Android/data/de.robv.android.xposed.installer/cache/downloads/framework,但是后面两个目录默认没有,需要我们手动创建一下。
1 2 3 4 5 6 7 8 | mount - o rw,remount /
cd / sdcard / Android / data / de.robv.android.xposed.installer / cache
mkdir downloads
cd downloads
mkdir framework
C:\Users\LENOVO\Desktop>adb push xposed - v89 - sdk25 - x86. zip / sdcard / Android / data / de.robv.android.xposed.installer / cache / downloads / framework
xposed - v89 - sdk25 - x86. zip : 1 file pushe...d. 27.3 MB / s ( 5206379 bytes in 0.182s )
|
4)如图所示,重启xposed,然后进行勾选,出现了安装/更新,右键instanll安装,然后会出现读取root权限的提示,这里选择允许,永久记住选择。
5)重启模拟器,显示已激活。
2.找到需要hook的函数
3.编写hook模块
0x4 实战
1.安装看雪KCTF-xposed.apk文件,打开,有签名校验。
2.还是通过Androidkiller反编译,找到函数入口点com.kanxue.xposed.MainActivity,然后找到签名类,找到函数.method public setRealCer(Ljava/lang/String;)V。
3.先去下载Android studio,之前下载过sdk,这里就不用再下载了,找到bin目录下idea.properties文件,末尾加一句disable.android.first.run=true,表示首次启动不检测sdk,进入软件后,依次指定jdk,sdk安装目录,下载必须的组件后就可以正常使用了。
https://www.androiddevtools.cn/
4.新建一个空白Android项目(java语言),切换到protect file,然后为模块编写做准备:
1)第一步:修改build.gradle文件添加依赖(打开app/build.gradle文件,找到dependencies在里面添加,添加完后右上边点一下sync now同步一下,会自动下载一些依赖包)
1 2 | compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
|
2)第二步:修改app/src/main/andoirmanifest.xml文件 在aplication中添加以下属性
1 2 3 4 5 6 7 8 9 | <meta - data
android:name = "xposedmodule" / / xposed模块
android:value = "true" / > / / 值为true,当我们安装xposed框架的时候就会认为这是一个xposed模块。
<meta - data
android:name = "xposeddescription" / / 关于这个xposed模块的描述
android:value = "description" / > / / 这个值我们可以自己改
<meta - data
android:name = "xposedminversion" / / 要求的最低版本,这里默认就好了
android:value = "82" / >
|
3)第三步:新建hook类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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;
/ / MyHook类名可以修改,但一定要和新建的类名一致
public class MyHook implements IXposedHookLoadPackage {
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName.equals( "包名" )) {
XposedHelpers.findAndHookMethod( "类名" , lpparam.classLoader, "函数名" , new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
Boolean result = true; / / 默认返回true
param.setResult(result);
}
});
};
}
}
|
将上面代码中的包名、类名、函数名替换成我们要hook的包名com.kanxue.xposed、类名com.kanxue.xposed.SignCheck、函数名check,默认返回值result是true,可以根据实际情况修改。
4)第四步:修改入口类
在main下新建assets目录,在assetss目录下新建xposed_init文件,添加入口类 com.example.hooksig.MyHook 根据实际情况添加入口类
5.准备工作完成,就可以点击build,build apk,生成apk文件,报错。
1 2 | > Could not resolve all files for configuration ':app:debugCompileClasspath' .
> Could not find de.robv.android.xposed:api: 82.
|
6.经过查询,依赖的第三方仓库已经改成了这个域名 api.xposed.info,修改全局的settings.gradle文件,然后重新点build apk,生成apk文件。
1 2 3 4 5 6 7 8 | allprojects {
repositories {
google()
mavenCentral()
/ / 添加此库
maven { url "https://api.xposed.info/" }
}
}
|
7.安装生成的apk模块,提示已安装,未激活,打开xposed框架,左上角点开,点模块,勾选激活,然后重启模拟器。
8.打开目标apk,发现签名校验已经绕过去了,还有root检测。
9.使用前面的方法,找到root检测的类和函数,继续修改hook代码:
10.使用前面的方法,找到flag判断的类和函数,继续修改hook代码:
0x5 总结
1.按照步骤来,生成apk一直报错,刚开始看到文章说要用本地的jar包,可是网上xposed:api:82.jar包都是收费的,最后找了一个54版本的jar,虽然成功编译了,但是达不到hook效果,一直没hook成功。
2.最后又看到说修改全局build.gradle文件,添加第三方依赖库,还是报错,说是要修改settings.gradle文件,最后终于成功了。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。