近来学习进程保护,写了个代码,结果一旦满足条件就蓝屏,请大牛指点
代码片段如下
////////////////////// MyObReferenceObjectByHandle /////////////////////////////////////////////////
__declspec(naked) MyObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
__asm
{
///////////////执行原先被修改的字节码
mov edi,edi
push ebp
mov ebp,esp
// 因为调用了我们这个函数,所以栈现在的情况是
// 参数1-->>参数2-->>参数3-->>参数4-->>参数5-->>参数6-->>返回地址-->>老的EBP(push ebp)
// 执行完mov ebp,esp 后,ebp指向了栈顶,这个时候我们就可以用ebp来引用参数了
// 如下面的push [ebp+0x1c]就是用ebp来引用栈中参数
// 保存相关寄存器的值
pushad
push [ebp+0x1c]
push [ebp+0x18]
push [ebp+0x14]
push [ebp+0x10]
push [ebp+0xc]
push [ebp+8]
//开始调用过滤函数
mov eax, ObjectType
push eax
mov eax, Handle
push eax
call FilterFunction1
cmp eax,1 //是否匹配 <----------一旦这里相等跳到end处就会蓝掉
//上面的这个过程可以看做是透明的..虽然有很多push..但不会影响到我们的栈
jz end
//过滤不匹配...调用原来的地址+5个字节.ObReferenceObjectByHandle正常执行
mov eax,ObReferenceObjectByHandle
add eax,5
jmp eax
//否则
end:
popad
/* mov [ebp+8],-1 //--------->>无效句柄
mov eax,ObReferenceObjectByHandle
add eax,5
jmp eax */
//下面我们用栈会溯来解决问题
mov esp,ebp //esp指向栈顶
pop ebp //ebp指向原来的栈底
mov eax, 0xC0000022L; //STATUS_ACCESS_DENIED = 0xC0000022L
ret 0x18 //返回..0x18 == 24 == 6个参数*4个字节 这样esp才能指向正常.程序才不会崩溃
///这个地方也可以用来抵抗调试..这样肯定会到XX去..
}
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!