编写QQ显IP外挂插件及原理分析

  鉴于目前网上关于这方面的文章少之又少,一般能找到的应该就这下面3篇(由于可能涉及版权问题,我链接就不给出了),自己在开发中也走了不少弯路,所以特此把我的开发过程写了下来,给各位做个参考把

引用:
a.木子版显IPQQ的制作教程

b.关于QQ外挂DLL的加载原理的分析

c.明日帝国(sunwangme)写的我是这样来做破解qq,做QQ外挂的系列



在开始我的分析前我简要对上面这些资料作下评价,首先我觉得如果你也想写个类似的外挂插件,他们的文章你是必看的,而且特别是你想真的写出什么有用的东西的话,明日帝国得文章一定要看,而且必须看懂(呵呵,你去看看就明白我的意思)。对于木子版的教程应该说是最早“公开”的资料了,很多人都是看了这个教程开始写自己的外挂的。但是他通过直接修改QQ来做显IP补丁,可能引起的法律问题不说(如果你只是自娱自乐的话),他不能适应不同版本的QQ,而且用户也不太能接受直接的修改,而且教程已经不能直接用于目前版本的QQ了。

第二个教程是做外挂DLL插件必看的,但是他丝毫没涉及显示IP的问题,只是简单介绍了DLL注入的问题,并对win9x环境下手动加载dll到进程空间作了分析。但是目前win9x已逐渐退出舞台,所以一般只要使用CreateRemoteThread即可。

好了,现在就开始我的分析过程。

第一部分:

1.1 主流的外挂插件如何获取IP和其他信息的?

也许你会认为他拦截了底层的Socket通讯?当然不至于,但这样肯定是最有效的办法。

让我们换个思路:如果你现在需要和一个QQ好友传输文件或者进行语音聊天或者发送了图片或自定义表情。那么QQ必须知道对方的IP地址和端口信息,这样才能把数据传给对方。

所以,很有可能QQ内部已经实现了获取IP地址和其他信息的相关函数了。的确如此。这也是木子版QQ教程里面提到的办法,调用QQ内部的函数。

下面是截至QQ组件之一的CQQApplication.dll中的汇编代码:(建议先浏览木子版QQ的教程)

027832C7      8B45 F0      mov eax,dword ptr ss:[ebp-10]
027832CA      53              push   ebx
027832CB      68 38558302      push CQQAppli.02835538     ; ASCII dwIP
027832D0      50                      push eax
027832D1      8B08                  mov ecx,dword ptr ds:[eax]
027832D3      FF51 18             call dword ptr ds:[ecx+18]
027832D6      8B45 F0            mov eax,dword ptr ss:[ebp-10]
027832D9      53                    push ebx
027832DA      68 40558302     push CQQAppli.02835540      ; ASCII wPort
027832DF      50                     push eax
027832E0      8B08                 mov ecx,dword ptr ds:[eax]
027832E2      FF51 14             call dword ptr ds:[ecx+14]
CQQApplication.dll通俗来说就是负责显示和实现QQ聊天窗口的模块。就是那些和xxx聊天中的窗口,所以这就是为什么要在其中寻找这样的代码的依据。

从上面的汇编来看,显然是调用了2个thiscall规范的函数,也就是我们所说的C++类成员函数。

2个成员函数的的大致形式是this->Func(void *ptr1,char *cmd,DWORD *ptr2);其中cmd就是上面dwIP、wPort这些字符串,而ptr2也很容易知道是函数返回值得存储指针。现在关键是要获取this指针,也就是ecx寄存器的数据和ptr1这个神秘指针的数据。

如果你有兴趣反汇编CoralQQ中相关的代码,也会发现与上面类似的调用部分。

这里暂时不深入这些函数的作用和那个cmd指针的细节,我们先来研究如何获取this指针和ptr2吧。

注意

027832DF      50                     push eax
027832E0      8B08                 mov ecx,dword ptr ds:[eax]

这2段代码,也就是说ptr2获取了,那么this指针也可以得到。所以现在一切的关键就是找出ptr2的来历。这样我们就能很轻松的实现显示ip了。

2.2 神秘的ptr2指针

为了能更快的说明问题,这里就不厚道的引用CoralQQ.dll的汇编了~

0056D97F      51                              push ecx
0056D980      52                              push edx
0056D981      50                              push eax
0056D982      FF15 38AB5A00         call dword ptr ds:[5AAB38]   ; BasicCtr.GetFriendQQData
0056D988      8B4424 14                  mov eax,dword ptr ss:[esp+14]
0056D98C      83C4 0C                    add esp,0C
0056D98F      3BC3                        cmp eax,ebx
0056D991      0F84 03020000        je CoralQQ.0056DB9A
0056D997      57                              push edi
0056D998      895C24 14                 mov dword ptr ss:[esp+14],ebx
0056D99C      8D5424 14               lea edx,dword ptr ss:[esp+14]
0056D9A0      52                              push edx
0056D9A1      68 50BB5900            push CoralQQ.0059BB50
0056D9A6      C64424 30 01            mov byte ptr ss:[esp+30],1
0056D9AB      8B08                            mov ecx,dword pt

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值