揭秘星号密码查看器实现原理(第一篇)

2018年3月5日00:26:38 发表评论 14,558

揭秘星号密码查看器实现原理(第一篇)

0x01 前言

本文是博主在学习MFC的时候闲着无聊写的,一共有两篇,这是第一篇,主要讲用Windows的消息(SendMessage)API来实现软件星号密码的查看,不过本方法是有局限性的,经过测试发现有些软件会对该API进行处理,所以后面还会抽空写第二篇。文章主要介绍原理和实现,仅供参考,下面进入正题。

0x02 实现原理

主要实现方式是利用Windows的获取指针位置的API(GetCursorPos)来获取到指针位置,然后使用(WindowFromPoint)API获取到该位置的控件句柄,之后使用(SendMessage)和(PostMessage)对该控件处的文本进行读取,先介绍一下SendMessage和PostMessage。

SendMessage,将指定消息发送到一个或多个窗口,第一个参数为控件句柄,后面的三个参数据情况而定,当第二个参数使用EM_GETPASSWORDCHAR时将获取编辑控件的密码字符,返回NULL表示没有字符;当第二个参数为WM_GETTEXT时将复制对应窗口的文本到缓冲区。

PostMessage,也是将指定消息发送到一个或多个窗口,使用方法同SendMessage大同小异,当第二个参数为EM_SETPASSWORDCHAR且第三个参数为0时将使指定控件显示真实密码,如果第三个参数为字符,控件会显示该字符,达到隐藏密码的功能。

SendMessage和PostMessage的既然都是将消息发送到指定窗口,那么二者的区别在哪呢?SendMessage直到窗口程序处理完消息再返回,PostMessage将一个消息寄送到一个线程的消息队列后就立即返回,二者相当于同步和异步的区别,这二者的差异决定了我们的调用次序。

0x03 实现步骤

1、SendMessage(hwnd, EM_GETPASSWORDCHAR, 0, 0);        //获取星号

2、PostMessage(hwnd, EM_SETPASSWORDCHAR, 0, 0);         //取消星号字符

3、SendMessage(hwnd, WM_GETTEXT, 255, long(buffer));      //获取真实密码

4、PostMessage(hwnd, EM_SETPASSWORDCHAR, Char, 0);   //还原密码

如果我们直接使用PostMessage来获取星号,我们获取到的可能不是星号,因为返回的可能时别的消息的返回值。所以我们需要使用同步机制的SendMessage来获取星号。

0x04 VC++代码

下面是封装好读取星号密码的的C++函数

下面是调用上面函数的代码、

0x05 完整程序实现

上面代码只是实现了主要功能,但如果直接写软件的话肯定还是不够的,我们可以设置一个小图标,当用户在图标处按下鼠标后我们改变鼠标的形状,当鼠标移动到指定控件的时候我们就调用读取密码的函数,更新到界面进行显示。

0x06 结束语

因为MFC工程的文件比较多,且此程序功能不如代码注入强大,所以现在先不给处完整工程文件,我将在下一篇文章中给出完整的工程文件。

博主MFC新手,不足之处还请指正。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: