能力值:
( LV9,RANK:280 )
|
-
-
2 楼
MDL映射一下
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我又查了一下cr0的WP的定义,来自<软件调试>-张银奎, 第44页,是这样定义 cr0 的WP位的:
为 1 时,禁止 内核级代码 写 用户级 的只读内存页;
为 0 时允许
为什么在 32位中,关闭cr0的WP又是有效的呢。
|
能力值:
( LV12,RANK:760 )
|
-
-
4 楼
正统应该使用MDL
CR0这玩意动它干啥
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
x64内核不可以用汇编了吧
有专门的函数可以改写cr0
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
char sz_关闭[15]=
"\xFA" //0
"\x0F\x20\xC0" //3
"\x48\x25\xFF\xFF\xFE\xFF" //9
"\x0F\x22\xC0" //12
"\xC3"; //13
char sz_开启[15]=
"\x0F\x20\xC0" //2
"\x48\x0D\x00\x00\x01\x00" //8
"\x0F\x22\xC0" //11
"\xFB" //12
"\xC3"; //13
你自己分配内存直接调用就用
是你的问题x64是没有问题的
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
可以的,我之前写过的
/*cli
cli
mov rax,cr0
mov rcx,rax
and eax,0fffeffffh
mov cr0,rax
mov rax,rcx
ret
*/
UCHAR shellcode[20] =
"\xFA" //0
"\x0F\x20\xC0" //3
"\x48\x8B\xC8" //6
"\x25\xFF\xFF\xFE\xFF" //11
"\x0F\x22\xC0" //14
"\x48\x8B\xC1" //17
"\xC3"; //18
/*
mov cr0,rcx
sti
ret
*/
UCHAR shellcode1[6] =
"\x0F\x22\xC1" //2
"\xFB" //3
"\xC3"; //4
ULONG closeinterupt()
{
ULONG old_cr0;
CLOSEINTERUPT func = ExAllocatePool(NonPagedPool, 20);
memcpy(func, shellcode, 20);
old_cr0 = func();
ExFreePool(func);
return old_cr0;
}
void startinteript(ULONG old_cr0)
{
OPENINTERUPT func = ExAllocatePool(NonPagedPool, 6);
memcpy(func, shellcode1, 6);
func(old_cr0);
ExFreePool(func);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
KIRQL WPOFFx64() { KIRQL irql=KeRaiseIrqlToDpcLevel(); UINT64 cr0=__readcr0(); cr0 &= 0xfffffffffffeffff; __writecr0(cr0); _disable(); return irql; }
void WPONx64(KIRQL irql) { UINT64 cr0=__readcr0(); cr0 |= 0x10000; _enable(); __writecr0(cr0); KeLowerIrql(irql); }
别人的代码,很好用,_enable 是 sti 指令, _disable是 cli 指令,不懂为什么要这样
|
|
|