前面的项目用到hook 还是在半年前,没想到最近有用到了,说实话,在项目组就提出,能用别的办法还是不要用这种,毕竟不太正道(感觉哈)。

  最近又牵扯到第三方对接的任务,没办法我又回到了HOOK上了。与窗口有关系,想在第三方界面弹出窗口的时候通知我。所以第一时间想到了CreateWindow,能不能勾住这个API 不就大事解决了吗,但是这次这个的难度,超出了我的想象,windwos 的窗口并不像他的库那么好用,那么单纯。我用CreateWindow竟然没有够到Dialog。最后好不容易够到了,竟然给我来了参数name 是MSCTFIME 之类的名字,可我的对话框根本不是这个名字。说真的就这个问题我真的想了好久,查了好久,最后发现,Dialog 竟然不调用CreateWindowEx 着实让我大吃一惊。

引用 http://bbs.csdn.net/topics/360133376 里 aiwnx的分析

CreateWindowExW -> _CreateWindowEx -> VerNtUserCreateWindowEx -> (kernel: 0x157:NtUserCreateWindowEx)
CreateWindowExA -> _CreateWindowEx -> VerNtUserCreateWindowEx -> (kernel: 0x157:NtUserCreateWindowEx)
DialogBoxParam -> DialogBoxIndirectParamAorW -> InternalDialogBox -> InternalCreateDialog -> VerNtUserCreateWindowEx -> (kernel: 0x157:NtUserCreateWindowEx)
CreateDialogParam -> CreateDialogIndirectParamAorW -> InternalCreateDialog -> VerNtUserCreateWindowEx -> (kernel: 0x157:NtUserCreateWindowEx)

  看到这个,当时大喜,或许可以勾住这个API ,再一次失望,windows 接口里,没有找到这个API 。

  所以看来勾API 这个方式可能不能用在这个地方。想到之前做HOOK的时候还有钩子就是 SetWindowHookEx,这个东西,是用来勾住消息的。或者这个时候可以派上用场。

WINUSERAPI
HHOOK
WINAPI
SetWindowsHookExA(
__in int idHook,
__in HOOKPROC lpfn,
__in_opt HINSTANCE hmod,
__in DWORD dwThreadId);

  这个函数的第一个参数就是消息的类型,在这里不介绍这些了,网上真的是一大把。当时我选取了WH_CALLPROC 这个消息。用来获取窗口的创建消息。大喜,果然有用。但是出现的问题是,MFC QT  WPF 这个消息的响应并不一样。问题出在哪里呢,。对于QT WPF来说,控件没有句柄这一说。所以我们没有办法获取他里面的控件。不过这个问题并不大。即使控件不响应,索性窗口还是响应的。记得当时在WM_NCREATE这个消息获取窗口创建,句柄,然后在这个 WM_SHOWWINDOW的响应里根据这个句柄进行查找。并发返回窗口大小位置等信息。当然这个过程中会出现,一个窗口WM_NCREATE消息会被调用多次的问题。最终我是用逻辑判断的。

LRESULT CALLBACK OnWndProc(int code,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = reinterpret_cast<CWPSTRUCT*>(lParam);
switch(pCwp->message)
{
case WM_CREATE:
{
break;
}
case WM_SHOWWINDOW:
{
HWND hwnd = reinterpret_cast<HWND>((pCwp->hwnd)); map<int,int>::iterator it = mapHandle.find((int)hwnd);
if(it != mapHandle.end()){
PostMessage(hInterhwnd,WM_INJECT_SHOWWINDOW,(WPARAM)hwnd,0);
LPRECT lpRect;
lpRect = (LPRECT)malloc(sizeof(tagRECT));
::GetWindowRect(hwnd,lpRect);
FILE * fp = fopen("f:\\abc.txt","a+");
if(fp){
char buff[1000] = {0};
sprintf(buff,"showwindow msg point left = %d,top = %d,right = %d,bottom = %d,handle = 0x%x type = %d map = %d\n",lpRect->left,lpRect->top,lpRect->right,lpRect->bottom,hwnd,nCreateMsgNumber[wndType],mapHandle.size() );
fwrite(buff,strlen(buff),1,fp);
fclose(fp);
}
mapHandle.clear();
}
break;
}
case WM_CLOSE:
{
HWND hwnd = reinterpret_cast<HWND>((pCwp->hwnd));
PostMessage(hInterhwnd,WM_INJECT_CLOSE,(WPARAM)hwnd,0);
LPRECT lpRect;
lpRect = (LPRECT)malloc(sizeof(tagRECT));
::GetWindowRect(hwnd,lpRect);
FILE * fp = fopen("f:\\abc.txt","a+");
if(fp){ char buff[1000] = {0};
sprintf(buff,"close msg point left = %d,top = %d,right = %d,bottom = %d,handle = 0x%x\n",lpRect->left,lpRect->top,lpRect->right,lpRect->bottom,hwnd);
fwrite(buff,strlen(buff),1,fp);
fclose(fp);
}
mapHandle.clear();
break;
}
case WM_NCCREATE:
{
HWND hwnd = reinterpret_cast<HWND>((pCwp->hwnd));
//mapHandle.insert(make_pair((int)hwnd,0));
LPRECT lpRect;
lpRect = (LPRECT)malloc(sizeof(tagRECT));
::GetWindowRect(hwnd,lpRect);
if(lpRect->right - lpRect->left != 0){
if(mapHandle.size() < nCreateMsgNumber[wndType]){
mapHandle.insert(make_pair((int)hwnd,0));
FILE * fp = fopen("f:\\abc.txt","a+");
if(fp){ char buff[1000] = {0};
sprintf(buff,"createwindow msg point left = %d,top = %d,right = %d,bottom = %d,handle = 0x%x type = %d map = %d\n",lpRect->left,lpRect->top,lpRect->right,lpRect->bottom,hwnd,nCreateMsgNumber[wndType],mapHandle.size() );
fwrite(buff,strlen(buff),1,fp);
fclose(fp);
}
} }
break;
} default:
{
break;
} }
return CallNextHookEx(hooker,code,wParam,lParam);
} extern "C" __declspec(dllexport) int SetHook(HWND hwnd,int threadid,int wndtype)
{
hInterhwnd = hwnd;
wndType = (WINDOW_TYPE)wndtype;
mapHandle.clear();
hooker = SetWindowsHookEx(WH_CALLWNDPROC,OnWndProc,hinst,threadid);
if(hooker == NULL){
return 0;
}
return 1;
}
extern "C" __declspec(dllexport) int UnHook()
{
mapHandle.clear();
UnhookWindowsHookEx(hooker);
return 1;
}

  

  哈哈哈,纠结了我好长时间的问题,终于解决,圆满。当然项目还没有解决,这个只是解决了其中一个问题。

  

windows 注入 之 SetWindowHookEx的更多相关文章

  1. windows 注入 之 CreateRemoteThread

    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它.钩子机 ...

  2. Android 注入详解

    Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进 ...

  3. 远程线程注入方法CreateRemoteThread

    最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是  https://github.com/Ars ...

  4. 谈谈iOS9中的WebKit 与 Safari

    每个用过 UIWebView 的iOS开发者对其诸多的限制和有限的功能也深有感触.悻然,自iOS8推出 WebKit 框架后将改变这一窘境.在本文我将会深入WebKit来体验一下它给我们带来的好处,同 ...

  5. Windows x86/ x64 Ring3层注入Dll总结

    欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线 ...

  6. WINDOWS黑客基础(3):注入代码

    有使用过外挂的朋友应该知道,我们在玩游戏的时候,有很多辅助功能给你使用,比如吃药,使用物品等功能,这个时候我们就是使用注入代码的技术,简单的来将就是我们让另外一个进程去执行我们想让它执行的代码,这中间 ...

  7. Windows x86 x64使用SetThreadContext注入shellcode的方式加载DLL

    一.前言 注入DLL的方式有很多,在R3就有远程线程CreateRemoteThread.SetWindowsHookEx.QueueUserApc.SetThreadContext 在R0可以使用a ...

  8. 小白日记46:kali渗透测试之Web渗透-SqlMap自动注入(四)-sqlmap参数详解- Enumeration,Brute force,UDF injection,File system,OS,Windows Registry,General,Miscellaneous

    sqlmap自动注入 Enumeration[数据枚举] --privileges -U username[CU 当前账号] -D dvwa -T users -C user --columns  [ ...

  9. windows service宿主web api使用"依赖注入"和“控制反转”的技术实践

    前言 自从几年前抛弃wcf,使用web api 来做服务器端开发之后,就不再迷惑了.但是因为本来从事传统行业管理软件开发,一般都以分布式应用开发为主.纯BS还是比较少,于是比较喜欢用windows s ...

随机推荐

  1. 手机app微信支付后台处理流程

    第一步:客户在手机app确认订单,提交订单后,app将订单详情传给后台,后台将订单存入数据库,将存入数据库的id返回给app. 第二步:这时候手机端app会让客户选择哪种付款方式,我们做的是微信,所以 ...

  2. href="#" 的坑

    第一次发博客, 也不讲究样式. 只是单纯的说一下踩过的坑,方便后人避坑吧 之前做项目的时候,碰到一个非常奇葩的问题. 就是在jqgrid中写了了一个简单的方法 {name:'已经存在的列名称', la ...

  3. JQuery获取Dom元素的方法

    (function (window) { var arr = []; var VP = function (selector, context) { return new VP.fn.init(sel ...

  4. Spark Standalone Mode Configuration

    For currently popular distributed framework Spark, here is the intro and step to configure the spark ...

  5. Android6.0 中appcompat_v7 报错

    更新了AndroidSDK以后 各种错误,新建一个项目会附赠一个appcompat_v7,你只要知道这个是一个兼容包就可以了,具体的特性可以看相关介绍,其实也没啥特别的就是为了兼容低版本的呗, 但是呢 ...

  6. js 设置下拉框的默认值

    设置下拉框的默认值,直接在option中增加selected就可以了.但是现在要使用JS来设置它的默认值,代码如下: <select name="aaa" id=" ...

  7. Unity3D文件读取

    Resources: 是作为一个Unity3D的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中.它的特点简单总结一下就是: 只读 ...

  8. 基于springmvc的hessian调用原理浅析

    一.客户端 1.构造(初始化) 由客户端的配置文件随容器的启动而进行初始化,配置文件如下: <?xml version="1.0" encoding="UTF-8& ...

  9. luogu P3373 【模板】线段树 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别 ...

  10. Hadoop的配置过程(虚拟机中的伪分布模式)

    1引言 hadoop如今已经成为大数据处理中不可缺少的关键技术,在如今大数据爆炸的时代,hadoop给我们处理海量数据提供了强有力的技术支撑.因此,了解hadoop的原理与应用方法是必要的技术知识. ...