前言
众所周知xposed只能hook java层。
那就不能hook so吗?
那就得搞xposed+
可+的方案有点多,今天来试试ele7的InlineHook
参考视频及项目及文献
Android Inline Hook详解
想看原理点这个↑
(安卓逆向进阶视频)03_ART实现XpHookNaitive兼容安卓10
想看视频点这个↑
下面是参考的github项目:
ele7的原项目
ele7的dome项目
珍惜的dome 这个主要解决的有个安卓版本不同注入方式不同的问题
人话讲原理
就是用C++写了个so文件,此处命名为Aso,原APP要调用的so此处命名为Bso,
- 先用xposed hook住原APP加载Bso的流程,不让其加载
- 然后读到Aso的路径,让原APP加载Aso,实现了替换
- 然后Aso再去调用Bso,就可在指令前后想咋搞就咋搞了
方案开始
首先是hook的目标,我选择的是我自己的设备检测github项目
不出意外我会更新。想要这个版本可以找历史提交记录 找到2022年2月23日提交的那版。
deviceDetection 设备检测---检测鸡
大概样子就长这样,然后箭头指向的值就是我要改的值,图中是已经改好的。本来就没调试应该是0 我给改成了339.
然后是我的hook项目
https://github.com/mengmugai/HookTracerPid
讲解
因为代码都在里面的自己看就行,这里大概说一下。
生成so
首先是CMakeLists.txt
文件定义好,生成的so名字就会为libLVmp.so
版本区别
因为android 9.0
以上没有 doLoad
方法,使用nativeLoad
方法了。所有要进行判断。
int version = android.os.Build.VERSION.SDK_INT;
Log.e("当前系统 版本号 " + version);
//android 9.0没有 doLoad 方法
if (version >= 28) {
hook Runtime.class 的 nativeLoad方法{
if (如果是我要hook的so文件则){
加载我的`libLVmp.so`
}
}
else{
hook Runtime.class 的 doLoad方法{
if (如果是我要hook的so文件则){
加载我的`libLVmp.so`
}
}
}
大概就是这样。真是代码可以到github里面去看。
c++开发
JNI目录结构主要是把
inlinehook
目录搞来,然后我们主要是写main.cpp
首先加载走了
JNI_OnLoad
方法,然后调用into_TestSo
。image.png
image.png
然后就是我写的替换它的方法
int My_Java_com_mmg_detection_utils_DebugUtils_getTracerPid(JNIEnv *env, jobject thiz) {
int ret_value = Source_Java_com_mmg_detection_utils_DebugUtils_gettracerpid(env, thiz);
LOG(ERROR) << "返回值为:";
// LOGE(ret_value)
int my_ret_value=339;
if (ret_value!=0){
my_ret_value=0;
}
return my_ret_value;
}
手机就能看到改成339了。就是最开始那个图。
还有就是上面那个getAppSo()
方法也不是原有的 自己写的
总结及提醒:
- 本文还是要与github项目一同看才好理解。
- 这个只支持32位的hook。64位不可。
- 包括我的设备检测的项目也是64位的。也不行。所以要强制安装32位app 命令如下:
-
adb install --abi armeabi-v7a -r app-debug.apk
编译好不运行 而是用这个命令安装
- so hook 方案 还有很多
- Cydia Substrate
- xHook 这是爱奇艺开发的got表hook框架 原理又不一样了
- Dobby
- android-inline-hook 这个跟ele7的同名 但是是字节跳动开发的 而且支持64位。
- SandHook
网友评论