我是这样来做破解qq,做QQ外挂的 【-】

本文详细介绍了如何破解QQ并开发外挂,主要涉及QQ核心接口IQDData、IQQCore和IDynamicData的分析,包括CreateQQData、IsFriendOnline等函数的使用。通过hook技术获取IQQCore指针,并解析出FriendUID,探讨了在不同阶段获取QQ数据的方法,为QQ外挂开发提供关键步骤。

/**
 * @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:100229D7                 db 0A3h ; ?
*/

/* BasicCtrlDll.dll
static CLSID clsid_QQData=
{
    0xBA863A1E,
    0x0C979,
    0x498A,
    0x97, 0x5C, 0x0C5, 0, 0x1C, 0x4F, 0x31, 0x0A3
};
*/

/* QQHelperDll.dll 怎么使用CreateQQData(IQQData * *)的产生的接口IQQData
.text:60865BD5 loc_60865BD5:                           ; CODE XREF: sub_60865939+291j
.text:60865BD5                 lea     eax, [ebp+8]
.text:60865BD8                 push    eax
.text:60865BD9                 call    ?CreateQQData@@YAXPAPAUIQQData@@@Z ; CreateQQData(IQQData * *)
.text:60865BDE                 mov     eax, [ebp+8]    ; eax=IQQData*
.text:60865BE1                 pop     ecx
.text:60865BE2                 push    dword ptr [ebp-2Ch] ; var_ID
.text:60865BE5                 mov     ecx, [eax]      ; IQQData->vtbl
.text:60865BE7                 push    offset aId      ; param_str_ID
.text:60865BEC                 push    eax             ; (IData*)this
.text:60865BED                 call    dword ptr [ecx+20h] ; IQQData->vf_20h(param_str_ID,(void*)&var_ID)
.text:60865BF0                 mov     eax, [ebp+8]    ; eax=IQQData*
.text:60865BF3                 lea     edx, [ebp-218h] ; var_NUMBER
.text:60865BF9                 push    edx
.text:60865BFA                 push    offset aNumber  ; "NUMBER"
.text:60865BFF                 mov     ecx, [eax]
.text:60865C01                 push    eax
.text:60865C02                 call    dword ptr [ecx+20h] ; IQQData->vf_20h(param_str_NUMBER,(void*)&var_NUMBER)
.text:60865C05                 mov     eax, [ebp+8]
.text:60865C08                 lea     edx, [ebp-218h]
.text:60865C0E                 push    edx
.text:60865C0F                 push    offset aNumsave ; "NUMSAVE"
.text:60865C14                 mov     ecx, [eax]
.text:60865C16                 push    eax
.text:60865C17                 call    dword ptr [ecx+20h] ; IQQData->vf_20h(param_str_NUMSAVE,(void*)&var_NUMSAVE)
.text:60865C1A                 mov     eax, [ebp+8]
.text:60865C1D                 lea     edx, [ebp-248h]
.text:60865C23                 push    edx
.text:60865C24                 push    offset aName    ; "NAME"
.text:60865C29                 mov     ecx, [eax]
.text:60865C2B                 push    eax
.text:60865C2C                 call    dword ptr [ecx+20h] ; IQQData->vf_20h(param_str_NAME,(void*)&var_NAME)
.text:60865C2F                 mov     eax, [ebp+8]    ; eax=IQQData*
.text:60865C32                 mov     esi, eax        ; esi=IQQData*
.text:60865C34                 mov     edi, [eax]      ; edi=IQQData*->vtbl
.text:60865C36                 lea     eax, [ebp-228h] ; var_UIN
.text:60865C3C                 push    eax             ; char *
.text:60865C3D                 call    ds:atol
.text:60865C43                 pop     ecx
.text:60865C44                 push    eax             ; var_UIN
.text:60865C45                 push    offset aUin     ; "UIN"
.text:60865C4A                 push    esi             ; (IQQData*)this
.text:60865C4B                 call    dword ptr [edi+18h] ; IQQData*->vf_18h(var_UIN,str_UIN)
.text:60865C4E                 mov     eax, [ebp+8]
.text:60865C51                 push    dword ptr [ebp-25Ch]
.text:60865C57                 mov     ecx, [eax]
.text:60865C59                 push    offset aType    ; "TYPE"
.text:60865C5E                 push    eax
.text:60865C5F                 call    dword ptr [ecx+10h] ; IQQData*->vf_10h(str_TYPE,var_TYPE)
.text:60865C62                 mov     eax, [ebp+8]
.text:60865C65                 push    dword ptr [ebp-25Bh]
.text:60865C6B                 mov     ecx, [eax]
.text:60865C6D                 push    offset aImage   ; "IMAGE"
.text:60865C72                 push    eax
.text:60865C73                 call    dword ptr [ecx+10h] ; IQQData*->vf_10h(str_IMAGE,var_IMAGE)
.text:60865C76                 mov     eax, [ebp+8]
.text:60865C79                 push    dword ptr [ebp-250h]
.text:60865C7F                 mov     ecx, [eax]
.text:60865C81                 push    offset aGender  ; "GENDER"
.text:60865C86                 push    eax
.text:60865C87                 call    dword ptr [ecx+0Ch] ; IQQData*->vf_0ch(str_GENDER,var_GENDER)
.text:60865C8A                 mov     eax, [ebp+8]
.text:60865C8D                 push    dword ptr [ebp-254h]
.text:60865C93                 mov     ecx, [eax]
.text:60865C95                 push    offset aFace    ; "FACE"
.text:60865C9A                 push    eax
.text:60865C9B                 call    dword ptr [ecx+14h] ; IQQData*->vf_14h(str_FACE,var_FACE)
.text:60865C9E                 mov     eax, [ebp+8]
.text:60865CA1                 push    dword ptr [ebp-24Ch]
.text:60865CA7                 mov     ecx, [eax]
.text:60865CA9                 push    offset aLantype ; "LANTYPE"
.text:60865CAE                 push    eax
.text:60865CAF                 call    dword ptr [ecx+0Ch] ; IQQData*->vf_0ch(str_LANTYPE,var_LANTYPE)
.text:60865CB2                 mov     eax, [ebp+8]
.text:60865CB5                 lea     edx, [ebp-1F8h]
.text:60865CBB                 push    edx
.text:60865CBC                 push    offset aNote    ; "NOTE"
.text:60865CC1                 mov     ecx, [eax]
.text:60865CC3                 push    eax
.text:60865CC4                 call    dword ptr [ecx+20h]
.text:60865CC7                 mov     eax, [ebp+8]
.text:60865CCA                 mov     ecx, [eax]
.text:60865CCC                 lea     edx, [ebp-178h]
.text:60865CD2                 push    edx
.text:60865CD3                 push    offset aState   ; "STATE"
.text:60865CD8                 push    eax
.text:60865CD9                 call    dword ptr [ecx+20h]
.text:60865CDC                 mov     eax, [ebp+8]
.text:60865CDF                 push    dword ptr [ebp-0F8h]
.text:60865CE5                 mov     ecx, [eax]
.text:60865CE7                 push    offset aGrpclr  ; "GRPCLR"
.text:60865CEC                 push    eax
.text:60865CED                 call    dword ptr [ecx+18h]
.text:60865CF0                 mov     eax, [ebp-34h]
.text:60865CF3                 cmp     [eax+20h], ebx
.text:60865CF6                 mov     eax, [ebp+8]
.text:60865CF9                 mov     ecx, [eax]
.text:60865CFB                 jz      loc_60865E50
.text:60865D01                 push    dword ptr [ebp-0F4h]
.text:60865D07                 push    offset aMbltype ; "MBLTYPE"
.text:60865D0C                 push    eax
.text:60865D0D                 call    dword ptr [ecx+1Ch]
.text:60865D10                 mov     eax, [ebp+8]
.text:60865D13                 push    dword ptr [ebp-0F0h]
.text:60865D19                 mov     ecx, [eax]
.text:60865D1B                 push    offset aMbrand  ; "MBRAND"
.text:60865D20                 push    eax
.text:60865D21                 call    dword ptr [ecx+1Ch]
.text:60865D24                 mov     eax, [ebp+8]
.text:60865D27                 lea     edx, [ebp-0ECh]
.text:60865D2D                 push    edx
.text:60865D2E                 mov     ecx, [eax]
.text:60865D30                 jmp     loc_60865E75
.text:60865D35 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
*/

/* QQHelperDll.dll 怎么使用CreateQQData(IQQData * *)的产生的接口IQQData
ext:6087289F ; Exported entry 352. ?IsFriendOnline@@YAHPAUIQQCore@@K@Z
.text:6087289F
.text:6087289F ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text:6087289F
.text:6087289F
.text:6087289F ; int __cdecl IsFriendOnline(struct IQQCore *,unsigned long)
.text:6087289F                 public ?IsFriendOnline@@YAHPAUIQQCore@@K@Z
.text:6087289F ?IsFriendOnline@@YAHPAUIQQCore@@K@Z proc near
.text:6087289F                                         ; CODE XREF: IsAllowAddToGAudioChat(ulong,int,HWND__ *)+18Fp
.text:6087289F                                         ; IsAllowAddToInGAudioChat(ulong,ulong,int,HWND__ *)+125p
.text:6087289F                 mov     eax, offset loc_60895A2C
.text:608728A4                 call    __EH_prolog
.text:608728A9                 push    ecx
.text:608728AA                 push    ebx
.text:608728AB                 xor     ebx, ebx
.text:608728AD                 mov     [ebp-10h], ebx  ; ebx = 0
.text:608728B0                 lea     eax, [ebp-10h]  ; var_IQQData**
.text:608728B3                 mov     [ebp-4], ebx
.text:608728B6                 push    eax             ; var_IQQData**
.text:608728B7                 push    dword ptr [ebp+0Ch] ; arg_QQID
.text:608728BA                 push    dword ptr [ebp+8] ; arg_IQQCore*
.text:608728BD                 call    ?GetFriendQQData@@YAHPAUIQQCore@@KPAPAUIQQData@@@Z ; GetFriendQQData(IQQCore *,ulong,IQQData * *)
.text:608728C2                 add     esp, 0Ch
.text:608728C5                 test    eax, eax        ; if(IQQData* == NULL)
.text:608728C7                 jz      short loc_60872933
.text:608728C9                 mov     [ebp+0Ch], ebx  ; arg_QQID = 0
.text:608728CC                 mov     eax, [ebp-10h]  ; eax = IQQData*
.text:608728CF                 lea     edx, [ebp+0Ch]  ; edx = &arg_QQID,IDynamicData*
.text:608728D2                 push    edx
.text:608728D3                 push    offset clsid_IQQData
.text:608728D8                 mov     ecx, [eax]      ; ecx = IQQData*->vtbl
.text:608728DA                 push    offset aQquser_dynamic ; "QQUSER_DYNAMIC_DATA"
.text:608728DF                 push    eax             ; (IQQData*)this
.text:608728E0                 mov     byte ptr [ebp-4], 1 ; *var_4 = 1
.text:608728E4                 call    dword ptr [ecx+54h] ; IQQData*->vf_54h(str_QQUSER_DYNAMIC_DATA,clsid_IQQData,void*)
.text:608728E7                 mov     eax, [ebp+0Ch]  ; if(IDynamicData* == 0)
.text:608728EA                 cmp     eax, ebx
.text:608728EC                 jz      short loc_60872933
.text:608728EE                 mov     ecx, [eax]      ; ecx = IDynamicData*->vtbl
.text:608728F0                 lea     edx, [ebp+8]    ; &var_8
.text:608728F3                 push    edx
.text:608728F4                 push    offset aQqdd_status ; "QQDD_STATUS"
.text:608728F9                 push    eax             ; (IDynamicData*)this
.text:608728FA                 call    dword ptr [ecx+38h] ; IDynamicData*->vf_38h(str_QQDD_STATUS,void*)
.text:608728FD                 cmp     dword ptr [ebp+8], 14h ; if(var_8 == 14h)
.text:60872901                 mov     eax, [ebp+0Ch]  ; eax = IDynamicData*
.text:60872904                 mov     [ebp-4], bl
.text:60872907                 jz      short loc_60872929
.text:60872909                 cmp     eax, ebx        ; if (IDynamicData* == 0),操,没有优化的代码
.text:6087290B                 jz      short loc_60872913 ; eax = IQQData*
.text:6087290D                 mov     ecx, [eax]      ; ecx = IDynamicData*->vtbl
.text:6087290F                 push    eax             ; (IDynamicData*)this
.text:60872910                 call    dword ptr [ecx+8] ; IDynamicData*->vf_08h_Release()
.text:60872913
.text:60872913 loc_60872913:                           ; CODE XREF: IsFriendOnline(IQQCore *,ulong)+6Cj
.text:60872913                 mov     eax, [ebp-10h]  ; eax = IQQData*
.text:60872916                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:6087291A                 cmp     eax, ebx
.text:6087291C                 jz      short loc_60872924
.text:6087291E                 mov     ecx, [eax]      ; ecx = IQQData*->vtbl
.text:60872920                 push    eax             ; (IQQData*)this
.text:60872921                 call    dword ptr [ecx+8] ; IQQData*->vf_08h_Release()
.text:60872924
.text:60872924 loc_60872924:                           ; CODE XREF: IsFriendOnline(IQQCore *,ulong)+7Dj
.text:60872924                 push    1
.text:60872926                 pop     eax
.text:60872927                 jmp     short loc_60872946
.text:60872929 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:60872929
.text:60872929 loc_60872929:                           ; CODE XREF: IsFriendOnline(IQQCore *,ulong)+68j
.text:60872929                 cmp     eax, ebx
.text:6087292B                 jz      short loc_60872933
.text:6087292D                 mov     ecx, [eax]
.text:6087292F                 push    eax
.text:60872930                 call    dword ptr [ecx+8]
.text:60872933
.text:60872933 loc_60872933:                           ; CODE XREF: IsFriendOnline(IQQCore *,ulong)+28j
.text:60872933                                         ; IsFriendOnline(IQQCore *,ulong)+4Dj ...
.text:60872933                 mov     eax, [ebp-10h]
.text:60872936                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:6087293A                 cmp     eax, ebx
.text:6087293C                 jz      short loc_60872944
.text:6087293E                 mov     ecx, [eax]
.text:60872940                 push    eax
.text:60872941                 call    dword ptr [ecx+8]
.text:60872944
.text:60872944 loc_60872944:                           ; CODE XREF: IsFriendOnline(IQQCore *,ulong)+9Dj
.text:60872944                 xor     eax, eax
.text:60872946
.text:60872946 loc_60872946:                           ; CODE XREF: IsFriendOnline(IQQCore *,ulong)+88j
.text:60872946                 mov     ecx, [ebp-0Ch]
.text:60872949                 pop     ebx
.text:6087294A                 mov     large fs:0, ecx
.text:60872951                 leave
.text:60872952                 retn
.text:60872952 ?IsFriendOnline@@YAHPAUIQQCore@@K@Z endp ; sp =  4

*/

/*
.text:6087E8F2 ; Exported entry 349. ?IsFriend3GUser@@YAHK@Z
.text:6087E8F2
.text:6087E8F2 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text:6087E8F2
.text:6087E8F2
.text:6087E8F2 ; int __cdecl IsFriend3GUser(unsigned long)
.text:6087E8F2                 public ?IsFriend3GUser@@YAHK@Z
.text:6087E8F2 ?IsFriend3GUser@@YAHK@Z proc near       ; CODE XREF: StartTrayAnimate(IQQCore *)+708p
.text:6087E8F2                 mov     eax, offset loc_60897220
.text:6087E8F7                 call    __EH_prolog
.text:6087E8FC                 sub     esp, 10h
.text:6087E8FF                 push    ebx
.text:6087E900                 xor     ebx, ebx
.text:6087E902                 push    esi
.text:6087E903                 mov     [ebp-18h], ebx
.text:6087E906                 mov     [ebp-4], ebx
.text:6087E909                 call    ?AfxGetAppModuleState@@YGPAVAFX_MODULE_STATE@@XZ ; AfxGetAppModuleState(void)
.text:6087E90E                 mov     eax, [eax+4]
.text:6087E911                 lea     ecx, [ebp-18h]
.text:6087E914                 push    ecx             ; var_IQQData*
.text:6087E915                 push    dword ptr [ebp+8] ; arg_UIN
.text:6087E918                 mov     eax, [eax+0D4h]
.text:6087E91E                 push    eax             ; IQQCore*
.text:6087E91F                 call    ?GetFriendQQData@@YAHPAUIQQCore@@KPAPAUIQQData@@@Z ; GetFriendQQData(IQQCore *,ulong,IQQData * *)
.text:6087E924                 add     esp, 0Ch
.text:6087E927                 test    eax, eax
.text:6087E929                 jz      loc_6087E9E7
.text:6087E92F                 mov     [ebp-1Ch], ebx
.text:6087E932                 mov     [ebp-0Dh], bl
.text:6087E935                 mov     [ebp-14h], ebx
.text:6087E938                 mov     eax, [ebp-18h]
.text:6087E93B                 lea     edx, [ebp-0Dh]
.text:6087E93E                 mov     esi, offset aQquser_dynamic ; "QQUSER_DYNAMIC_DATA"
.text:6087E943                 push    edx
.text:6087E944                 mov     ecx, [eax]
.text:6087E946                 push    esi
.text:6087E947                 push    eax
.text:6087E948                 mov     byte ptr [ebp-4], 1
.text:6087E94C                 call    dword ptr [ecx+70h]
.text:6087E94F                 test    eax, eax
.text:6087E951                 jl      loc_6087E9D7
.text:6087E957                 cmp     byte ptr [ebp-0Dh], 8
.text:6087E95B                 jnz     short loc_6087E9D7
.text:6087E95D                 mov     eax, [ebp-14h]
.text:6087E960                 cmp     eax, ebx
.text:6087E962                 jz      short loc_6087E96D
.text:6087E964                 mov     ecx, [eax]
.text:6087E966                 push    eax
.text:6087E967                 call    dword ptr [ecx+8]
.text:6087E96A                 mov     [ebp-14h], ebx
.text:6087E96D
.text:6087E96D loc_6087E96D:                           ; CODE XREF: IsFriend3GUser(ulong)+70j
.text:6087E96D                 mov     eax, [ebp-18h]
.text:6087E970                 lea     edx, [ebp-14h]
.text:6087E973                 push    edx
.text:6087E974                 push    offset clsid_IQQData
.text:6087E979                 mov     ecx, [eax]
.text:6087E97B                 push    esi
.text:6087E97C                 push    eax
.text:6087E97D                 call    dword ptr [ecx+54h]
.text:6087E980                 test    eax, eax
.text:6087E982                 jl      short loc_6087E9D7
.text:6087E984                 mov     eax, [ebp-14h]
.text:6087E987                 lea     edx, [ebp-0Dh]
.text:6087E98A                 mov     esi, offset aQquser_3g_user ; "QQUSER_3G_USERLOGIN"
.text:6087E98F                 push    edx
.text:6087E990                 mov     ecx, [eax]
.text:6087E992                 push    esi
.text:6087E993                 push    eax
.text:6087E994                 call    dword ptr [ecx+70h]
.text:6087E997                 test    eax, eax
.text:6087E999                 jl      short loc_6087E9D7
.text:6087E99B                 cmp     byte ptr [ebp-0Dh], 1
.text:6087E99F                 jnz     short loc_6087E9D7
.text:6087E9A1                 mov     eax, [ebp-14h]
.text:6087E9A4                 lea     edx, [ebp-1Ch]
.text:6087E9A7                 push    edx
.text:6087E9A8                 push    esi
.text:6087E9A9                 mov     ecx, [eax]
.text:6087E9AB                 push    eax
.text:6087E9AC                 call    dword ptr [ecx+28h]
.text:6087E9AF                 mov     eax, [ebp-14h]
.text:6087E9B2                 mov     esi, [ebp-1Ch]
.text:6087E9B5                 cmp     eax, ebx
.text:6087E9B7                 mov     [ebp-4], bl
.text:6087E9BA                 jz      short loc_6087E9C2
.text:6087E9BC                 mov     ecx, [eax]
.text:6087E9BE                 push    eax
.text:6087E9BF                 call    dword ptr [ecx+8]
.text:6087E9C2
.text:6087E9C2 loc_6087E9C2:                           ; CODE XREF: IsFriend3GUser(ulong)+C8j
.text:6087E9C2                 mov     eax, [ebp-18h]
.text:6087E9C5                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:6087E9C9                 cmp     eax, ebx
.text:6087E9CB                 jz      short loc_6087E9D3
.text:6087E9CD                 mov     ecx, [eax]
.text:6087E9CF                 push    eax
.text:6087E9D0                 call    dword ptr [ecx+8]
.text:6087E9D3
.text:6087E9D3 loc_6087E9D3:                           ; CODE XREF: IsFriend3GUser(ulong)+D9j
.text:6087E9D3                 mov     eax, esi
.text:6087E9D5                 jmp     short loc_6087E9FA
.text:6087E9D7 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:6087E9D7
.text:6087E9D7 loc_6087E9D7:                           ; CODE XREF: IsFriend3GUser(ulong)+5Fj
.text:6087E9D7                                         ; IsFriend3GUser(ulong)+69j ...
.text:6087E9D7                 mov     eax, [ebp-14h]
.text:6087E9DA                 mov     [ebp-4], bl
.text:6087E9DD                 cmp     eax, ebx
.text:6087E9DF                 jz      short loc_6087E9E7
.text:6087E9E1                 mov     ecx, [eax]
.text:6087E9E3                 push    eax
.text:6087E9E4                 call    dword ptr [ecx+8]
.text:6087E9E7
.text:6087E9E7 loc_6087E9E7:                           ; CODE XREF: IsFriend3GUser(ulong)+37j
.text:6087E9E7                                         ; IsFriend3GUser(ulong)+EDj
.text:6087E9E7                 mov     eax, [ebp-18h]
.text:6087E9EA                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:6087E9EE                 cmp     eax, ebx
.text:6087E9F0                 jz      short loc_6087E9F8
.text:6087E9F2                 mov     ecx, [eax]
.text:6087E9F4                 push    eax
.text:6087E9F5                 call    dword ptr [ecx+8]
.text:6087E9F8
.text:6087E9F8 loc_6087E9F8:                           ; CODE XREF: IsFriend3GUser(ulong)+FEj
.text:6087E9F8                 xor     eax, eax
.text:6087E9FA
.text:6087E9FA loc_6087E9FA:                           ; CODE XREF: IsFriend3GUser(ulong)+E3j
.text:6087E9FA                 mov     ecx, [ebp-0Ch]
.text:6087E9FD                 pop     esi
.text:6087E9FE                 pop     ebx
.text:6087E9FF                 mov     large fs:0, ecx
.text:6087EA06                 leave
.text:6087EA07                 retn
.text:6087EA07 ?IsFriend3GUser@@YAHK@Z endp ; sp =  4

*/

Computers and computer networks are one of the most incredible inventions of the 20th century, having an ever-expanding role in our daily lives by enabling complex human activities in areas such as entertainment, education, and commerce. One of the most challenging problems in computer science for the 21st century is to improve the design of distributed systems where computing devices have to work together as a team to achieve common goals. In this book, I have tried to gently introduce the general reader to some of the most fundamental issues and classical results of computer science underlying the design of algorithms for distributed systems, so that the reader can get a feel of the nature of this exciting and fascinating field called distributed computing. The book will appeal to the educated layperson and requires no computer-related background. I strongly suspect that also most computer-knowledgeable readers will be able to learn something new. Gadi Taubenfeld is a professor and past dean of the School of Computer Science at the Interdisciplinary Center in Herzliya, Israel. He is an established authority in the area of concurrent and distributed computing and has published widely in leading journals and conferences. He authored the book Synchronization Algorithms and Concurrent Programming, published by Pearson Education. His primary research interests are in concurrent and distributed computing. Gadi was the head of the computer science division at Israel's Open University; member of technical staff at AT&T Bell Laboratories; consultant to AT&T Labs–Research; and a research scientist and lecturer at Yale University. Gadi served as the program committee chair of PODC 2013 and DISC 2008 and holds a Ph.D. in Computer Science from the Technion–Israel Institute of Technology.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值