利用驱动在某个进程注入一个SHELLCODE,执行,弹出一个对话框.
为了隐蔽,首先设置读写权限,然后设置执行权限.设置执行权限的时候有2种方法.
1: ZwProtectVirtualMemory(NtCurrentProcess(), &BaseAddress, &size, PAGE_EXECUTE_READWRITE, &oldProtect);
2:
BOOLEAN SetExecutePage(ULONG64 VirtualAddress, ULONG size)
{
ULONG64 startAddress = VirtualAddress & (~0xFFF); // 起始地址
ULONG64 endAddress = (VirtualAddress + size - 1) & (~0xFFF); // 结束地址
for (ULONG64 curAddress = startAddress; curAddress <= endAddress; curAddress += PAGE_SIZE)
{
PHardwarePte pde = (PHardwarePte)getPde(curAddress);
PHardwarePte pte = (PHardwarePte)getPte(curAddress);
if (MmIsAddressValid(pde) && pde->valid == 1)
{
pde->no_execute = 0;
pde->write = 1;
}
if (MmIsAddressValid(pte) && pte->valid == 1)
{
pte->no_execute = 0;
pte->write = 1;
}
KeInvalidateRangeAllCaches((PVOID)curAddress, PAGE_SIZE);
}
return TRUE;
}
不知道为什么使用ZwProtectVirtualMemory就执行正常.使用SetExecutePage,注入的进程就崩溃.
最奇怪的来了,如果我先用ZwProtectVirtualMemory,编译成功,加载驱动,成功弹出对话框.
再改成利用SetExecutePage设置权限,重新编译,再加载,居然成功了.
不知道哪里有问题
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!