记录这个问题的起因是,在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

最新文章

  1. CSS3动画效果-7.13
  2. dynamoDb 使用
  3. 斯坦福公开课:Statistical Learning中做错的选择题
  4. HTTP协议学习---(七)代理
  5. noip2008解题报告
  6. xss跨站攻击测试代码
  7. Oracle EBS环境下查找数据源(OAF篇)
  8. [Node.js] Configuring npm package.json scripts
  9. Android JNI之C/C++层调用JAVA
  10. mysql/Java服务端对emoji的支持
  11. POJ 2413 How many Fibs?#二分+大数加法
  12. Java中enum的学习总结
  13. 对于python爬虫urllib库的一些理解(抽空更新)
  14. 【Docker江湖】之docker部署与理解
  15. 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域
  16. Charles 安装图解(Mac 抓包工具)
  17. topcoder srm 687 div1
  18. 发布自己的npm包
  19. 针对开发项目的NABCD的分析
  20. Spring Maven项目集成Springboot

热门文章

  1. EasyUI:Cannot read property 'width' of null
  2. Netty之Page级别的内存分配
  3. CodeChef GCD2
  4. MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则
  5. shell脚本从入门到精通(初级)之入门篇
  6. JSON —— 序列化与反序列化
  7. Tomcat的用途
  8. openstack stein部署手册 1. 准备
  9. python断言语句assert
  10. Sass-unitless()函数