|
第二: /*----------------------------------- 我们都很清楚,用OD破防拷会被蓝屏,这个大家都明白吧!很多都蓝过吧!今天我再给大家解释一下这个蓝屏怎么回事,假如,我转载的第二项为假,那么它就不会蓝屏为什么这么说呢? 先来了解一下,关键的内容Ring级别: Ring3和Ring0。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将会导致整个系统崩溃,如果所有的程序都能使用这些指令,那么系统将不知道什么原因就会当机,就会蓝屏,由于这个原因,CPU将指令分为特权指令和非特权指令,对于那些特权指令只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾害的指令。可以更形象的说特权指令就是那些儿童不宜的东西,非特权指令就是那些老少皆宜的东西。Intel的CPU指令特权级别分为四个级别:Ring0,Ring1,Ring2,Ring3。Windows只使用其中的Ring0和Ring3两个级别,其中Ring0是给操作系统使用,Ring3可以任意应用程序使用。Windows下的系统服务都是工作在Ring0级别上的,NT服务提供的函数都是完全运行在内核模式下。 大家看的也许有点糊涂,高手一看就明白.也就是防拷在被调试的时候,防拷系统有可能是获取了Ring0权限,来拥有对硬件操作的最高权,而普通的程序对硬件的操作都是被操作系统限制的,也就是说在Ring3权限无法对硬件有最为容易访问和控制权,只有获得了Ring0权限才可以对硬件直接操作.而我们对系统都了解的知道以下概念! 0x7FFFFFFF=2GB 0xFFFFFFFF=4GB Windows内存管理: Windows和大多数现代操作系统一样,Windows实现按需调页的虚拟内存机制。由于操作系统使用了虚拟内存,这就给应用程序造成了一个假象,以为计算机安装的内存远远超过自己所需要的数量。 在32位的Windows计算机上,进程具有4GB的虚拟内存地址空间,操作系统通常会把这4GB的地址空间划分为进程和系统两个部分。因此,每个进程可以获得2GB的虚拟内存,根据可用的容量。分配给所有进程的虚拟内存总数不能超过页面文件和大多数物理内存的总和(操作系统本身也要占据一小部分物理内存)。 有了这种机制,加上足够大的页面文件,就可以给进程分配超过物理内存容量的虚拟内存,Windows内存管理子系统必须让多个进程和缓存的文件数据(由缓存管理器管理)共享物理内存。内存管理器给每个进程(例如Windows Explorer、记事本和Word)指派一部分物理内存,这叫做进程的工作集。可分页的内核和驱动程序部分,加上可分页的内核内存缓冲区(叫做分页池),还有缓存管理器所管理的物理内存,它们具有自己的工作集,叫做系统工作集。 也就是说所有的普通程序都是在Ring3上面运行,我们的OD也不例外,我们发现一下!随便打开一个程序,按下面的步鄹: 菜单->查看->内存,会发现点什么呢?往上面看看,往下面看看有没有大于0xFFFFFFFF的,也就是说OD也只能在Ring3的权限内进行程序调试!前面提到过,防拷为了获得对硬件的直接控制权它专门获得了系统权限,也就是说防拷和操作系统是拥有一样的权限,它就可以访问系统空间.我们来看一下 0x00000000-0x7FFFFFFF 是用户的2GB空间 0x80000000-0xFFFFFFFF 是系统的2GB空间 如果当一个普通进程访问系统空间,会怎么样呢?系统当然为了稳定将它赶回去了,也来个比方:OD和防拷同去公园,防拷有门票进去了,OD没门票不让进,OD生气了,电脑蓝了.实际就这么简单的.现在明白了蓝屏怎么回事了吧! 在OD追踪防拷的时候,被操作系统挡了回来而且还告诉OD:这里不是你这样的低等级程序能来的,那里来的回那呆着去!你可知道这里是系统专用2GB空间0x80000000-0xFFFFFFFF,这就是大家看到的蓝屏上字的含义.而防拷获得了和系统一样的专用权,在防拷解密代码的时候,防拷占用的空间是系统的2GB空间,这样做的唯一好处就是你的系统不会再和以前一样稳定了,即使卸载了,也会影响系统稳定.如果经常GHOST系统的朋友就无所谓了,但是GHOST系统会影响硬盘的寿命.实际和病毒已经有点相近了,在系统权限做监视是病毒们的爱好,但是这样的病毒却不多,如果防拷要是专门监视你的安全信息那也是随手一拿的事,因为它连系统监视也可以很轻松的做到!还有什么不行的吗?做让人觉得可怕的是Ring0权限上运行的黑手. 第三: /*----------------------------------------------------------- 防拷系统的自动运行,先来看看一段C代码,这个是我仿照防拷写的DLL,熟悉C的朋友一看就懂: /*----------------------------------------------------------- BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { //首次加载DLL时从此处执行 //当然,这里你可以开一个线程 hInstance=(HINSTANCE)hModule; MessageBox(NULL,"Test!","[DLL加载]参数测试!",MB_OK); break; } case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: //做一些善后工作,如释放内存 break; case DLL_PROCESS_DETACH: //善后 break; } return TRUE; } -------------------------------------------------------------*/ 这个不是DLL入口代码吗?是啊,这个有什么好说的人人都知道!但是人人都知道的东西,我们却为它不解了,防拷处理过的程序会自动运行的学问就在这里!DLL_PROCESS_ATTACH这个消息的处理让你在调用LoadLibrary获得DLL文件句柄时,程序已经被执行!还没用GetProcAddress程序已经被执行了,如果有兴趣的可以试一下!LoadLibrary后就被执行.说到这里又要解释一下了,实际我们的DLL和EXE都不是从DllMain()和WinMain()处才开始执行的.而是从__DllMainCRTStartup()和__WinMainCRTStartup处已经开始做最初的初始化了.不说那么多了,说多了又糊涂,总之,要知道的是:LoadLibrary一执行,DLL_PROCESS_ATTACH消息会被处理. 现在说了DLL的关键所在,那大家都知道WINDOWS可执行文件在执行前都会初始化加载一些模块,这些模块通常是系统执行程序最基本的,如:user32.dll,kernel32.dll,ntdll.dll等等.很常见吧!而我们看到的防拷处理过的程序,加载模块的时候也会被加载防拷DLL,因此,大家就看到防拷界面出现,而程序还没到WinMain或DllMain.这会大家明白了吧:)
上一页 [1] [2] [3] [4] 下一页 |