1 思路和适用条件
本文所述的方法实际是利用部分软件记住密码时没有加入保护机制的漏洞。记住的密码在界面上显示是一排星号,但是这部分密码实际上是以明码的格式存储在控件内。这种方法对于大厂开发的保护机制做的很完善的软件并不适用,但是对于一些不规范开发的软件很有效。
适用情况如下:
- 软件输入密码界面使用Windows的文本输入控件,而不是独立开发的第三方控件。
- 记住的密码采用明码存储,而不是加密后的数值(例如MD5)。如果你知道怎么从加密后的密码译回去也可(笑)。
整体思路如下:
- 找到输入密码的文本框,获取句柄。
- 读取文本框内数据值。
2 软件需求
2.1 SPY++
Windows电脑安装了Visual Studio就自带了SPY++,对于Win10可以在Cortana搜索“SPY++”,或者在开始界面直接找到。如果电脑上没有安装的话,可以直接在度娘处找到安装包。
我的电脑上有SPY++ 和*SPY++(64位)*两个程序,功能上是一样的,不过64位的程序还是建议用64位的SPY++。我实际使用的时候发现,也有部分程序只有在32位的SPY++下才能正常工作。
2.2 Python和pywin32库
本文程序基于Python语言和pywin32库,不过如果程序的保护机制实在不完善,直接用SPY++有时也可以直接读到密码。
其中,pywin32库可以用pip安装。首先win+r呼出运行程序,输入powershell打开命令行:
# 进入pip安装的目录,下面是你电脑上的python安装目录
cd D:\python37\Lib\site-packages
# 用pip安装pywin32
pip install pywin32
3 读取密码
3.1 查找密码输入文本框句柄
打开你想要读取密码的软件,然后打开SPY++。点击SPY++界面上望远镜图标,随后在弹出的界面中拖动查找程序工具到密码文本框上,即可获句柄以及该文本框在目录树中的位置。
例如我写这篇文章时使用的文本框,其目录树如下图所示。在红框的部分已经用明码把密码显示出来了。
窗口的句柄是图中的0x00030FD4
,不过本文中的密码是在其父窗口上的,即0x00030FCC
,所以实际使用的时候可以多试试。
3.2 读取文本框的内容
大部分软件记住密码后,界面只显示了一排星号,星号也没法复制出来。
我们在3.1部分已经找到了该Edit控件的句柄,此时只需要读取这个空间的内容就可以了。运行代码如下:
import win32api, win32gui, win32con
# 这里写查到的3.1查到的句柄
hWnd = 0x00030FCC
text_length = win32api.SendMessage(hWnd, win32con.WM_GETTEXTLENGTH) + 1
text_buffer = win32gui.PyMakeBuffer(text_length)
win32api.SendMessage(hWnd, win32con.WM_GETTEXT, text_length, text_buffer)
address, length = win32gui.PyGetBufferAddressAndLen(text_buffer[:-1])
text = win32gui.PyGetString(address, length)
print('text:', text)
运行代码,控制台的输出就是密码。
参考
[1] 转载:Spy++ —— 窗口、消息查看分析利器
[2] Spy++的使用方法及下载
[3] 已解决,pywin32如何获取window窗口的edit里面的文本
来源:CSDN
作者:surtol
链接:https://blog.csdn.net/surtol/article/details/104496605