Anti 进程内存保护

在分页机制下,只要cr3寄存器的值为目标进程的页目录表基址,则访问的就是目标进程的内存。内核态情况下,如果要读写目标进程内存,一般会用KiAttachProcess,再底层的是KiSwapProcess。KiSwapProcess已经底层到基本只负责更新Cr3的内容了。看到同学们为了保护和反保护进程内存。已经拉风到hook KiSwapProcess 里对Cr3操作的那条指令了。然后判断mov cr3,eax 指令中eax是否为受保护进程来执行某些操作,真够不要脸的。可是,有这必要吗?? 在ring0 下 根本是没法保护的! 受保护的进程总归要执行的,ring 0下地址空间又都是一致的,只要hook 一个必然会被执行的函数,每次执行时检测当前进程是否为目标进程,如果是,直接读写即可。太简单了。而且那个hook mov cr3,eax 的方法,很没用,KiSwapProcess 是系统必然会执行的函数。在线程切换时如果俩线程不是同一进程,必然会调用的。只要hook 这个函数,但不主动调用,而是在其调用后检测目标进程是否为受保护的进程,进行读写,则完全是不可预防的。只不过这个读写是异步而已。具体操作时只需建个队列,读写操作时只投递,KiSwapProcess 执行后检测时候为目标进程,然后执行队列里的操作即可。

KiSwapProcess 还是不要给复杂化,这个函数调用太频繁。对系统性能影响稍微有点大。其实只要找个进程必然需要的函数,比如那么些个消息投递函数,加个检测当前进程,即可轻松实现异步读写进程内存。只不过其实时性没KiSwapProcess 那么拉风。但完全够满足普通要求,比如说内存清零杀进程...

 

 

 

 

 

有时候C的类型检查很烦人。尤其是调用函数时,直接push 不就行了嘛,Y的非说不能从PVOID转化为char*什么的。这个还好点,最恶心的是我有一个函数地址,要用c去调用,我去 更是每个地址都得定义一个类型了。 还是强制成可变参数的吧。

typedef int (*DETOURFUNC)(...);

当然,可变参数调用都是是__cdecl,这很正常,参数都可变的,函数自己怎么知道该怎么恢复堆栈那! 所以在玩Win32 API时,后面应紧接着一条恢复栈平衡的语句,比如__asm sub esp,8;

 

你可能感兴趣的:(Anti 进程内存保护)