CSK.Blog--个人原创Weblog

编写QQ外挂插件的提示[1]

前一段时间研究了下QQ目前各种外挂的机理,包括著名的coralQQ。也大致写了个一样的东西,不过马上要考试了,所以还是等暑假完善吧……反正8月份就要来学校。

鉴于目前网上关于这方面的文章少之又少,一般能找到的应该就这下面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 ptr ds:[eax]
0056D9AD     68 C8BA5900        push CoralQQ.0059BAC8   ; ASCII QQUSER_DYNAMIC_DATA
0056D9B2     50                            push eax
0056D9B3     8B41 54                 mov eax,dword ptr ds:[ecx+54]
0056D9B6     FFD0                    call eax
0056D9B8     8B4424 14             mov eax,dword ptr ss:[esp+14]
0056D9BC     3BC3                     cmp eax,ebx
0056D9BE     0F84 F9000000       je CoralQQ.0056DABD
0056D9C4     8B08                       mov ecx,dword ptr ds:[eax]
0056D9C6     8D5424 1C             lea edx,dword ptr ss:[esp+1C]
0056D9CA     52                       push edx
0056D9CB     68 ACA15900          push CoralQQ.0059A1AC       ; ASCII wProcotol
0056D9D0     50                             push eax
0056D9D1     8B41 30                  mov eax,dword ptr ds:[ecx+30]
0056D9D4     FFD0                      call eax
0056D9D6     8B4424 14              mov eax,dword ptr ss:[esp+14]
0056D9DA     8B08                      mov ecx,dword ptr ds:[eax]
0056D9DC     8D5424 10            lea edx,dword ptr ss:[esp+10]
0056D9E0     52                          push edx
0056D9E1     68 94A15900         push CoralQQ.0059A194    ; ASCII dwRecentIP
0056D9E6     50                         push eax
0056D9E7     8B41 34               mov eax,dword ptr ds:[ecx+34]
0056D9EA     FFD0                   call eax

以上代码正式coralQQ 4.5版获取IP信息的片断。我们只需要关注上面的0056D982和0056D9B6地址的2个调用函数。

为什么这样说了,先看下面获取dwRecentIP数据的代码,它和上面提到的那个成员函数是属于一个类的(这里没提供出完整代码,你可以自己验证下:-P)。那么这里的this指针从哪里来呢?

0056D9DA     8B08                      mov ecx,dword ptr ds:[eax]

0056D9D6     8B4424 14              mov eax,dword ptr ss:[esp+14]

按照thiscall规范,ecx就保存了this指针,上面代码说明ecx是来自[esp+14]的,我们在往上看:

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 ptr ds:[eax]
0056D9AD     68 C8BA5900        push CoralQQ.0059BAC8   ; ASCII QQUSER_DYNAMIC_DATA
0056D9B2     50                            push eax
0056D9B3     8B41 54                 mov eax,dword ptr ds:[ecx+54]
0056D9B6     FFD0                    call eax

看到么0056D99C lea edx,dword ptr ss:[esp+14]!!

也就是说this指针和ptr2时由这个函数获得的,我们暂时以它的一个参数命名:QQUSER_DYNAMIC_DATA。

但不幸的是,这个函数同样也是thiscall调用规范的,也就说也是需要得到this指针……不过不慌:

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]
0056D9AB     8B08                           mov ecx,dword ptr ds:[eax]


注意上面2段代码,QQUSER_DYNAMIC_DATA函数的this指针最终是[esp+14],而esp+14的数据是

0056D97F     51                             push ecx

这段代码压入的。所幸的是GetFriendQQData是个导出函数(位于BasicCtrDll.dll),我们看看他的申明:

int GetFriendQQData(struct IQQCore *,unsigned long,struct IQQData * *);

上面这个push ecx实际上是压入了参数struct IQQData * *。

所以现在的只要获得struct IQQCore *,和第二个神秘参数的含义就能实现显示IP的功能了。

---------------

好了,快熄灯了,也累了,今天就到这里。

下回将说明IQQCore 的具体含义和如何去获得,以及第二的神秘参数的作用,以及IQQData 的含义。同时具体介绍如何编写一个具有实际意义的外挂dll插件。

CSK版权所有,如需转载请告知作者

www.csksoft.net

编了个QQ显IP插件

由于目前只是做好了雏形,所以暂时不写具体的原理和实现方法。

现在有名的QQ显IP插件就要数CoralQQ了。最近在做我这个版本的时候也看了下他的实现构造,虽然有些方面我不认同。如采用MFC构架,显示ip的机制是用钩子拦截。这样我觉得比较占资源也占CPU~但反汇编看了整整2天后我不由得对它产生无比敬佩……

我暂时把这个插件叫做OpenPugin。因为以后打算做成支持二重插件甚至开源的。

不得不承认本次开发受到原先的木子版QQ源码和CoralQQ的一些方法的影响。不过相信我是结合了他们的优点,比如获取IP的方法和CoralQQ一样,有效又安全,而插件和QQ进程挂钩的手段是模仿木子版的,修改了内部函数跳转,当然会很智能,适应不同版本的差异。

下面是截图:

 

目前这还是个雏形,只是说明方案时可行的,今后打算把功能完善了在整合交大的一些服务,出个交大版QQ,呵呵~敬请期待……

哎,写这个真是折磨人,发现自己汇编还要去学学……

忙好了,那么接下来?

PRP第一期、法学院网站、科创都结束了。接下来还要管理些协会的事情。

自从我成为计算机协会会长那一天起我就觉得目前只要能潜心做好活动就可以了,似乎并不难,但现在我错了,而且连自己都变得浮躁,把活动才是关键这件事都忘了

最近很多人都觉得我有些浮躁了,包括我父母,我不知道是不是浮躁还会传染。但的确这个学期自己并没有潜下心做很多事,PRP、科创也好,都是几天时间的奋战+以往的经验。室友戏称我“经验丰富”可能不假。但最近每听到这样的话我就觉得有另一种意思:我现在也就只有以往的经验了。

该是时候安心了,协会需要潜心的发展、我需要潜心的学习、任何事都要我潜心的思考后再作决定。

所以开始低落,可能也不是坏事,该是摆脱浮躁的时候了。

硬件合成器设计并制作完毕

最近不常更新blog主要是因为要处理协会的事,还有刚刚完成的电院科技创新,也就是这个合成器了……
现在模电也学得差不多了,感觉自己还是蛮喜欢电子设计的,于是5.6号去买了些比较好的设备,今后有时间就做些东西出来,所以这个blog也新开了电子设计板块。

上次提到我们科创小组要做一个硬件合成器,不过后来发现如果完全用波形来合成钢琴的音色实在复杂。而且白噪声(White Noise)加滤波器的方案不可行。加上电院科创突然说要在这周一评审,天啊,于是就用了3天时间作了下面这个音色和口琴类似的合成器。

点击图片可以看到原图

由于时间有限,所以电路也不算复杂,基本思路是由555定时器产生2khz左右的方波,然后通过包络器,再使用带有滤波器的LM386放大产生最后的音色。

在示波器上的最终波形这里没法给出了,大致类似一系列规则的脉冲信号。

下面是该合成器的主要原理图:

 用555时基合成器产生波形就不必说了,懂电子的朋友应该都知道的,主要是包络器的问题。我当时在google上搜索发现这方面资料网上国内几乎为0。而且自己模拟电路的知识还有限,以前尝试制作的用电容调节的可变增益放大器来产生包络的尝试失败。

一次偶然机会看到了通过改变CD4069的VDD电压,来控制其非门高电平的办法。只要在4069的VDD上用电容供电,在电容放电时,VDD的电压会呈指数下降,这样通过非门的信号幅值也会呈指数下降。而在4069的VDD接上电阻,可以起到电容充电时VDD电压指数上升。

这样,包罗器的起音和余音部分就正好解决了,而且基本上采用的是数字电路,方便啊~

这个合成器可以发出15个音节的波形,频率范围是220hz-2.5khz。差不多覆盖了2个八度的音调。通过调整板上15个电位器可以调整他们的音节。

最终为了让89s52芯片来控制他弹奏一首乐曲,15个音节的控制采用了4066模拟开关,而这部分又是最恶心的:

点击图片可以看到原图

 我记得Somnia 说过“拥有一台模拟合成器是每个DJ的梦想”,呵呵,这个也算是一个模拟合成器了吧……电院科创结束

过去了……迎接新的开始

到今天为止,我终于可以说已经没有特别重的负担了。PRP和法学院网站建设我心中的两大包袱终于消除了。 虽然接下拉仍然会很忙,但至少都是为自己拼命的,所以我不会觉得有什么。 我希望从此生活能简单些,每天读书、做作业、研究点东西、陪gf,呵呵,天堂般的生活啊~ 好了,不能就这样放松了,下一个任务是科创,设计电路去了。 我的Blog,终于可以复活了……
分页:[«]1[»]

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)