Frida Android hook native层__system_property_get的最终方案
记录这个问题的起因是,在hook时遇到了修改内容长度,超过原长度时,会出现显示不全的问题。
比如把nexus 5改成nexus 100,只会显示nexus 1。
所以去读了下源码
int __system_property_read(const prop_info *pi, char *name, char *value)
{
unsigned serial, len;
for(;;) {
serial = pi->serial;
while(SERIAL_DIRTY(serial)) {
__futex_wait((volatile void *)&pi->serial, serial, );
serial = pi->serial;
}
len = SERIAL_VALUE_LEN(serial);
memcpy(value, pi->value, len + );
if(serial == pi->serial) {
if(name != ) {
strcpy(name, pi->name);
}
return len;
}
}
}
int __system_property_get(const char *name, char *value)
{
const prop_info *pi = __system_property_find(name);
if(pi != ) {
return __system_property_read(pi, , value);
} else {
value[] = ;
return ;
}
}
可以看到源码中get调用了read来读value,传进去了find返回的指针,但是name给的是0,所以在read中没法直接判断读的是哪个key,还是要hook get。
而长度的限制来自read内部的len实现,不能通过改参数的办法修改,所以用了个别扭的方法先修改了read返回值的长度,再修改get的value,脚本如下:
Interceptor.attach(Module.findExportByName("libc.so", "__system_property_read"), {
onEnter: function (args) {
//sLog("__system_property_read onEnter " + Memory.readCString(args[0]));
},
onLeave: function (retval) {
//sLog(retval)
retval.replace(0x5b);//修改read的返回值
}
});
var str = ""
var args2 = "";
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) {
var before = getStr(args2)
putStr(args2, "05b3c6d30a280000")
sLog(str + " " + before + " 改成 " + getStr(args2));
}
}
}
});
其中hook read的返回值长度不是乱写的,因为system_properties.h源码中有限制最大长度
#define PROP_NAME_MAX 32
#define PROP_VALUE_MAX 92
hex(92) = '0x5c'
所以我把read的返回值改成了0x5b,减了1,肯定也够用了。
源码全文参考
https://android.googlesource.com/platform/bionic/+/0d787c1fa18c6a1f29ef9840e28a68cf077be1de/libc/bionic/system_properties.c
https://android.googlesource.com/platform/bionic/+/49f0a8f23bba188466c6ee3652858ef4da228c6f/libc/include/sys/system_properties.h
Frida Android hook native层__system_property_get的最终方案的更多相关文章
- 基于frida框架Hook native中的函数(1)
作者:H01mes撰写的这篇关于frida框架hook native函数的文章很不错,值得推荐和学习,也感谢原作者. 0x01 前言 关于android的hook以前一直用的xposed来hook j ...
- android hook native函数
大概2年前写的代码,今天突然要用到,找了半天,这里记录下 用到的库: https://pan.baidu.com/s/1htuUQX2 #include <jni.h> #include ...
- Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解
一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...
- Android Native层异步消息处理框架
*本文系作者工作学习总结,尚有不完善及理解不恰当之处,欢迎批评指正* 一.前言 在NuPlayer中,可以发现许多类似于下面的代码: //============================== ...
- Android hook神器frida(二)
1.关于使用frida遇到的一些问题 (1)如果出现以下错误: 可以通过以下方式关闭SELinux,在adb shell中执行: > /sys/fs/selinux/enforce 或者 set ...
- 在Android Native层中创建Java虚拟机实例
前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...
- Android native层动态库注射
1.简单介绍 本文解说在Android native层.root权限下.注射动态库到目标进程,从而hook目标进程中动态库的函数的实现方式. 文中的源代码所有来源于网络.我仅仅是略微加以整理. 环境: ...
- Android C/C++层hook和java层hook原理以及比较
作者:Denny Qiao(乔喜铭),云智慧/架构师. 云智慧集团成立于2009年,是全栈智能业务运维解决方案服务商.经过多年自主研发,公司形成了从IT运维.电力运维到IoT运维的产业布局,覆盖ITO ...
- Android Java层,Native层,Lib层打印Log简介【转】
本文转载自:https://blog.csdn.net/AndroidMage/article/details/52225068 说明: 这里我根据个人工作情况说明在各个层打印log.如有问题欢迎拍砖 ...
随机推荐
- Netty之揭开BootStrap 的神秘面纱
客户端BootStrap: Bootstrap 是Netty 提供的一个便利的工厂类, 我们可以通过它来完成Netty 的客户端或服务器端的Netty 初始化.下面我先来看一个例子, 从客户端和服务器 ...
- ubuntu server 12.04安装任何软件都出现the following packages have unmet dependencies的解决方法
虽然目前没太弄清这到底是怎么回事,但是暂时可以给出一个解决的方法, 如果在安装任何软件都会出现这个问题,那么尝试着输入sudo apt-get install -f试一下. 在该命令执行完成后,我这边 ...
- [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)
Solution: 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...
- 【洛谷p1464】 Function
中考第一天: 感觉我超废: 就是看这道题特别顺眼emmm SOLUTION: 思路的话是开三维数组s[i][j][k],先三重for循环预处理出s[0~20][0~20][0~20]的w(a,b,c) ...
- Codeforces 1061C (DP+滚动数组)
题面 传送门 分析 考虑DP 设\(dp[i][j]\)表示前i个数选出的序列长度为j的方案数 状态转移方程为: \[ dp[i][j]= \begin{cases}dp\left[ i-1\righ ...
- 设置第一个以外的元素样式:not(:first-child),设置最后一个除外的元素样式:not(:last-child)
代码截图:
- JSTL获取list的大小
转自:https://blog.csdn.net/buster2014/article/details/45789647 JSTL获取list的大小,jstl获取list 的长度,EL表达式获取lis ...
- 98-基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡)
基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡) 1.板卡概述 板卡采用xilinx Spartan6系列芯片,支持 PCI Express Base Specificatio ...
- Go 使用切片
1.使用切片字面量来声明切片 // 创建一个整型切片 // 其容量和长度都是 5 个元素 slice := [], , , , } // 改变索引为 1 的元素的值 slice[] = 2.使用切片创 ...
- javascript实现下拉菜单的显示与隐藏
demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...