windows操作系统再初始化的过程中,当内核完全初始化而且各个组件也已经准备好后会加载一个个用户进程smss.exe(会话管理器),此进程会接着调用nttsysteminformation并传入systemregistryappendstringinformation == 38参数加载win32k.sys这个模块,接着就会调用win32k.sys的driverentry入口。接着smss.exe便会启动windows 子系统进程csrss.exe。
当smss.exe在加载win32k.sys模块后,win32k.sys这个模块会紧接着执行其模块入口driverentry,紧接着其会执行addsystemrvicetable为系统增加一张shadowssdt表。我们可以在smss.exe刚刚加载win32k.sys是将ntoskrnl.exe所导出的keaddsystemrvicetable给eathook了,然后在我们自己的mykeaddsystemrvicetable()中判断通过判断加载的表的基地址是否在win32k.sys模块地址范围中,如果不在证明不是正确的shadowssdt表。
win32k.sys包含shadowssdt表,只要线程中调用gui函数最后都会调用shadowssdt表中的服务。但并不是只有gui线程才会将win32k.sys加载到内存中,参考教主的帖子是说win32k.sys模块的加载与会话有关,所以只要不是system和smss.exe(会话管理器不属于任意一个继承)进程其他任何一个进程都会加载win32k.sys。
我们看一下在system进程中win32k.sys模块的地址,发现确实是无效的。
所以如果我们想要在内核中修改win32k.sys模块(iat_hook)就必须保证当前进程上下文不在system和smss.exe中,也就是需要将进程上下文切换到除了两个进程之外的任意一个进程地址空间中。
当我们需要iat_hookwin32k.sys模块时可以将地址空间切换到csrss.exe进程地址空间中,再这之前我们需要先获得csrss.exe进程的pid,然后通过其pid得到对应的eprocess,然后切换到对应的进程地址空间中。一种获得csrss.exe的方法是通过枚举系统中所有的句柄然后,寻找名为”\windows\apiport”的alpc port句柄然后得到其对应的进程pid(csrss.exe进程会创建一个名为”\windows\apiport”的alpc port对象)。
handle getcsrsspid() { handle process, hobject; handle csrssid; object_attributes obj; client_id cid; uchar buff[0x1000]; pobject_name_information pobjname = (pvoid)&buff; psystem_handle_information_ex handles; handles = queryhandleinfo(systemhandleinformation); //通过调用zwquerysysteminformation获得所有的句柄信息返回system_handle_information_ex结构体 if (!ha求生之路2怎么局域网联机ndles) return csrid; for (ulong i = 0; i < handles->numberofhandles; i++) { if (handles->information[r].objecttypenumber == 21) //alpc port object { initializeobjectattributes(&obj, null, obj_kernel_handle, null, null); cid.uniqueprocess = (h北京市平均工资andle)handles->information[r].processid; cid.uniquethread = 0; if (nt_success(ntopenprocess(&process, process_dup_handle, &obj, &cid))) { if (nt_success(zwduplicateobject(process, (handle)handles->information[r].handle,ntcurrentprocess(), &hobject, 0, 0,duplicate_same_access))) //将句柄复制到当前进程中 { if (nt_success(zwqueryobject(hobject, objectnameinformation, objname, 0x100, null))) //传入参数objectnameinformation得到对象的名称信息 { if (pobjname->name.buffer && !wcsncmp(l"\\windows\\apiport", objname->name.buffer, 20振能)) { csrssid = (handle)handles->information[r].processid; } } zwclo(hobject); 专业英语怎么说 } zwclo(process); } }}exfreepool(handles);return csrssid;}
zwquerysystem湖南卫视小年夜2017information的参数systeminformationclass等于systemhandleinformation(16),systeminformation会返回system_handle_information_ex结构体,其第一个numbreofhandles字段为获得的句柄的总数目,然后system_handle_information数组为各个句柄的信息。
typedef struct _system_handle_information_ex {ulong numberofhandles;system_handle_information information[1];}system_handle_information_ex, *psystem_handle_information_ex;
system_handle_information结构包含了句柄的一些基本信息,例如所属进程pid等等。
typedef struct _system_handle_information {ulong processid;uchar objecttypenumber;uchar flags;ushort handle;pvoid object;access_mask grantedaccess;}system_handle_information, *psystem_handle_information;
到此这篇关于windows系统下smss.exe加载win32k.sys过程详解的文章就介绍到这了,更多相关smss.exe加载win32k.sys内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章,希望大家以后多多支持www.887551.com!
本文发布于:2023-04-05 09:05:43,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4792ca45a0b19431f44fbd727349e520.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:windows系统下Smss.exe加载win32k.sys过程详解.doc
本文 PDF 下载地址:windows系统下Smss.exe加载win32k.sys过程详解.pdf
留言与评论(共有 0 条评论) |