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

本文详细分析了编写QQ显IP外挂插件的原理,包括获取IP信息的方法,涉及到QQ内部函数调用、参数获取,尤其是struct IQQCore *和Uin的确定。作者通过反汇编和调试,解释了如何通过API Hook技术拦截函数,获取IQQCore *,并介绍了插件编写的基本流程,包括创建DLL文件并注入到QQ进程中。
  鉴于目前网上关于这方面的文章少之又少,一般能找到的应该就这下面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   

结合易语言彗星HTTP应用模块,读取网页源码取本机ip和地理位置。.版本 2 .程序集 窗口程序集1 .子程序 _按钮2_被单击 .局部变量 address, 文本型 .局部变量 ip, 文本型 ip = 彗星HTTP读文本 (“http://ip.3322.net”)  ' 这里访问这个地址就会得到一个ip,之所以用这个网站是因为访问他只会得到一个ip地址,其它任何数据都没有,简单。 编辑框1.内容 = ip  ' 把ip地址示出来 address = 彗星HTTP读文本 (“http://www.ip138.com/ips138.asp?ip=” + ip)  ' 这里用到ip138这个网站,把发送ip地址到这个网站会查到地理位置 编辑框3.内容 = 彗星URL解码 (到文本 (address))  ' 把返回的一大串数据示出来 编辑框2.内容 = 取文本中间内容 (彗星URL解码 (到文本 (address)), “本站主数据:”, “</li><li>”, )  ' 把一大串数据中的地理位置给提取出来 ' 下面是借用别人的一个子程序,取文本中间内容,这个比系统自带的更好用,好东西就要拿来用嘛 .子程序 取文本中间内容, 文本型 .参数 需取文本, 文本型 .参数 左边内容, 文本型 .参数 右边内容, 文本型 .参数 成功与否, 逻辑型, 参考 可空 .局部变量 长度, 整数型 .局部变量 左边位置, 整数型 .局部变量 左边长度, 整数型 .局部变量 右边位置, 整数型 .局部变量 右边长度, 整数型 长度 = 取文本长度 (需取文本) 左边位置 = 寻找文本 (需取文本, 左边内容, 0, 假) 左边长度 = 取文本长度 (左边内容) ' 三叶资源网(www.sanye.cx) .如果真 (左边位置 = -1)     成功与否 = 假     返回 (“未找到左边内容”) .如果真结束 右边位置 = 寻找文本 (需取文本, 右边内容, 0, 假) 右边长度 = 取文本长度 (右边内容) .如果真 (右边位置 = -1)     ' 三叶资源网(www.sanye.cx)     成功与否 = 假     返回 (“未找到右边内容”) .如果真结束 成功与否 = 真 返回 (取文本中间 (需取文本, 左边位置 + 左边长度, 长度 - (左边位置 + 左边长度) - (长度 - 右边位置)))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值