03605EFF FF15 38506C03 call dword ptr [<&BasicCtrlDll.IsVIP>] ; BasicCtr.IsVIP
* ^判断当前登陆的QQ是否为VIP,因为VIP用户是可以关闭QQ广告的
03605F05 8365 FC 00 and dword ptr [ebp-4], 0
03605F09 8BF0 mov esi, eax
03605F0B 8D45 FC lea eax, dword ptr [ebp-4]
03605F0E 6A 01 push 1
03605F10 50 push eax
03605F11 68 E8A76D03 push 036DA7E8 ; ASCII "m_bMemberDisableAD"
03605F16 FF15 206D6C03 call dword ptr [<&QQHelperDll.GetSysBoolData'>; QQHelper.GetSysBoolData
* ^获取广告显示设置
03605F1C 83C4 10 add esp, 10
03605F1F 85F6 test esi, esi
03605F21 5E pop esi
03605F22 74 0B je short 03605F2F
* ^关键!!! 不是VIP就跳的,所以把这个NOP了
03605F24 837D FC 00 cmp dword ptr [ebp-4], 0
03605F28 74 05 je short 03605F2F
* ^关键!!! 没关闭AD就跳,所以再把这个NOP了
03605F2A 6A 01 push 1
03605F2C 58 pop eax
这样,就实现了去AD了
具体可以使直接NOP代码,或者采用Hook方法:
function IsVIP(pQQCore: Pointer): Integer; cdecl;
begin
Result := 1;
end;
function GetSysBoolData(AText: PChar; p: Pointer; bIsVIP: Boolean): Integer; cdecl;
// int __cdecl GetSysBoolData(char const *,int &,int)
begin
if AText = 'm_bMemberDisableAD' then
begin
Integer(p^) := 1;
Result := 1;
Exit;
end;
Result := Call original Func; 调用原函数
end;
探讨到此,一定会有人说:如果实现了本地会员,那就不用这么麻烦了嘛!显然,这是个捷径,实现起来也不难!关键是找到突破口!经过DASM的分析,QQHelperDll是个入手点。用PEExplorer认真查找,果然又有发现,那就是[email=IsVipUser@qdatCurrentUser@@QAEHXZ]IsVipUser@qdatCurrentUser@@QAEHXZ[/email]
一个无参数函数,Hook了,并让其返回EAX=1,呵呵,果然成了本地VIP,这个本地VIP就可以享受QQ2007II的涂鸦表情的功能了。
可是到了这里却仍旧发现QQ的设置上,还是说你是"非会员",不能屏蔽广告,该怎么办呢?显然的是QQQSettingCtrl.dll并没有调用qdatCurrentUser::IsVipUser来进行判断。那它调用了哪个函数呢?让我们继续查找,N小时后发现新大陆!原来是[email=IsQQServiceEnable@@YAHI@Z]IsQQServiceEnable@@YAHI@Z[/email],这是一个unsigned int入口的函数,估计应该是服务功能号,根据此函数判断当前登录QQ用户的可用服务,于是Hook了,不管它的反应,一律返回EAX=1,再进行测试!呵呵,不出所料,成功了。
本文所介绍的思路和方法不失为一条可行性较强的实现QQ本地会员的方法,其最终的目的就是实现QQ2007II涂鸦代码的这一重要功能,对QQ聊友来说,这又是一条好功能哟。
转截请注明:文章来自 pc捍卫者 http://www.pchwz.com
本站发布此文为传递更多信息之目的,不表明pc捍卫者赞同其观点