Windows下面就不多说了:IsBadReadPtr,IsBadStringPtr,IsBadWritePtr。
Linux内核态可以用__access_ok函数来判断内存区域的访问性。
用户态自己写了一个,就是利用了段错误这个信号,然后处理这个信号。用siglongjmp和sigsetjmp在栈里面跳转。
直接Posix族的代码贴出来,应该还有一些小bug,有待继续完善
只把读取权限的写了,别的同理
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
#include <unistd.h>
/*
x86/Linux、x86/Solaris、SPARC/Solaris will sigal SIGSEGV
x86/FreeBSD、x86/NetBSD、x86/OpenBSD MacOS will sigal SIGBUS
*/
#if defined(__MACH__) && defined(__FreeBSD__) && defined(__NetBSD__) && defined(__OpenBSD__)\
&& defined(__DragonFly__)
#define ERROR_SIGNAL SIGBUS
#else
#define ERROR_SIGNAL SIGSEGV
#endif
static sigjmp_buf badreadjmpbuf;
static void badreadfunc(int signo)
{
/*write(STDOUT_FILENO, "catch\n", 6);*/
siglongjmp(badreadjmpbuf, 1);
}
int isbadreadptr(void *ptr, int length)
{
struct sigaction sa, osa;
int ret = 0;
/*init new handler struct*/
sa.sa_handler = badreadfunc;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
/*retrieve old and set new handlers*/
if(sigaction(ERROR_SIGNAL, &sa, &osa)<0)
return (-1);
if(sigsetjmp(badreadjmpbuf, 1) == 0)
{
int i, hi=length/sizeof(int), remain=length%sizeof(int);
int* pi = ptr;
char* pc = (char*)ptr + hi;
for(i=0;i<hi;i++)
{
int tmp = *(pi+i);
}
for(i=0;i<remain;i++)
{
char tmp = *(pc+i);
}
}
else
{
ret = 1;
}
/*restore prevouis signal actions*/
if(sigaction(ERROR_SIGNAL, &osa, NULL)<0)
return (-1);
return ret;
}
int main()
{
int *p = 0;
int flag;
int testint = 1234567890, *teststack = &testint;
int * testheap = malloc(sizeof(int) * 10);
printf("bad ptr %d\n", isbadreadptr(p, 4));
printf("bad ptr %d\n", isbadreadptr(teststack, 4));
printf("bad ptr %d\n", isbadreadptr(testheap, 40));
free(testheap);
printf("exiting main\n");
return 0;
}
分享到:
相关推荐
此文档经本人亲测,移植成功后编制的手册,现分享出来让喜欢自己制作或者移植鼠标指针的人做为引路书,按文档里一步步来你一定可以将linux上喜欢的鼠标主题移植到windows系统上进行安装使用。
java.lang.NullPointerException at org.apache.poi.openxml4j.opc....在linux环境下poi读取word文件产生的NullPointerException,此问题找了两天最终解决。希望有同样问题的人能快速解决问题,所以上传此文档
利用C语言编写判断一个字符串是否为回文的程序,首先设立一个头部指针指向字符串的首部,然后设立一个指针指向字符串的尾部,头部指针向前移动,尾部指针向后移动,当两个指针所指的值相等时为回文,否者不为回文,...
彻底搞定C指针-指向另一指针的指针 <br>摘自博客文章
关于在内核态、用户态数据通信,其中有一种方式就是直接的在内核态中获取用户态数据信息。应用场景如:在内核态中直接读取磁盘文件信息。 在这样的应用场景下,具体要解决的难点:如何使内核函数中的参数,合法的...
自己从网上,书上等总结出的... 嵌入式Linux:C 笔记_嵌入式Linux_C_函数指针
很基础,思路很清晰,值得一看
2.在一个表达式里,*p[] 将被求值为一个int 整数,所以p[]必须指向一个int 整数,而p是一个int 指针数组。指针数组p里的5个元素(5个)指针被初始化为分别指向数组a里的5个元素。 3.**pp代表着一个int整数,所以*pp...
C++ 7种智能指针测试代码
本实验旨在通过实验,培养将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力。...设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个...
我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面 的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10] def是什么? (2)double*(*gh)[10] gh是什么? (3)double...
指针 指针教程 指针练习指针 指针教程 指针练习
Win10 左手用户的鼠标指针
C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针
鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载Yangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong ...
c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...
我用C#做的一个指针表盘程序,可用作电压电流及速度、温度表盘显示,C#工具箱缺这个东西,源码编译通过,执行直接输出表盘,实例中做了一个随机函数显示如何移动指针。