QQ Shortcut 开发手册

QQ Shortcut 开发手册

--By Null

揭秘 PWDHash

QQPWDhash 原本是为实现 QQ TM无缝切换而用的将密码加密传递的参数。使得用户能在 QQ TM 之间快速切换而不用再次输入密码。

现在让我们来看看 QQ IM 是通过怎样的参数来相互切换的,

例如:

D:/QQ2007/QQ.exe /START QQUIN:28681290 PWDHASH:L 8c 9kXaAT0GKNj9pWuZug== /STAT:40

QQ命令行:

QQ.exe /START QQUIN:QQ PWDHASH:加密的密码 /STAT:40 (40隐,41正常)

概念:

PWDHASH就是对我们的原始QQ密码进行MD5散列算法处理,得到一个16字节的MD5 HASH 字节组,然后再用BASE64编码对这个HASH字节组做第二次编码得到的。理论上说是无法从PWDHASH反推出原始的QQ密码的。但是,如果密码过于简单,如纯数字之类的,是可能被简单暴力破解的。

快捷方式登录的利与弊

有利的一面:免去输入密码之苦,双击一下就可以登录,同时也可以防止密码被键盘记录软件盗取。

不好的一面:如果是多人共用电脑,或者电脑可以被别人随意使用,那么别人是可以随意登陆你的QQ的。

综上,该方法适合个人电脑用户。

核心代码的实现

1,PWDHash 的生成

明白了 PWDHash 的生成过程,代码就好写了,下面看看我的实现函数:

    '''<summary>QQPWDHash 生成函数,传递原始密码,返回加密后的PWDHash 字符串</summary>

    '''<param name="PWD">16位以内的QQ 密码</param>

    Function PWDHash(ByRef PWD As String) As String

        Dim MD5 As New System.Security.Cryptography.MD5CryptoServiceProvider()

        Dim PWDBytes() As Byte = (New System.Text.UTF8Encoding).GetBytes(PWD)

        Dim MD5Bytes() As Byte = MD5.ComputeHash(PWDBytes)

        Return Convert.ToBase64String(MD5Bytes, Base64FormattingOptions.InsertLineBreaks)

    End Function

很简单,核心部分只有四句话,下面来详细解释一下。

第一句:

声明一个新的 MD5 类,名字也叫 MD5,并分配空间,在 .net 中,已经集成了多种加密/解密类,不必再为此写一句代码,直接调用就可以了,很方便。

第二句:

声明一个名为 PWDHash 的动态的字节组,它的初值就是原始密码转换为字节组的结果。

第三句:

声明一个名为 MD5Hash 的动态的字节组,它的初值就是将原始密码的字节组经过 MD5 加密后的结果。

第四句:

使用内置Base64 编码函数,把 MD5 加密结果进行 Base64 编码,并转换成字符串形式输出,最后返回。

 

PWDHash 编码过程中,除了输出和输入是字符串形式外,其他变量都是字节组形式的,很多人在用其他开发环境编写的时候,失败了,大都是因为中间的变量类型不正确所致。

2,快捷方式的生成

快捷方式的生成,在 .net 中没有现成的函数,这个操作稍微有点复杂,

A,在解决方案资源管理器中工程名上点右键,选择添加引用

B,在添加引用对话框中选择COM

C,然后选择"Windows Scripting Host Object Model"并添加

D,在代码页的顶端添加一句:Imports IWshRuntimeLibrary

E,添加以下函数代码

    '''<summary>创建快捷方式,返回结果表示是否创建成功</summary>

    '''<param name="SaveName">将快捷方式保存到的位置</param>

    '''<param name="TargetName">快捷方式指向的目标名</param>

    '''<param name="Arguments">执行参数,默认为空</param>

    '''<param name="WorkingDirectory">起始位置</param>

    '''<param name="WindowStyle">运行方式,1,常规窗口;3,最大化;7最小化.默认为1</param>

    '''<param name="Description">备注</param>

    '''<param name="IconLocation">图标</param>

    Function CreateShortCut(ByVal SaveName As String, ByVal TargetName As String, Optional ByVal Arguments As String = "", Optional ByVal WorkingDirectory As String = "", Optional ByVal WindowStyle As Integer = 1, Optional ByVal Description As String = "Powered By Null", Optional ByVal IconLocation As String = "") As Boolean

        If Strings.LCase(Strings.Right(SaveName, 4)) <> ".lnk" Then

            SaveName &= ".lnk"

        End If

 

        Try

            Dim WshShell As New WshShell

            Dim ShortCut As IWshRuntimeLibrary.IWshShortcut

            ShortCut = CType(WshShell.CreateShortcut(SaveName), IWshRuntimeLibrary.IWshShortcut)

            With ShortCut

                '目标

                .TargetPath = TargetName

                '命令行

                .Arguments = Arguments

                '运行方式

                .WindowStyle = WindowStyle

                '备注

                .Description = Description

                '起始位置

                .WorkingDirectory = WorkingDirectory

                '图标

                If IconLocation = "" Then

                    .IconLocation = TargetName

                Else

                    .IconLocation = IconLocation

                End If

                .Save()

            End With

            Return True

        Catch ex As System.Exception

            Return False

        End Try

    End Function

函数上面都有关键注释了,这里就不再复述了。

3,QQ 安装路径的获取

主要是通过注册表读取来获取。

在注册表的 HKEY_LOCAL_MACHINE/SOFTWARE/TENCENT/PLATFORM_TYPE_LIST 下面有几个数字的子项,1中的 TypePath 存着 QQ 的安装路径,2中的 TypePath 存着 TM 的安装路径。

    '''<summary>从注册表获取QQ路径</summary>

    '''<param name="QQPath">返回的路径值,第一维为序号,第二维长度为,0,名称;1,路径</param>

    Function GetQQPath(ByRef QQPath(,) As String) As Boolean

        Dim HKLM As RegistryKey = Registry.LocalMachine

        Dim Software As RegistryKey = HKLM.OpenSubKey("Software")

        Dim PLATFORM_TYPE_LIST As RegistryKey = Software.OpenSubKey("TENCENT/PLATFORM_TYPE_LIST")

 

        If PLATFORM_TYPE_LIST IsNot Nothing AndAlso PLATFORM_TYPE_LIST.SubKeyCount > 0 Then

            Dim SubCount As Integer = PLATFORM_TYPE_LIST.SubKeyCount

            Dim tmpKey As RegistryKey

            Dim i As Integer = 0

            Dim SubKey(SubCount - 1) As String

            ReDim QQPath(SubCount - 1, 1)

 

            SubKey = PLATFORM_TYPE_LIST.GetSubKeyNames

            For i = 0 To SubCount - 1

                tmpKey = PLATFORM_TYPE_LIST.OpenSubKey(SubKey(i))

                QQPath(i, 0) = tmpKey.GetValue("TypeName")

                QQPath(i, 1) = tmpKey.GetValue("TypePath")

                tmpKey.Close()

            Next

            PLATFORM_TYPE_LIST.Close()

            Software.Close()

            HKLM.Close()

            Return True

        End If

        QQPath = Nothing

        Return False

    End Function

借助 MSDN,上面的源代码不难不懂。

4.其他

       其他运行过程代码,请参见源文件。

资源

该程序以及源文件下载:

http://docrackit.googlepages.com/QQShortcut_Scr.rar

http://hi.baidu.com/hetaoos/blog/item/02a6b40e672d6ae637d1223f.html

我的博客:

http://hi.baidu.com/hetaoos

界面预览

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值