/**
* @file 2005beta2-IQQData_IQQCore_IDynamicData.txt
*
* @brief 2005beta2-IQQData_IQQCore_IDynamicData.txt,v1.0 2005/09/08 23:58:18 sunwang
*
* QQ的核心接口分析 IQQData IQQCore IDynamicData,主要集中在BasicCtrlDll.dll QQHelperDll.dll,找几个引出函数分析分析
* 如 CreateQQData IsFriendOnline GetFriendQQVer etc... 这些接口除了00 04 08是IUnknown以外,其他只有分析代码了
* void __cdecl CreateQQData(struct IQQData * *)
* int __cdecl IsFriendOnline(struct IQQCore *,unsigned long) [*]
* int __cdecl GetFriendQQData(struct IQQCore *,unsigned long,struct IQQData * *) [*]
* int __cdecl GetCurrentUin(struct IQQCore *,unsigned long *)
* void __cdecl GetCurrentUserData(struct IQQCore *,struct IQQData * *)
* int __cdecl GetFriendStat(struct IQQCore *,unsigned long)
* long __cdecl GetQQDataBuf(struct IQQData *,char const *,class CString &) [*] //<-------刚开始不知道有这个函数,好累
* long __cdecl GetQQDataStr(struct IQQData *,char const *,class CString &) [*] //<-------刚开始不知道有这个函数,好累
*
* 两个问题: 其他的都可以通过上面的函数搞定!
* 1.IQQCore* 哪里得到?
* 1.1 找一个不接口上不需要IQQCore*的函数分析,起内部肯定有引用,看这个引用在哪里,就可以得到了。嘿嘿。
* int __cdecl IsFriend3GUser(unsigned long) //<--------分析太苦难了,自己找苦头
* 1.2 hook一个带IQQCore*为参数的函数,就可以得到了,如
* int __cdecl InitQQShow(struct IQQCore *) [*]
* 1.3 得到IQQCore*指针后,根据需要,拼凑vtbl就可以了
*
* 2.FriendUID 哪里得到? unsigned long 都是uin。tnnd。难点! 和 hook CQQCtrlBarWndEx wndproc一样困难。
* 2.1 总会有函数初始化这个东西,并放在哪里的,要找准函数分析了
* 2.1.1 CQQBarCtrlWndEx,只能依赖这个对象的偏移了,它的某个偏移肯定有uid
* 2.1.2 CQQAllInOneDlg,只能依赖这个对象的偏移了,它的某个偏移肯定有uid。前面分析过CQQAllInStatusBar,上面有拼凑nickname(uid):xxx
* 的代码,可能有用。void __thiscall CAllInOneStatusBar::GenStrShow(void),便宜340h就是!!!。 [*]
* 第一次WM_CREATE时候,得到偏移,此时肯定没有uid,以后得到消息就重新取,并增加自定义消息发给窗口来刷新显示了
* 2.2 hook函数拦截参数? 呵呵,不合适。我们要在对话框窗口出来和在CQQBarCtrlWndEx出来的时候,就能得到friend uin,呵呵
*
* @author sunwang<sunwangme@hotmail.com>
*/
/* BasicCtrlDll.dll
.text:10001C05 ; Exported entry 42. ?CreateQQData@@YAXPAPAUIQQData@@@Z
.text:10001C05
.text:10001C05 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text:10001C05
.text:10001C05
.text:10001C05 ; void __cdecl CreateQQData(struct IQQData * *)
.text:10001C05 public ?CreateQQData@@YAXPAPAUIQQData@@@Z
.text:10001C05 ?CreateQQData@@YAXPAPAUIQQData@@@Z proc near
.text:10001C05
.text:10001C05 arg_0 = dword ptr 8
.text:10001C05
.text:10001C05 push edi
.text:10001C06 mov edi, [esp+arg_0]
.text:10001C0A test edi, edi
.text:10001C0C jz short loc_10001C33
.text:10001C0E push esi
.text:10001C0F mov ecx, offset off_100229E8
.text:10001C14 call ?CreateObject@CRuntimeClass@@QAEPAVCObject@@XZ ; CRuntimeClass::CreateObject(void)
.text:10001C19 mov esi, eax
.text:10001C1B test esi, esi
.text:10001C1D jnz short loc_10001C24
.text:10001C1F call ?AfxThrowMemoryException@@YGXXZ ; AfxThrowMemoryException(void)
.text:10001C24
.text:10001C24 loc_10001C24: ; CODE XREF: CreateQQData(IQQData * *)+18j
.text:10001C24 push offset clsid_IQQData
.text:10001C29 mov ecx, esi
.text:10001C2B call ?GetInterface@CCmdTarget@@QAEPAUIUnknown@@PBX@Z ; CCmdTarget::GetInterface(void const *)
.text:10001C30 mov [edi], eax ; *(void**)=IQQData*
.text:10001C32 pop esi
.text:10001C33
.text:10001C33 loc_10001C33: ; CODE XREF: CreateQQData(IQQData * *)+7j
.text:10001C33 pop edi
.text:10001C34 retn
.text:10001C34 ?CreateQQData@@YAXPAPAUIQQData@@@Z endp
*/
/* BasicCtrlDll.dll
.rdata:100229C8 clsid_IQQData db 1Eh ; DATA XREF: CreateQQData(IQQData * *):loc_10001C24o
.rdata:100229C8 ; GetFriendNetwork(IQQCore *,ulong,int &,ulong &,ulong &,int &)+9Ao ...
.rdata:100229C9 db 3Ah ; :
.rdata:100229CA db 86h ; ?
.rdata:100229CB db 0BAh ; ?
.rdata:100229CC db 79h ; y
.rdata:100229CD db 0C9h ; ?
.rdata:100229CE db 8Ah ; ?
.rdata:100229CF db 49h ; I
.rdata:100229D0 db 97h ; ?
.rdata:100229D1 db 5Ch ; /
.rdata:100229D2 db 0C5h ; ?
.rdata:100229D3 db 0
.rdata:100229D4 db 1Ch
.rdata:100229D5 db 4Fh ; O
.rdata:100229D6 db 31h ; 1
.rdata:100