您的位置:首页 > 运维架构

进程保护原理Hook函数Openprocess

2014-11-10 14:31 274 查看
Win32子系统:

Win32是Windows的一个子系统,还有另外的子系统如OS/2、POSIX等,不同的子系统系统提供了不同的编程接口,即API,一般说的API指的就是Win32 API。

Win32子系统是最纯正的Windows子系统,提供了大量的API函数,程序员只需要熟练的使用这些API就可以写出Windows应用程序,当然程序员也可以考虑第三方库,如VC提供的MFC,但这些库不过是在应用程序和Win32子系统中间加了一层封装而已,没有本质的区别。

Windows API 分为三类分别是USER函数,GDI函数,和KERNEL函数
USER函数(user32.dll):这类函数管理窗口,菜单,对话框和控件
GDI函数(gdi32.dll):这类函数在物理设备上执行绘图操作 -Shadow SSDT,-Dwin32k.sys
KERNEL函数(kernel32.dll):这类函数管理非GUI资源,例如,进程,线程,文件和同步服务等.
ntkrnlpa.exe+ ntkrnlpa.lib

Native API(Ntdll.dll)
Native API 是可由用户模式和核心模式程序调用的NT系统服务集接口,它们直接由NT操作系统实现。

SSDT
SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

1、应用层到内核的流程
以OpenProcess为例:

//Ring3环应用程序的调用流程

XX.dll----kernel32.OpenProcess---ntdll.NtOpenProcess=======ntdll.ZwOpenProcess

7C92D5E0> B8 7A000000 MOV EAX,7A
7C92D5E5 BA 0003FE7F MOV EDX,7FFE0300
7C92D5EA FF12 CALL DWORD PTR DS:[EDX]
7C92D5EC C2 1000 RETN 10

//Ring3环到Ring0环的切换
7FFE0300 7C92E4F0 ntdll.KiFastSystemCall
//EAX参数

7C92E4F0> 8BD4
MOV EDX,ESP

7C92E4F2 0F34
SYSENTER //切换到内核

0xA53A41AA 0x805CC40A

//进入内核以后,通过查找SSDT表,找到内核函数ntkrnlpa.NtOpenProcess进行调用
jmp ntkrnlpa.NtOpenProcess
内核调用流程:
内核ntkrnlpa.ZwOpenProcess---SSDT--ntkrnlpa.NtOpenProcess

2、浅谈过保护原理

调试进程必经过程:

获取进程ID-OpenProcess打开被调试的进程;

Read ProcessMemory()读取调试进程的PE镜像;

WriteProcessMemory()写进程的内存下断点。

很多软件 保护进程 的方法就是在Ring0环HOOK掉OpenProcess函数的内核函数NtOpenProcess,进行过滤处理;当我们用调试器对它的进程进行调试时,就会出现打开进程失败,无法加载程序。

参考资料:

郁金香老师讲课资料整理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: