记录这个问题的起因是,在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的最终方案的更多相关文章

  1. 基于frida框架Hook native中的函数(1)

    作者:H01mes撰写的这篇关于frida框架hook native函数的文章很不错,值得推荐和学习,也感谢原作者. 0x01 前言 关于android的hook以前一直用的xposed来hook j ...

  2. android hook native函数

    大概2年前写的代码,今天突然要用到,找了半天,这里记录下 用到的库: https://pan.baidu.com/s/1htuUQX2 #include <jni.h> #include ...

  3. Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  4. Android Native层异步消息处理框架

     *本文系作者工作学习总结,尚有不完善及理解不恰当之处,欢迎批评指正* 一.前言 在NuPlayer中,可以发现许多类似于下面的代码: //============================== ...

  5. Android hook神器frida(二)

    1.关于使用frida遇到的一些问题 (1)如果出现以下错误: 可以通过以下方式关闭SELinux,在adb shell中执行: > /sys/fs/selinux/enforce 或者 set ...

  6. 在Android Native层中创建Java虚拟机实例

    前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...

  7. Android native层动态库注射

    1.简单介绍 本文解说在Android native层.root权限下.注射动态库到目标进程,从而hook目标进程中动态库的函数的实现方式. 文中的源代码所有来源于网络.我仅仅是略微加以整理. 环境: ...

  8. Android C/C++层hook和java层hook原理以及比较

    作者:Denny Qiao(乔喜铭),云智慧/架构师. 云智慧集团成立于2009年,是全栈智能业务运维解决方案服务商.经过多年自主研发,公司形成了从IT运维.电力运维到IoT运维的产业布局,覆盖ITO ...

  9. Android Java层,Native层,Lib层打印Log简介【转】

    本文转载自:https://blog.csdn.net/AndroidMage/article/details/52225068 说明: 这里我根据个人工作情况说明在各个层打印log.如有问题欢迎拍砖 ...

随机推荐

  1. Netty之揭开BootStrap 的神秘面纱

    客户端BootStrap: Bootstrap 是Netty 提供的一个便利的工厂类, 我们可以通过它来完成Netty 的客户端或服务器端的Netty 初始化.下面我先来看一个例子, 从客户端和服务器 ...

  2. ubuntu server 12.04安装任何软件都出现the following packages have unmet dependencies的解决方法

    虽然目前没太弄清这到底是怎么回事,但是暂时可以给出一个解决的方法, 如果在安装任何软件都会出现这个问题,那么尝试着输入sudo apt-get install -f试一下. 在该命令执行完成后,我这边 ...

  3. [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)

    Solution: ​ 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] ​ 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...

  4. 【洛谷p1464】 Function

    中考第一天: 感觉我超废: 就是看这道题特别顺眼emmm SOLUTION: 思路的话是开三维数组s[i][j][k],先三重for循环预处理出s[0~20][0~20][0~20]的w(a,b,c) ...

  5. Codeforces 1061C (DP+滚动数组)

    题面 传送门 分析 考虑DP 设\(dp[i][j]\)表示前i个数选出的序列长度为j的方案数 状态转移方程为: \[ dp[i][j]= \begin{cases}dp\left[ i-1\righ ...

  6. 设置第一个以外的元素样式:not(:first-child),设置最后一个除外的元素样式:not(:last-child)

    代码截图:

  7. JSTL获取list的大小

    转自:https://blog.csdn.net/buster2014/article/details/45789647 JSTL获取list的大小,jstl获取list 的长度,EL表达式获取lis ...

  8. 98-基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡)

    基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡) 1.板卡概述  板卡采用xilinx Spartan6系列芯片,支持 PCI Express Base Specificatio ...

  9. Go 使用切片

    1.使用切片字面量来声明切片 // 创建一个整型切片 // 其容量和长度都是 5 个元素 slice := [], , , , } // 改变索引为 1 的元素的值 slice[] = 2.使用切片创 ...

  10. javascript实现下拉菜单的显示与隐藏

    demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...