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


1、被监视进程

test_addr.c

#include #include static uint16_t test = 0x17ce ;int main(int argv , char **argc){printf("test address = %p\n" , &test) ;while(1){sleep(1000) ;}return 1 ;}

  • 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,如下:

00008000-00009000 r-xp 00000000 b3:1a 261968     /data/local/tmp/test_addr00009000-0000a000 rw-p 00001000 b3:1a 261968     /data/local/tmp/test_addr01e83000-01e84000 rw-p 00000000 00:00 0          [heap]b6f0a000-b6f0b000 r--p 00000000 00:00 0b6f0b000-b6f1c000 r--s 00000000 00:0b 5875       /dev/__properties__b6f1c000-b6f34000 r-xp 00000000 b3:17 2066       /system/lib/libm.sob6f34000-b6f35000 r--p 00017000 b3:17 2066       /system/lib/libm.sob6f35000-b6f36000 rw-p 00018000 b3:17 2066       /system/lib/libm.sob6f36000-b6f37000 r-xp 00000000 b3:17 2298       /system/lib/libstdc++.sob6f37000-b6f38000 r--p 00000000 b3:17 2298       /system/lib/libstdc++.sob6f38000-b6f39000 rw-p 00001000 b3:17 2298       /system/lib/libstdc++.sob6f39000-b6f7f000 r-xp 00000000 b3:17 1844       /system/lib/libc.sob6f7f000-b6f81000 r--p 00045000 b3:17 1844       /system/lib/libc.sob6f81000-b6f83000 rw-p 00047000 b3:17 1844       /system/lib/libc.sob6f83000-b6f91000 rw-p 00000000 00:00 0b6f92000-b6f93000 r--p 00000000 00:00 0b6f93000-b6fa2000 r-xp 00000000 b3:17 592        /system/bin/linker


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


2、监视进程:

search_mem.c

#include #include int main(int argv , char **argc){uint8_t data ;int stat ;int pid = atoi(argc[1]) ;ptrace(PTRACE_ATTACH, pid, NULL, NULL) ;wait(&stat) ;    // 如果不wait,马上进行下一个ptrace的PEEK操作会造成 no such process 错误int addr = 0x00009000 ;for (; addr < 0x0000a000; ++addr){data = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);    // 一次读一个字节if(data == 0x17 || data == 0xce){printf("data = %x , addr = %x\n" , data , addr) ;}}ptrace(PTRACE_DETACH, pid, NULL, NULL);return 1 ;}


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

  • 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. Android中关于cpu/cpuset/schedtune的应用
  2. Android(安卓)内存相关 onTrimMemory,onLowMemory,MemoryInfo()
  3. Android的内存管理机制
  4. Android进程间通信(IPC)
  5. Mac OS下配置 ADB环境变量
  6. Android(安卓)消息机制 进程调度问题
  7. Android(安卓)电子罗盘开发。
  8. Activity 属性设置大全
  9. Android常用开源框架

随机推荐

  1. Android 生成图标的有力工具 Android Ass
  2. android 读取根目录下的文件或文件夹
  3. Android在启动adb时失败解决方案
  4. 【Android】获取控件的宽和高
  5. [置顶] 找到一个在Android上创建阻塞式模
  6. Android横竖屏的写法、及savedInstanceSt
  7. HTML5 Cache, Android(安卓)WebView
  8. 极光推送集成
  9. android c 如何规避Wunused-parameter等
  10. 实例教程十:监听ContentProvider中数据的