java层的hook现在对很多app已经免疫了,安卓的一些属性读取,可以通用
之前通过frida脚本来尝试了一下。
现在切到xp上
这个底层函数来读取。很多大型app都是这样读取的,当然还有一个oaid。
不过先尝试hook这个函数。尝试用xhook这个框架来搭配xposed使用。
看雪上也有篇文章介绍了原理:https://bbs.pediy.com/thread-265351.htm
官方文档介绍到xhook_register 这个函数。
new_func 必须具有和原函数同样的函数声明。
成功返回 0,失败返回 非0。
pathname_regex_str 只支持 POSIX BRE (Basic Regular Expression) 定义的正则表达式语法。
也就是利用了这一点,可以通用替换systemproperty的函数地址。
然后. 执行 hook
int xhook_refresh(int async);
根据前面注册的 hook 信息,执行真正的 hook 操作。
给 async 参数传 1 表示执行异步的 hook 操作,传 0 表示执行同步的 hook 操作。
成功返回 0,失败返回 非0。
xhook 在内部维护了一个全局的缓存,用于保存最后一次从 /proc/self/maps 读取到的 ELF 加载信息。每次一调用 xhook_refresh 函数,这个缓存都将被更新。xhook 使用这个缓存来判断哪些 ELF 是这次新被加载到内存中的。我们每次只需要针对这些新加载的 ELF 做 hook 就可以了。
实际上就可以利用这个,xphook住app的时候,就给他注入进去,从而达到替换函数地址,自己的进程也就能用这个函数了。
本次尝试就是单纯把大佬的代码抠了一遍实现。
xhook里的这些c文件,要改的就是biz.c。 也可以集成到自己的ndk里面。
这是部分代码,目的就是替换函数地址。
可单独用ndk-build编译一下,拿到对应架构的so文件,这里我继承到自己的xp插件中
包括一些ndk中静态注册的方法,也一定copy过来,官方给出的demo,说的很详细了。
一定要在app里面加载这个so文件。否则hook就会失效。
了解原理之后,目标是 手机查看器这个app。
核心就是这一串,phoneinfo就是各种手机信息,
抠了一串出来。hook到了这个进程之后,可以给个主动调用的条件。
启动的时候,原始的信息
然后调用一下,再去检测systemPropertyget试试
我这里就随便写了个接口来触发一下。
点击环境检测,可以看到,读出来的这些属性明显改变了
然后从日志中也能看出来,这些也是直接就改变了。
通用这种方式,也可以解决一些在ndk中读取属性的方式了。
又或者还有一种syscall读取的方式,这种就是究极怪物了。等我研究一哈再来。。。
XHOOK: https://github.com/iqiyi/xHook/blob/master/README.zh-CN.md
xposed-dy: https://github.com/Lstaynight/xposed-dy
system_property_get
Interceptor.attach(Module.findExportByName(
"libc.so"
,
"__system_property_get"
), {
onEnter: function (args) {
str
=
getStr(args[
0
]);
args2
=
ptr(args[
1
]);
},
onLeave: function (retval) {
if
(
str
) {
if
(
str
.indexOf(
"ro.serialno"
) !
=
-
1
) {
}
}
}
});
Interceptor.attach(Module.findExportByName(
"libc.so"
,
"__system_property_get"
), {
onEnter: function (args) {
str
=
getStr(args[
0
]);
args2
=
ptr(args[
1
]);
},
onLeave: function (retval) {
if
(
str
) {
if
(
str
.indexOf(
"ro.serialno"
) !
=
-
1
) {
}
}
}
});
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-7-30 16:39
被chionyuna编辑
,原因: 链接没显示