- 论坛徽章:
- 0
|
这个比较简单,可以通过检查该变量地址是否有可写属性
通过分析/proc/pid/maps文件可以得出
下面是实现:- int check_mem_wrtieable(unsigned long addr, int len)
- {
- pid_t pid ;
- char namemaps[64];
- unsigned long ulStartAddr, ulEndAddr, ulLastAddr;
- char access , buff[1024];
- FILE *pmap;
-
- pid = getpid();
- sprintf(namemaps, "/proc/%d/maps", pid);
-
- pmap = fopen(namemaps, "rb");
- if(pmap)
- {
- while(1)
- {
- if(NULL == fgets(buff, sizeof(buff)-1, pmap))
- {
- if(feof(pmap)) break;
- else
- {
- fclose(pmap);
- return 0;
- }
- }
-
- sscanf(buff, "%x-%x %*c%c", &ulStartAddr, &ulEndAddr, &access);
-
- if(addr <= ulEndAddr && addr >= ulStartAddr)
- {
- if('w' != access)
- {
- fclose(pmap);
- return 0;
- }
-
- if((addr + len) < ulEndAddr)
- {
- fclose(pmap);
- return 1;
- }
- else // 检查后面部分地址
- {
- ulLastAddr = ulEndAddr;
- len = len - (ulEndAddr - addr);
- addr = ulLastAddr;
- }
- }
- printf("%#x %#x %c\n", ulStartAddr, ulEndAddr, access);
- }
- }
-
- fclose(pmap);
- return 0;
- }
复制代码 |
|