Android 使用ptrace查看其它进程的内存数据

原文地址:http://blog.csdn.net/mldxs/article/details/14486827

Andorid通过C code获取其它进程C code中的内存数据。且此代码在32位CPU上可以,但在64位上寻找内存地址的方法需要相应变动。



由于android是基于linux系统的,下面使用的是ptrace监视其他进程的方式进行内存窥视的。


1、被监视进程

test_addr.c

  1. #include <stdio.h>  
  2. #include <sys/ptrace.h>  
  3.   
  4.   
  5. static uint16_t test = 0x17ce ;  
  6.   
  7.   
  8. int main(int argv , char **argc){  
  9.     printf("test address = %p\n" , &test) ;  
  10.     while(1){  
  11.         sleep(1000) ;  
  12.     }  
  13.     return 1 ;  
  14. }  

  • copy编译后的可执行文件test_addr到手机/data/local/tmp目录
  • chmod 755 /data/local/tmp/test_addr
  • /data/local/tmp/test_addr
  • 查看打印的test变量地址。本人的地址是(test address = 0x90e0)
  • ps 查看所有进程,找到test_addr对应的进程号。本人的是8124
  • 查看进程的地址空间ps /proc/8124/maps(这条ps命令我没执行成功,用的cat /proc/8124/maps反而能查看到类似如下的数据),如下:

[html]  view plain copy print ?
  1. 00008000-00009000 r-xp 00000000 b3:1a 261968     /data/local/tmp/test_addr  
  2. <span style="background-color:rgb(255,0,0)">00009000-0000a000 rw-p 00001000 b3:1a 261968     /data/local/tmp/test_addr</span>  
  3. 01e83000-01e84000 rw-p 00000000 00:00 0          [heap]  
  4. b6f0a000-b6f0b000 r--p 00000000 00:00 0  
  5. b6f0b000-b6f1c000 r--s 00000000 00:0b 5875       /dev/__properties__  
  6. b6f1c000-b6f34000 r-xp 00000000 b3:17 2066       /system/lib/libm.so  
  7. b6f34000-b6f35000 r--p 00017000 b3:17 2066       /system/lib/libm.so  
  8. b6f35000-b6f36000 rw-p 00018000 b3:17 2066       /system/lib/libm.so  
  9. b6f36000-b6f37000 r-xp 00000000 b3:17 2298       /system/lib/libstdc++.so  
  10. b6f37000-b6f38000 r--p 00000000 b3:17 2298       /system/lib/libstdc++.so  
  11. b6f38000-b6f39000 rw-p 00001000 b3:17 2298       /system/lib/libstdc++.so  
  12. b6f39000-b6f7f000 r-xp 00000000 b3:17 1844       /system/lib/libc.so  
  13. b6f7f000-b6f81000 r--p 00045000 b3:17 1844       /system/lib/libc.so  
  14. b6f81000-b6f83000 rw-p 00047000 b3:17 1844       /system/lib/libc.so  
  15. b6f83000-b6f91000 rw-p 00000000 00:00 0  
  16. b6f92000-b6f93000 r--p 00000000 00:00 0  
  17. b6f93000-b6fa2000 r-xp 00000000 b3:17 592        /system/bin/linker  


静态初始化变量test应该存放在数据段,上面标红的那一行。地址空间是9000-a000


2、监视进程:

search_mem.c

  1. #include <stdio.h>  
  2. #include <sys/ptrace.h>  
  3.   
  4. int main(int argv , char **argc){  
  5.   
  6.     uint8_t data ;  
  7.     int stat ;  
  8.     int pid = atoi(argc[1]) ;  
  9.     ptrace(PTRACE_ATTACH, pid, NULL, NULL) ;  
  10.     wait(&stat) ;    // 如果不wait,马上进行下一个ptrace的PEEK操作会造成 no such process 错误  
  11.     int addr = 0x00009000 ;  
  12.     for (; addr < 0x0000a000; ++addr)  
  13.     {  
  14.         data = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);    // 一次读一个字节  
  15.         if(data == 0x17 || data == 0xce){  
  16.             printf("data = %x , addr = %x\n" , data , addr) ;  
  17.         }     
  18.     }  
  19.       
  20.     ptrace(PTRACE_DETACH, pid, NULL, NULL);  
  21.   
  22.     return 1 ;  
  23. }  


对上面的代码稍微解释一下,其实很简单:

  • ptrace:PTRACE_ATTACH表示我们要attach到一个进程上,pid为我们要监视的进程id(本文为8124)。
  • ptrace:PTRACE_PEEKDATA,每次返回一个字节,addr标示我们要获取的data的内存地址。
  • 我们循环所有数据段的内存,来查找内容为0x17ce的变量地址是多少(本文地址范围为9000-a000)。

编译search_mem.c

copy编译后的可执行文件到/data/local/tmp/search_mem

chmod 755 /data/local/tmp/search_mem

执行:/data/local/tmp/search_mem


本人的执行结果如下:

data = 17 , addr = 9030
data = ce , addr = 90e0
data = 17 , addr = 90e1

很明显内容是0x17ce的变量地址应该是0x000090e0。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值