android内存操作的问题!

发布于 2022-09-09 23:46:56 字数 1509 浏览 24 评论 9

本帖最后由 q1531 于 2010-06-03 17:54 编辑

机器是milestone 系统android2.1
由于需要想修改properties里的ro.secure为0,因为这个是以ro.开头的不能使用setprop设置。

网上找到的办法是修改boot的default.prop再刷入,但在milestone上总是不成功,把修改后的boot刷入bootloader就无法引导启动了。听说的Milestone锁了bootloader的缘故。修改后的无法输入运行。

所以想到了通过直接操作内存的办法来修改。
在模拟器上,cat /dev/mem>/sdcard/mem。pull出来然后用winhex查到了ro.secure的地址。写了一个小程序通过open /dev/mem,然后mmap,实现修改指定地址的内容。在模拟器上测试能够修改ro.secure的值,但一弄到milestone上后修改没成功,估计是在milestone上和模拟器你ro.secure所在的地址不一样。

在milestone上cat /dev/mem>/sdcard/mem,报错:invaild length.
写一个小程序读内存,在读取的时候出现:[1]+ Stopped (signal)  .......。在模拟器上能正常读取。

读取内存的部分代码。

fd=open("/dev/mem",O_RDWR);
data = (char *)mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);

for(i=0;i<len;i++)
{
   printf("mem[%d]:%c - 0x%xn", i, *(data+ i),*(data+ i));
}

//打开和mmap部分都成功。就在*(data+i)这里出问题。用memcpy,复制映射的内存到其他地方,也会出现同样的问题。

dmesg的信息:
<1>[  103.215057] Unhandled fault: external abort on non-linefetch (0x1018) at 0x40009400
<1>[  103.317413] Unhandled fault: external abort on non-linefetch (0x1018) at 0x40009400
<1>[  103.369201] Unhandled fault: external abort on non-linefetch (0x1018) at 0x40009400
<6>[  103.369903] Core dump to |/system/bin/coredump pipe failed

求解。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

笑咖 2022-09-20 06:21:05

我把char *改为int *,是不是刚好四字节??
但这样改后还是出现问题。

把时间冻结 2022-09-20 06:19:28

对齐就简单了,4个字节对齐。

旧故 2022-09-20 06:18:34

原因可能是 对齐 的问题!
但现在完全不清楚如何搞。。尝试了几种方法都不行。

自由如风 2022-09-20 06:12:02

顶了!  学习!!!

究竟谁懂我的在乎 2022-09-20 05:27:43

本帖最后由 q1531 于 2010-06-05 21:10 编辑

问题里的代码就是关键代码了。写一个简单的例子:

  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <memory.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. #include <sys/mman.h>
  8. #include <sys/types.h>
  9. #define        MEM_DEVICE        "/dev/mem"
  10. char *data;
  11. int main(int argc, char **argv)
  12. {
  13.        
  14.         int fd,i;
  15.         int size=512;
  16.         int offset=78848;
  17.         int offset_cut=offset%sysconf(_SC_PAGE_SIZE);
  18.         offset-=offset_cut;//offset必须是page_size的倍数
  19.         size+=offset_cut;
  20.        
  21.         fd=open(MEM_DEVICE,O_RDWR);
  22.         if(fd<0)
  23.         {
  24.                 printf("open error!n");
  25.                 close(fd);
  26.                 exit(-1);
  27.         }
  28.         data=(char *)mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
  29.         if(data == MAP_FAILED){
  30.                 printf("map failedn");
  31.                 close(fd);
  32.                 exit(-1);
  33.         }
  34.         close(fd);
  35.         data=data+offset_cut;
  36.         for(i=0;i<10;i++){
  37.                 printf("%c - 0x%xn",*(data+i),*(data+i));
  38.         }
  39.        
  40.         munmap(data-offset_cut, size);
  41.         return 1;
  42. }

复制代码在模拟器android2.1下运行的结果

# /data/prop
/data/prop
r - 0x72
o - 0x6f
. - 0x2e
s - 0x73
e - 0x65
c - 0x63
u - 0x75
r - 0x72
e - 0x65

在milestone上运行就和问题里出现的错误一样了。

瞎闹 2022-09-19 19:34:03

你们组还在做1.6?我们已经切换到2.0了,之前在做2.1。

孤单情人 2022-09-19 19:11:26

楼主有整套代码?

话少情深 2022-09-19 14:15:49

另外,运行的时候报了Bus error的错误!
难道是硬件方面的原因导致无法访问?

瑶笙 2022-09-18 14:05:34

帮你顶。我也想知道。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文