Android 使用ptrace查看其它进程的内存数据
2015-07-17 11:39
579 查看
原文地址:http://blog.csdn.net/mldxs/article/details/14486827
Andorid通过C code获取其它进程C code中的内存数据。且此代码在32位CPU上可以,但在64位上寻找内存地址的方法需要相应变动。
由于android是基于linux系统的,下面使用的是ptrace监视其他进程的方式进行内存窥视的。
[cpp] view
plaincopyprint?
#include <stdio.h>
#include <sys/ptrace.h>
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(这条ps命令我没执行成功,用的cat /proc/8124/maps反而能查看到类似如下的数据),如下:
[html] view
plaincopyprint?
00008000-00009000 r-xp 00000000 b3:1a 261968 /data/local/tmp/test_addr
<span style="background-color:rgb(255,0,0)">00009000-0000a000 rw-p 00001000 b3:1a 261968 /data/local/tmp/test_addr</span>
01e83000-01e84000 rw-p 00000000 00:00 0 [heap]
b6f0a000-b6f0b000 r--p 00000000 00:00 0
b6f0b000-b6f1c000 r--s 00000000 00:0b 5875 /dev/__properties__
b6f1c000-b6f34000 r-xp 00000000 b3:17 2066 /system/lib/libm.so
b6f34000-b6f35000 r--p 00017000 b3:17 2066 /system/lib/libm.so
b6f35000-b6f36000 rw-p 00018000 b3:17 2066 /system/lib/libm.so
b6f36000-b6f37000 r-xp 00000000 b3:17 2298 /system/lib/libstdc++.so
b6f37000-b6f38000 r--p 00000000 b3:17 2298 /system/lib/libstdc++.so
b6f38000-b6f39000 rw-p 00001000 b3:17 2298 /system/lib/libstdc++.so
b6f39000-b6f7f000 r-xp 00000000 b3:17 1844 /system/lib/libc.so
b6f7f000-b6f81000 r--p 00045000 b3:17 1844 /system/lib/libc.so
b6f81000-b6f83000 rw-p 00047000 b3:17 1844 /system/lib/libc.so
b6f83000-b6f91000 rw-p 00000000 00:00 0
b6f92000-b6f93000 r--p 00000000 00:00 0
b6f93000-b6fa2000 r-xp 00000000 b3:17 592 /system/bin/linker
静态初始化变量test应该存放在数据段,上面标红的那一行。地址空间是9000-a000
[cpp] view
plaincopyprint?
#include <stdio.h>
#include <sys/ptrace.h>
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。
Andorid通过C code获取其它进程C code中的内存数据。且此代码在32位CPU上可以,但在64位上寻找内存地址的方法需要相应变动。
由于android是基于linux系统的,下面使用的是ptrace监视其他进程的方式进行内存窥视的。
1、被监视进程
test_addr.c[cpp] view
plaincopyprint?
#include <stdio.h>
#include <sys/ptrace.h>
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(这条ps命令我没执行成功,用的cat /proc/8124/maps反而能查看到类似如下的数据),如下:
[html] view
plaincopyprint?
00008000-00009000 r-xp 00000000 b3:1a 261968 /data/local/tmp/test_addr
<span style="background-color:rgb(255,0,0)">00009000-0000a000 rw-p 00001000 b3:1a 261968 /data/local/tmp/test_addr</span>
01e83000-01e84000 rw-p 00000000 00:00 0 [heap]
b6f0a000-b6f0b000 r--p 00000000 00:00 0
b6f0b000-b6f1c000 r--s 00000000 00:0b 5875 /dev/__properties__
b6f1c000-b6f34000 r-xp 00000000 b3:17 2066 /system/lib/libm.so
b6f34000-b6f35000 r--p 00017000 b3:17 2066 /system/lib/libm.so
b6f35000-b6f36000 rw-p 00018000 b3:17 2066 /system/lib/libm.so
b6f36000-b6f37000 r-xp 00000000 b3:17 2298 /system/lib/libstdc++.so
b6f37000-b6f38000 r--p 00000000 b3:17 2298 /system/lib/libstdc++.so
b6f38000-b6f39000 rw-p 00001000 b3:17 2298 /system/lib/libstdc++.so
b6f39000-b6f7f000 r-xp 00000000 b3:17 1844 /system/lib/libc.so
b6f7f000-b6f81000 r--p 00045000 b3:17 1844 /system/lib/libc.so
b6f81000-b6f83000 rw-p 00047000 b3:17 1844 /system/lib/libc.so
b6f83000-b6f91000 rw-p 00000000 00:00 0
b6f92000-b6f93000 r--p 00000000 00:00 0
b6f93000-b6fa2000 r-xp 00000000 b3:17 592 /system/bin/linker
静态初始化变量test应该存放在数据段,上面标红的那一行。地址空间是9000-a000
2、监视进程:
search_mem.c[cpp] view
plaincopyprint?
#include <stdio.h>
#include <sys/ptrace.h>
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。
相关文章推荐
- Android新的漏洞的应用程序中的发现!
- Android ScrollView和ListView联用,且ListView可以下拉刷新和上拉加载
- 【Android Studio探索之路系列】之二:Android Studio软件安装
- 词典程序
- 如何有效避免android fragment失去状态
- 用FileExplorer查看android手机中的数据库
- 解决"Could not initialize class android.graphics.Typeface"
- Android操作系统软键盘的显示与隐藏
- Android 的监听Home键
- android OTA差分包的生成方法
- android eclipse xml不自动代码提示
- Android中LocalBroadcastManager的使用
- Android studio各种问题
- android如何更新
- Android开发之Is Library篇
- WeakReference 在android中的应用
- Android动画之正弦曲线运动
- Android中Listview(四)--分组listview
- 智能储物柜/快递柜系统解析<二>
- Android笔记:inflate的三个参数及其用法