阅读:3319回复:6
Hook SSDT Shadow
NTSTATUS MyNtUserFindWindowEx(
IN HWND hwndParent, IN HWND hwndChild, IN PUNICODE_STRING pstrClassName OPTIONAL, IN PUNICODE_STRING pstrWindowName OPTIONAL, IN DWORD dwType) { ULONG result; result = g_OriginalNtUserFindWindowEx(hwndParent, hwndChild, pstrClassName, pstrWindowName, dwType); if (PsGetCurrentProcessId()!=ProcessIdToProtect) { ULONG ProcessID; ProcessID = g_OriginalNtUserQueryWindow(result, 0); DbgPrint("ProcessID:%d", ProcessID); if (ProcessID==(ULONG)ProcessIdToProtect) return 0; } return result; } 这段是hook后自己函数的实现,其中我不明白的是 上述代码中的两个判断是什么意思? ProcessIdToProtect 就是我要保护的进程的pid 比如 扫雷游戏的pid PsGetCurrentProcessId() 这个不也是获得pid的嘛. 后面 的两个判断 我就不懂了,还有返回值 我也没有搞明白 返回 0 和返回 result 有什么区别吗? 谢谢了,希望能够大家能指点一二. ps: 小弟出来贵网站,怎么打开的速度这么慢的呢,不知道其他的朋友是什么个情况, |
|
沙发#
发布于:2011-01-27 00:38
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
return 0就表示return STATUS_SUCCESS。 Hook SSDT Shadow不熟悉,不过我推测第一个判断保护的进程号,第二个判断就不清楚了。 最好网站是在铁通,所以浏览会比较慢。 |
|
板凳#
发布于:2011-01-27 09:38
引用第1楼wxj120bw于2011-01-27 00:38发表的 : 判断保护的进程号 那么按理说,如果是我要保护的进程号 才继续执行,如果不是的话我就放过去 原来怎样就怎样啊 我怎么感觉这段代码写反了呢? 意思好像是 是我要保护的进程号 我就放过去 什么都不做,如果不是我要保护的进程号 就进入里面的那个判断,而且我也没有搞懂 NtUserQueryWindow 是做什么用的。我是真的真的没有看懂这段代码的意思,我都搞糊涂了 希望大家帮帮忙 谢谢了。 |
|
地板#
发布于:2011-01-27 10:55
为了让帖子数上到三个 ,可以发链接,被逼的
|
|
地下室#
发布于:2011-01-27 10:55
我貌似知道 原因了,我的分析如下,如果有错误的话 请看到的人一定一定帮我指出来 谢谢了
首先脑子中要有一个大的方向就是 要保护我们自己的进程,自己的窗口 等等之类的吧,反正是保护自己的东西。 那么 就要想到 我们的程序 只要保护我们自己的东西,别人的东西我们不要理会,按照原来的处理就可以了。同时还要想到,比如spy++之类的程序,捕获别人的窗口的功能。 result = g_OriginalNtUserFindWindowEx(hwndParent, hwndChild, pstrClassName, pstrWindowName, dwType); 虽然NtUserFindWindowEx从函数的声明上看,返回值是STATUS 可是从 NtUserQueryWindow传入的参数来看的话 ,我把它理解为 窗口的句柄,上面有个朋友也说了 真实的窗口句柄 其中第一个判断,如果你是自己的进程为焦点,那么PsGetCurrentProcessId就是你自己的进程PID 也就是说 PsGetCurrentProcessId()==ProcessIdToProtect 直接返回原始窗口的句柄,因为是我们自己的程序嘛,我们不要担心。继续 如果 PsGetCurrentProcessId()!=ProcessIdToProtect 如果用spy++想要捕获我们进程的窗体之类的东西的话 那么 肯定是spy++的窗体为焦点的,所以 PsGetCurrentProcessId 这个值肯定 和 ProcessIdToProtect 不相等 那么就进入到if里面去了 ProcessID = g_OriginalNtUserQueryWindow(result, 0); 通过这个函数我们就可以知道,如果spy++之类的程序 想要捕获到我们的窗口的话,下面的判断就是为了不让他捕获到 让他返回为0 就是啥都没有 总的来说 如果捕捉到的是自己程序的窗口,而且实施捕捉的进程不是自己程序的进程,那就直接返回NULL(这样自己的程序捕捉自己的窗口就不会受影响). 引用的是 http://www.cnblogs.com/fangkm/archive/2009/08/15/1546843.html 这个朋友的帖子。 让我受到了启发,首先感谢这位朋友,还有楼上楼下的其他朋友,如果有问题 请一定帮我指出来 谢谢了!!! |
|
5楼#
发布于:2011-02-15 12:21
不是自己要find的就全部返回错误就行了
先在驱动加载时记录下当前的进程ID(R3下的用户进程) |
|
6楼#
发布于:2011-02-20 22:06
我的理解
if (PsGetCurrentProcessId()!=ProcessIdToProtect) //当前进程ID是否和被保护ID相同 { ULONG ProcessID; //如果不同创建一个空ID ProcessID = g_OriginalNtUserQueryWindow(result, 0);查询当这个进程的ID并保存在刚刚建立的空ID上 DbgPrint("ProcessID:%d", ProcessID); if (ProcessID==(ULONG)ProcessIdToProtect)//如果这个ID和被保护的ID相同那么就返回0 也就是找到了被保护的ID return 0; } 否则就返回RESULT 值 也就是为什么没有找到那个用户输入被保护进程的ID的错误代码! return result; } 这里的关键是 result = g_OriginalNtUserFindWindowEx(hwndParent, hwndChild, pstrClassName, pstrWindowName, dwType); 这个函数枚举当前所有的窗口句柄! |
|