首页
社区
课程
招聘
[求助]关于使用PTRACE_PEEKDATA搜索内存效率的疑问
发表于: 2014-4-16 10:54 10292

[求助]关于使用PTRACE_PEEKDATA搜索内存效率的疑问

2014-4-16 10:54
10292
void search_process_mem(long pid, long addr_begin, long addr_end, long value, long read_count)
{
        char meminfo[128];
        ptrace(PTRACE_ATTACH, pid, NULL, NULL) ;
        waitpid(pid, NULL, 0);
        long data = 0;
        long addr = addr_begin;
        int handle;
        handle = fopen(MEM_INFO_FILE, "w");
        if (handle != NULL){
                for (; addr < addr_end; addr += read_count)
                {
                        data = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
                        if (data == value){
                                snprintf(meminfo, sizeof(meminfo), "%x:%x", addr, data);
                                int realWrite = fputs(meminfo, handle);
                        }
                }
        }
        ptrace(PTRACE_DETACH, pid, NULL, NULL);
        waitpid(pid, NULL, 0);
        fclose(handle);
}
贴代码,上面的代码用于搜索内存并输出到指定文件的,用八门神器搜40000000-42000000的内存只要1-2秒,用上面的代码搜内存要10多秒。
我试着打印了一下一小段搜索结果
40be1a40:40b5b548  0100 0000 1011 0101 1011 0101 0100 1000 4
40be1a44:4087f7fd 0100 0000 1000 0111 1111 0111 1111 1101 4
40be1a48:40be1978 0100 0000 1011 1110 0001 1001 0111 1000 4
40be1a4c:577c1f77 0101 0111 0111 1100 0001 1111 0111 0111 4
40be1a50:577e776c 0101 0111 0111 1110 0111 0111 0110 1100 4
40be1a54:18       0000 0000 0000 0000 0000 0000 0001 1000 1

40be1a58:40b469b8
40be1a5c:4087f7fd
40be1a60:40be1978
40be1a64:577cb54c
40be1a68:577e776c
40be1a6c:18

没能看出哪边可以优化的。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 438
活跃值: (93)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1、可以尝试先将数据复制到缓冲区,然后在搜索。
2、要考虑内存对齐情况,将被查找子串转换为4的倍数的数据(32位机),速度会大幅提升。
3、编译程序。也许楼主觉得这点是废话,其实不然,由于在IDE环境中程序被加入了调试信息,速度自然慢,编译后运行,提高的不只一个数量级。
2014-4-16 11:15
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你这加了写文件的操作。肯定会慢一些吧。
2014-4-16 11:25
0
雪    币: 31
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
关于第一点能不能说的具体一点哈?有没有相关的链接。
然后我这个程序已经编译成可执行文件,放在安卓手机上了,所以不存在调试信息影响速度的。
速度慢的原因应该是access_process_vm反复拷贝内存浪费了时间。
2014-4-16 16:59
0
雪    币: 31
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不写文件速度也是一样慢的哈,写文件只是方面java调用,我的测试数据能够匹配的只有一个。
2014-4-16 17:01
0
雪    币: 438
活跃值: (93)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
就是说一次或几次把内存copy出来,放到缓冲区里。比如用个数组存着,然后对缓冲区进行操作,就能够提速。
2014-4-17 09:00
0
雪    币: 7
活跃值: (268)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主请教个问题  
你的read_count 设置的是多少啊

这个问题你最后是怎么解决的啊
2016-3-10 21:09
0
游客
登录 | 注册 方可回帖
返回
//