首页
社区
课程
招聘
[求助]关于android开发遍历进程maps
发表于: 2015-2-3 10:32 13703

[求助]关于android开发遍历进程maps

2015-2-3 10:32
13703
才接触android开发不久,最近遇到一个问题。
开发一个遍历进程maps的功能,读取/proc/pid/maps 这个文件。NDK编译成独立运行文件可以正常读取遍历,但是放到apk中作为共享库使用,却老是read的时候返沪-1。设备已经root,apk也获取了root权限。怀疑还是权限的问题,就是不知道是什么原因的问题,麻烦大家帮忙看看。
贴下关键代码
#define CAT_BUFSIZ (4096)

int raw_cat(int rfd, char * filename) {
        static char *buf = NULL;
        static char fb_buf[CAT_BUFSIZ];
        static size_t bsize;
        ssize_t nr, nw, off;
        buf = fb_buf;
        bsize = CAT_BUFSIZ;
        LOGI("begin read");
        while ((nr = read(rfd, buf, bsize)) > 0) {
                for (off = 0; nr; nr -= nw, off += nw) {
                        LOGI("%s", buf + off);
                }
        }
        if (nr < 0) {
                LOGE("%s: invalid %d", filename, nr);
        }
        return 0;
}

int proc_maps(int pid) {

        char filename[64];
        register int i;
        int ret;
        int fd;

        sprintf(filename, "/proc/%d/maps", pid);
        LOGI("open %s",filename);
        fd = open(filename, O_RDONLY);
        if (fd == -1){
                LOGI("open %s failed",filename);
                return 0;
        }

        raw_cat(fd, filename);
        close(fd);
        return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1、 不管是Linux 还是Windows ,使用API出错时, 记得打印错误码。

2、把你获取root权限的代码贴出来。

3、证明你现在是不是root . 使用getuid 看看ID就知道了。
2015-2-3 11:01
0
雪    币: 36
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
public static boolean RootCommand(String command)
    {
        Process process = null;
        DataOutputStream os = null;
        try
        {
               
            process = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(command + "\n");
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();
        } catch (Exception e)
        {
            Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
            return false;
        } finally
        {
            try
            {
                if (os != null)
                {
                    os.close();
                }
                process.destroy();
            } catch (Exception e)
            {
            }
        }
        Log.d("*** DEBUG ***", "Root SUC ");
        return true;
    }
这是root代码
错误号是 13
getuid 10035
2015-2-3 11:24
0
雪    币: 36
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#define CAT_BUFSIZ (4096)

int raw_cat(int rfd, char * filename) {
        static char *buf = NULL;
        static char fb_buf[CAT_BUFSIZ];
        static size_t bsize;
        ssize_t nr, nw, off;
        buf = fb_buf;
        bsize = CAT_BUFSIZ;
        LOGI("begin read");
        while ((nr = read(rfd, buf, bsize)) > 0) {
                for (off = 0; nr; nr -= nw, off += nw) {
                        LOGI("%s", buf + off);
                }
        }
        if (nr < 0) {
                LOGE("%s: invalid %d error %d", filename, nr, errno);
        }
        return 0;
}

Json::Value proc_maps(int pid) {

        char filename[64];
        register int i;
        int ret;
        int fd;

        sprintf(filename, "/proc/%d/maps", pid);
        LOGI("open %s", filename);
        fd = open(filename, O_RDONLY);
        if (fd == -1) {
                LOGI("open %s failed error %d", filename, errno);
                return Json::Value::null;
        }

        Json::Value root;
        raw_cat(fd, filename);
        close(fd);
        return root;
}
完整代码
2015-2-3 11:25
0
雪    币: 36
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
确实是权限问题,求教下,该怎么解决,感觉root代码有问题?,设备确实是root了,其他root软件都能正常工作,自己的软件也弹出了root 框
2015-2-3 11:34
0
雪    币: 36
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
应该是有root权限,取消掉root权限代码,open /proc/pid/maps 都会出权限问题,有root代码情况下,打开可以,但是读取的时候,会出权限问题,用root explorer文件管理器获取root权限浏览,也无法获取到maps的内容
2015-2-3 12:25
0
雪    币: 36
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看了下su源代码,原因找到了
Android中App授权获取Root权限,其实不是App自身的权限提升了,而是通过具有ROOT权限的sh流来执行shell命令
明白为什么ida没有做一个APK来实现server了,而只是一个可执行文件。
uid上的限制导致 read失败
2015-2-3 13:34
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2015-2-13 09:23
0
雪    币: 44
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大哥ida调试安卓,用命令行的方式,这都被你想出原因是这个啊,但是我不能理解啊,为啥只能是命令获得了权限呢,这样如果我要写个app,来执行你上面那个读写maps文件的那段c代码可咋办!
2016-1-7 14:46
0
雪    币: 13
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
请问有完整demo吗
2019-9-10 14:57
0
游客
登录 | 注册 方可回帖
返回
//