R3下取伪句柄表的几种方式
最近碰到一个简单的老游戏,看了一下它的防多开就是通过 CreateFileMapping 函数以只读 方式创建了个文件映射对象 就和互斥体一样,本来劫持个DLL hook下就完事了,但是发现只有几个陌生的DLL可劫持 重点在于这个DLL加载时候对多开的检测已经完成,这就十分尴尬了。。。只好通过远程关闭文件映射句柄来实现多开 然后发现既然DLL可以劫持,又再句柄创建完成后,何不用DLL劫持来干掉句柄,这就滋生出来了几种操作了...
好了废话不多谈,开始写了,只适合小白看的基础性文章~~
句柄(Handle )是Windows表示对象的(不是C++对象) HWND就是其中一种,表示为窗口句柄。还有其他很多如图标句柄(hIco)、光标句柄(hCursor)、线程句柄(hThread)等等..
https://blog.csdn.net/shuyong1999/article/details/7171683 https://blog.csdn.net/ustbkuang/article/details/77862720 https://blog.csdn.net/maowei117/article/details/55254855 上面的为各大牛们对句柄的一些理解
对于句柄来说,我们只要获得了目标的句柄就可以为所欲为了,比如获得有权限的进程句柄就可以读写目标进程数据了(有保护的当我没说...),窗口句柄可以向指定窗口发送消息,线程句柄可以结束(Terminate) 或是挂起Suspend 指定线程(不是本地进程当我没说...) 当然对于互斥体句柄(Mutant) 或是Section 类型的句柄还是可以给它关闭为所欲为的。
我们知道系统层有句柄表,而用户层也能靠3环的几个函数获取:
每一个enum元素对应着查询信息,而 SystemHandleInformation(0x10) 查询的为 SYSTEM_HANDLE_INFORMATIO 结构体指针的信息:
到了这里思路就很清晰了,那么怎么才能区分句柄获得我们想要的句柄呢 ?这里就用到另外一个函数 NtQueryObject :NtQueryObject 函数用来查询对象句柄信息,当 OBJECT_INFORMATION_CLASS参数为ObjectNameInformation(1)和ObjectTypeInformation(2)时分别查询句柄的名称和句柄类型 它们的定义和查询的结构体如下:
到了这里就明了很多了,下面写个简单的Demo实现获取目的进程的句柄:
上面写个获取自身进程句柄的整个逻辑,下面还有一种获取指定进程伪句柄表的方法
查询这个干嘛呢?我们接下来穷举目标进程句柄。没错,是穷举...刚开始是在博客里看到一位大牛写的,发现他思路很清晰,但是代码有点问题,都把逻辑给混淆了。句柄是以4开始,以4为单位递增... : 从上图不难发现都是句柄值以4 递增的,我们穷举的话判断句柄的有效性 就可以用函数DuplicateHandle 函数实现拷贝有效句柄,失败返回FALSE 从而就可以判断句柄的有效性了。
到这里就很简单了,上述已经获得了想到的句柄,但是关闭句柄也有两种不同的情况,本地句柄调用函数CloseHandle 即可,而远程的句柄如何关闭呢 ?(就像知道目标的Patch 地址而无法在本地执行操作一样),实际调用函数DuplicateHandle 即可。
DUPLICATE_CLOSE_SOURCE(0x00000001) Closes the source handle. This occurs regardless of any error status returned.DUPLICATE_SAME_ACCESS(0x00000002) Ignores the dwDesiredAccess parameter. The duplicate handle has the same access as the source handle.
对于远程和本地两种情况都有两种取的句柄的方法,从而针对不同的情况有4 种方法,还有通过DuplicateHandle 复制的句柄记得CloseHandle ,这样才可以实现跨进程关闭句柄,本地的进程不用DuplicateHandle 直接可以关闭,有点啰嗦了...
这里就不贴代码了,都打包在附件上。不然显得有点...占空间了...
Ps:
大牛们对于这种小问题都是一笔带过的,只给了我们这些小白点关键代码和思路,好让我这些 “跑龙套” 方便整理。。。 好了不瞎扯了,上面是一方面,另一方面是还是自己的代码看的习惯.....主要是在学 Markdown 哈哈哈!!
上述如有有误,还请各位指证! 如有例外,还请各位大侠补充!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-4-7 13:41
被AperOdry编辑
,原因:
上传的附件: