001:导入表:
在XP的user32.dll里边,加载的时候会加载3个导入表,顺序是GDI32.DLLKENNEL32.DLL,NTDLL.DLL,里边包含的函数数量为:118,119,73
Win7 64位下包含的是4个导入表,顺序是NTDLL.DLL,GDI32.DLL,KERNEL32.DLL,ADVAPI32.DLL,里边包含的函数数量为:91,117,125,1
Win7 32位下包含的是3个导入表,顺序是NTDLL.DLL,GDI32.DLL,KERNEL32.DLL,里边包含的函数数量为:88,117,125
Win8下格局比较不解,跟之前的版本完全不一样了,有很多的api-ms-win,很奇怪
002:
int nFlg = 0;
int n = *(int*)nFlg;
prinf("n = %d\n",n);
看出来了吗?这个肯定会崩溃,继续写一个:int nFlg = 0;
int n = *(int*)(nFlg+0xffff);
prinf("n = %d\n",n);
这个依然崩溃,再写一个:int nFlg = 0;
int n = *(int*)(nFlg+0x10000);
prinf("n = %d\n",n);
这个就可以通过,还是那个知识点,0x0000 0000~0x0000 ffff属于内存保护非法访问区,也有人说是空指针赋值分区,这个区域的数值是不允许获取,一点资料:
1)空指针赋值分区
范围:0x0000 0000~0x0000 FFFF
为了帮助程序员捕获对空指针的赋值。
分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000。当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。
2)用户模式分区
范围:0x0001 0000~0x7FFE FFFF
进程只能读取或访问这个范围的虚拟地址,超越这个范围的行为都会产生违规退出。
所有.exe和动态链接库(DLL文件)都载入到这一区域,进程的大部分数据也都保存在这一分区。每个进程该分区空间是独享的。
3)64KB禁入分区
范围:0x7FFF 0000~0x7FFF FFFF
没有了解
4)共享内核分区
范围:0x8000 0000~0xFFFF FFFF
这个空间是供操作系统内核代码、设备驱动程序代码、设备I/O高速缓存、非分页缓冲池分配表、进程页面表等。这段地址各进程是共享的,但进程不能读取或者访问这一分区。
转自:http://blog.csdn.net/anye3000/article/details/6674176
003:一点经验总结:当遇到使用 try {}结构都不能try住的话,有可能是想访问0x 0000 ffff以及一下地址的内容,出现这种情况有可能是类析构重复导致地址已经为空,有可能是将0xffff一下数值作为地址使用,总之是这类,仔细看一下。
004:扯了那么多,还没说关于单元测试本身的东西呢: