wenh7788
驱动牛犊
驱动牛犊
  • 注册日期2011-01-26
  • 最后登录2011-02-12
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3319回复:6

Hook SSDT Shadow

楼主#
更多 发布于:2011-01-26 17:31
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:
小弟出来贵网站,怎么打开的速度这么慢的呢,不知道其他的朋友是什么个情况,
wxj120bw
驱动小牛
驱动小牛
  • 注册日期2008-06-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分109分
  • 威望1014点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-01-27 00:38
#define STATUS_SUCCESS                          ((NTSTATUS)0x00000000L) // ntsubauth
return 0就表示return STATUS_SUCCESS。
Hook SSDT Shadow不熟悉,不过我推测第一个判断保护的进程号,第二个判断就不清楚了。
最好网站是在铁通,所以浏览会比较慢。
wenh7788
驱动牛犊
驱动牛犊
  • 注册日期2011-01-26
  • 最后登录2011-02-12
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2011-01-27 09:38
引用第1楼wxj120bw于2011-01-27 00:38发表的  :
#define STATUS_SUCCESS                          ((NTSTATUS)0x00000000L) // ntsubauth
return 0就表示return STATUS_SUCCESS。
Hook SSDT Shadow不熟悉,不过我推测第一个判断保护的进程号,第二个判断就不清楚了。
最好网站是在铁通,所以浏览会比较慢。


判断保护的进程号


那么按理说,如果是我要保护的进程号 才继续执行,如果不是的话我就放过去 原来怎样就怎样啊

我怎么感觉这段代码写反了呢?


意思好像是 是我要保护的进程号 我就放过去 什么都不做,如果不是我要保护的进程号 就进入里面的那个判断,而且我也没有搞懂 NtUserQueryWindow 是做什么用的。我是真的真的没有看懂这段代码的意思,我都搞糊涂了 希望大家帮帮忙 谢谢了。
wenh7788
驱动牛犊
驱动牛犊
  • 注册日期2011-01-26
  • 最后登录2011-02-12
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2011-01-27 10:55
为了让帖子数上到三个 ,可以发链接,被逼的
wenh7788
驱动牛犊
驱动牛犊
  • 注册日期2011-01-26
  • 最后登录2011-02-12
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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

这个朋友的帖子。
让我受到了启发,首先感谢这位朋友,还有楼上楼下的其他朋友,如果有问题 请一定帮我指出来

谢谢了!!!
instruder
论坛版主
论坛版主
  • 注册日期2010-03-10
  • 最后登录2011-02-15
  • 粉丝0
  • 关注7
  • 积分31分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2011-02-15 12:21
不是自己要find的就全部返回错误就行了
先在驱动加载时记录下当前的进程ID(R3下的用户进程)
hansiyuan
驱动牛犊
驱动牛犊
  • 注册日期2009-05-18
  • 最后登录2011-02-21
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);

这个函数枚举当前所有的窗口句柄!
游客

返回顶部