首页
社区
课程
招聘
[旧帖] [讨论]关于"用汇编语言实现QQ自动登录" 0.00雪花
发表于: 2009-5-28 18:02 2117

[旧帖] [讨论]关于"用汇编语言实现QQ自动登录" 0.00雪花

2009-5-28 18:02
2117
收到论坛老鸟们的提示,用汇编语言编写的QQ自动登录(原帖地址:http://bbs.pediy.com/showthread.php?t=89901其代码在QQ2008正式版及以后版本中无法完成密码的输入,因此本人就把自己老掉牙的版本QQ2007卸载,再装上QQ2008IIBeta1版本测试了一下,晕,还真的不行。本人搞不懂QQ到底在干什么.没办法,只能根据自己已有的经验来分析了。通过调试程序发现:在源程序代码中:
    invoke FindWindowEx,hwndQQ,0,"#32770",0
    mov hwnd1,eax
    invoke FindWindowEx,hwnd1,0,"Edit",0
    mov hwnd2,eax
    所获得的密码编辑框的句柄(hwnd2)跟SPY++中所获得的句柄不一样。这就是不能完成密码输入的侦结所在。
    经过一段黑暗的摸索,我终于得到一个结论:QQ客户端在启动之后,密码子对话框有一个迷惑我们的Edit,这个Edit大概在QQ启动2-3秒钟之后就会消失,随即而来的是密码子对话框会在其内创建一个新的密码输入编辑框。这个编辑框才是可以真正输入密码的编辑框。
    为了证明我这个结论:启动windbg,用它来打开QQ客户端,QQ对话框一出现,立即点击Break(速度一定要快,要准);这个时候用spy++看看那个密码子对话框,发现它有一个子编辑框,记下它的句柄和标题,比如我测试的
一次是
    Class:Edit
    Caption:(空)
    Handle:0x000F02DE;
    让QQ客户端继续运行:
    kd>g
    过几秒中之后再次点击break(好像快捷键不能用);这个时候再用SPY++看一下,发现
    Class:Edit
    Caption:M(发现这个标题是随机的,每启动QQ一次,这个字符就变一次)
    Handle:0x0001E368
    这样前后两个编辑框的区别就大了。那么要获得真正的密码输入编辑框的句柄就不能用沿用以前的方法了,幸运的是,他们有标题的区别,我们就好办了,代码修改:
    在.data中定义一个变量
    Caption db 0,0,0,0 
原代码:
    invoke FindWindowEx,hwndQQ,0,"#32770",0
    mov hwnd1,eax
    invoke FindWindowEx,hwnd1,0,"Edit",0
    mov hwnd2,eax
修改为
    invoke FindWindowEx,hwndQQ,0,"#32770",0
    mov hwnd1,eax
    .WHILE(TRUE)
        invoke FindWindowEx,hwnd1,0,"Edit",0
        mov hwnd2,eax
        invoke GetWindowText,hwnd2,offset caption,2
        mov ebx,offset caption
        xor eax,eax
        mov eax,dword ptr [ebx]
    .BREAK.IF(eax)
    .ENDW
    原来QQ2008Beta1绕了这么一个弯子,问题总算解决了。

    另外本人看了一下QQ2009的正式版,发现QQ2009正式版有很多不同点,针对这一版本我又写了一份,并打包上传(VC++win32应用程序),可是这个工程编译后有时候能够正常执行,有时侯却不能正常执行,还请大牛看一下是为什么.QQ2009正式版本来就不好调试,本人又不懂得破解,想破脑壳也不知道到底是什么地方出了问题,只好求助大牛们了。下载不了附件的话,可看代码:
#include "stdafx.h"
#include "shellapi.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
  HWND hwndQQ=NULL,hwnd1=NULL,hwnd2=NULL;

  ShellExecute(0,"OPEN","C:\\Program Files\\TENCENT\\QQ\\Bin\\QQ.exe",0,0,SW_SHOW);//启动QQ
  while(true)
  {
    if(hwndQQ=FindWindow("TXGuiFoundation","QQ2009 正式版"))
      break;
  }

  hwnd1=FindWindowEx(hwndQQ,0,"ATL:602E54D8","");
  if(hwnd1)
  {
    SendMessage(hwnd1,WM_SETTEXT,0,(LPARAM)"123456789");//输入帐号
  }

  hwnd2=FindWindowEx(hwndQQ,0,"Edit",0);
  if(hwnd2)
  {
    PostMessage(hwnd2,WM_CHAR,'P',0);//开始输入密码
    PostMessage(hwnd2,WM_CHAR,'A',0);
    PostMessage(hwnd2,WM_CHAR,'S',0);
    PostMessage(hwnd2,WM_CHAR,'S',0);
  }

  PostMessage(hwndQQ,WM_LBUTTONDOWN,0,0x00C00124);//点击登录
  PostMessage(hwndQQ,WM_LBUTTONUP,0,0x00C00124);
  return 0;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 411
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
测试一下。呵呵,沙发。
2009-5-28 20:24
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
挺神的,不过还看不懂汇编
2009-5-28 22:37
0
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
4
有时候能正确执行,有时候不能

这个和执行的时间有没有关系
2009-5-28 23:23
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我将编译后的程序运行后关闭再运行,有时候连续几次都能执行成功,有时候成功一次,接着失败一次,应该跟执行的时间没有关系.
2009-5-28 23:36
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你获得句柄之后要判断下,如果获取不到,就调用ExitProcess()退出。
2009-5-29 00:14
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看看,还是好强的说 ........
2009-5-29 02:38
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
的确有发现不了hwnd1和hwnd2的可能,因此多加了一段:
  for(int i=0;i<100;i++) //10秒钟之内找不到句柄就退出
  {
    hwnd1=hwnd2=NULL;
    hwnd1=FindWindowEx(hwndQQ,0,"ATL:602E54D8","");
    hwnd2=FindWindowEx(hwndQQ,0,"Edit",0);
    if((hwnd1!=NULL)&&(hwnd2!=NULL))
      break;
    Sleep(100);
  }
效果的确好多了,而且现在的问题的问题也非常明了:假如先打开一个QQ2009客户端,那么只要在密码编辑框点击一下,然后再来运行程序,就又不能正常运行,如果打开客户端之后不点击密码编辑框,只点击别的位置,如账号输入框,那就没有问题.不知道有没有朋友遇到相同的问题,我想:腾迅可能对那个密码输入编辑框作了一些特殊的检测.
2009-5-29 07:51
0
雪    币: 212
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
在C:\WINDOWS\system32\qqedit这个文件夹下有个密码输入控件是不是和这个有关啊
2009-8-22 11:38
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
  最恐怖的是我不会用。。。。。
2009-8-22 12:49
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
顶楼主!!!
2010-6-18 12:52
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
发现一个问题     就是无法实现多开,当已经有一个QQ在运行,再运行这个程序会没有效果,因为程序运行后虽然又打开了一个QQ,但找到的句柄都是之前那个qq的。
2010-9-7 23:15
0
雪    币: 55
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
刚开始学.受教了...
2010-9-8 08:58
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持一下!!!!
2010-9-8 09:23
0
游客
登录 | 注册 方可回帖
返回
//