设为首页  加入收藏  联系我们 繁體中文  

黑客软件:

  漏洞扫描 | 木马间谍 | 加密解密 | 远程控制 | 破坏攻击 | 杀毒软件 | 防火墙类 | OICQ专区 | 黑客必备 | 常用工具 | 网吧攻击
文章中心:   最新资讯 | 黑客技术 | 电脑基础 | 菜鸟文摘 | 网络安全 | 网络技巧 | QQ技巧 | OQ空间代码 | 免费资源 | 编程世界 | 建站技术
素材源码:   论坛相关 | ASP源码 | CGI 源码 | NET 源码 | PHP 源码 | 酷站素材 | 字体素材 | 图片素材 | 友情发布 | 网页模版 | 建站软件
教程动画:   黑客教程 | 黑客编程 | 网站入侵 | 菜鸟教程 | 入侵教程 | 破解教程 | 电子书籍 | 网页制作 | 高级会员 | 综合教程 | 本站原创


   

  您当前的位置:中华隐士黑客联盟 -> 编程世界 -> 编程交流 -> 文章内容 [站内搜索]  

 
用Visual C++设计QQ群管理工具
作者:不详  来源:转载  发布时间:2006-12-8 18:04:39  发布人:heigeheapao
一、问题的提出
  偶是两个QQ群的管理员,平常都是在群里跟其它人交流.当然啦,因为偶是管理员,就要承担起管理员的责任.在实际中,会碰到两个问题:
  1、我的两个群都很热,有很多人加入,这样,不用很快,群里的人就达到了上限200人了,就不能再让新的人加入.
  2、平常有些人加入只是为了发广告,整天在这里发一些与群的主题不相关的内容.或者是有的人的QQ中毒了,老是不时发一些有病毒的链接.
  对于这两个问题,我是这么的解决的.
  1、当人数达到上限时,我就让群里的人都在群的名字前面加上一些特别的符号,比如:@%#%&^*,总之就是一些一般人不会用在自己群的名字的符号吧,以这些符号作为标志,识别哪些人是长期没有在群里发言的人.把这个改名的要求发在群的公告里,对于那些长期没有上线的人,当然看不到群的公告,也就不会改群的名片了.我以这些符号作为标志,清除那些长期不上线的人,留些空间,让新人能加进来.
  2、对于那些乱发信息的人,当然就是立即T出群里啦.
  这两种的做法都是把人给T出群里,但是在实际操作中却很麻烦了. 对于第一种情况,有些人把那个特别的符号放在群名字中的某个地方,比如,要求把@加在名字前面,有个名字叫天使,本来按照要求,改名后就变为@天使,但这个人却很有个性,他把名字改为天@使,对于这些人,当然可以不管三七二十一,一律当成是没有改名,把他T出群外啦.但是考虑到这个人还是有看到公告的,还是让他留下来吧,但这样就苦了我这个当管理员的啦,在200个人里面,一个个的看哪个人的名字不符合公告的要求.人这么多,把我都看到眼花聊乱的了.既要把人T走,又不好T错了.做这样的事,也真是费功夫的. 对于第二种情况,也是一样的,因为聊天信息的那个窗口里,只能看到这个人的名字和QQ号,为了把这个人T了,还得在群设置里,一个个人的去对,找那个QQ号,实在是痛苦,都是数字,要很细心一个个的核对,一不小心就把这个号给漏了过去,又得重新找一遍了,有好几次,我都是找了三次以上才把那个QQ号才找出来.为此,我想做一个工具,只要输入QQ号,就可以把人T走了.最初,我是想抓取QQ把群里的人T走时的数据包来分析一下.知道了这个数据包消息的格式后,我就可以仿造一个消息,直接的向QQ服务器发过去,就可以把人给T了.我用工具把T人时的数据包抓取一下,全部都是乱码的.因为QQ的消息格式并没有公开,把以分析起来真的是头痛了,都无从下手了,只好把这个想法放弃了.我又想了一下,既然我不能发这样的数据包,那就直接让QQ自己发这个包吧.为了要让QQ把T人的包给发出去,就得从QQ自己的界面入手,输入QQ号后,能在群设置里直接的定位到要T的QQ号,这样就不用人工的去找这个QQ号,省却了去找这个QQ号的痛苦了.
  二、问题的分析
  我在实现时使用的是TM2006新春版,在群聊天的窗口里点工具务栏上的"群设置",弹出了"群设置"窗口,在这个窗口里,选择"成员列表"这一项,右边有一个list,这个list就包含有所有的成员了,当选中了某个人后,就可把它T了.

图一 群设置窗口
  现在的问题是要先把想T的人找出来.怎么样在list中把想T的人给找出来呢,我的想法是枚举这个list里所有人的QQ号,然后跟想要T的QQ号作比较,如果有相同的,就把list里的这一项选中,然后我们就可以进一步的操作了.那现在就可以把问题转化为,枚举list,获得list里的项的信息.我用spy++查看了一下那个"群设置"窗口,如图所示:

图二 用spy++查看的窗口关系
  最顶层的就是那个"群设置"窗口了,那个显示成员的list原来是一个syslistview32类型的控件,包含在一个类型为"#32770"的dialog中,我们只要顺着最顶层的窗口中,一层层的窗口找下去就可以得到我个想要的那个list窗口的名柄了,呵呵,之后,就可以向这个list发出消息,让它干活了.想到这,偶心时狂喜了一阵子.但是在实现过程中却是不是那么的顺利的.在顶层窗口中找那个list的句柄,并不是什么困难的事.把桌面上的把有窗口都枚举一遍,就要以找到窗口名为”群设置”的窗口了.


QUOTE:
Enum
Windows
(Enum
Windows
Proc,0);//枚举所有的窗口
BOOL CALLBACK Enum
Windows
Proc(HWND hwnd, LPARAM lParam)
{
 TCHAR buff[1000];
 int buffsize(100),nPosition(-1);
 HWND hQQWnd=NULL;
 ::GetWindowText(hwnd,buff,buffsize);
 if (strlen(buff)
找到了包含有syslistview的窗口后,就继续找syslistview了,然后可以向它发送命令消息了.这是整个程序的关键部分,先把代码给出来,我再进行解释.
#define CLASS_SIZE 4096
BOOL CALLBACK DeleWndProc(HWND hwnd, LPARAM lParam)
{
 LPTSTR lptstr;
 HGLOBAL hglb=NULL;
 char className[CLASS_SIZE];
 if (GetClassName(hwnd,className,CLASS_SIZE)==0)
  return TRUE;
 CString str(className);
 char sz[254] ="\0";
 if (_T("SysListView32") == str)
 {
  int iItem=0;
  int iFoundFlag = 0;//if find the qq number, iFoundFlag = 1;else 0;
  LVITEM lvitem,lvitem1, *plvitem,*plvitem1;
  DWORD PID;
  HANDLE hProcess;
  char ItemBuf[512],*pItem;
  GetWindowThreadProcessId(hwnd, &PID);
  hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
 if (!hProcess)
 {
  MessageBox(NULL,"获取进程句柄操作失败!","错误!",NULL);
 }
 else
 {
  plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
  plvitem1=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
  pItem=(char*)VirtualAllocEx(hProcess, NULL, 5120, MEM_COMMIT, PAGE_READWRITE);
  if (!plvitem)
  {
   MessageBox(NULL,"无法分配内存!","错误!",NULL);
  }
  else
  {
   int nItemCount = ::SendMessage(hwnd, LVM_GETITEMCOUNT, 0 ,0);
   lvitem.mask=LVIF_TEXT;
   lvitem.cchTextMax=512;
   lvitem.iSubItem=1; //ProcessName
   lvitem.pszText=pItem;
   WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
   lvitem1.state=LVIS_SELECTED;
   lvitem1.stateMask=LVIS_SELECTED;
   WriteProcessMemory(hProcess, plvitem1, &lvitem1, sizeof(LVITEM), NULL);
   for(; iItem<NITEMCOUNT; p iItem++)
   {
    SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
    ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
    CString strItem(ItemBuf);
    //strQQNum就是要找的QQ号码了
    if(strQQNum == strItem)
    {
     SendMessage(hwnd, LVM_SETITEMSTATE, (WPARAM)iItem, (LPARAM)plvitem1);
     iFoundFlag = 1;
     break;
    }
   }
   if(0 == iFoundFlag)
   {
    CString str;
    str = "没有找到QQ号:\n";
    str += strQQNum;
    MessageBox(NULL, str, "提醒", NULL);
   }
  }
 }
 CloseHandle(hProcess);
 VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
 VirtualFreeEx(hProcess, plvitem1,0, MEM_RELEASE);
 VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
}
return TRUE;
}
  DeleWndProc函数主要是把枚举syslistview32的项,查找出我们想要找的QQ号,并选中. 最初时我是尝试用以下的代码去得到list的item的内容的.
TCHAR szText[100];
LV_ITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = nIndex;
lvi.iSubItem = 0;
lvi.pszText = szText;
lvi.cchTextMax = 100;
ListView_GetItem(hwndLV, &lvi);





  但却会报错误,存取错误,也就是说内存方面的问题了.问题定位到了ListView_GetItem(hwndLV, &lvi);这一句了.后来我查找了很多资料才知道为什么会有错误.因为我的程序与TM的程序是分别属于不同的Progress,我在自己的程序的进程中申请了lvi的内存空间,却希望把TM进程往这个内存空间去写入数据,当然是会有错误啦.
Windows
用到了虚存这个概念,它让每个程序都觉得自己占有2G的内存,每个程序都把自己用到的数据放在这2G的内存中去运行.每个程序间的内存空间是互不相干的,这样,如果某个程序出现了问题,也不会影响到其它程序的运行了.ListView_GetItem要往TM的程序里写数据,当然这样的数据只能保存在TM这个程序的内存空间里了.我们可以用VirtualAllocEx这个函数在TM这个程序运行的内存片中申请内存空间,这样ListView_GetItem就可以向这个新申请的空间中写入数据了.然后,我们再用ReadProcessMemory函数把新申请的空间中的数据读到自己程序进程里的缓冲区中去,采用了一个曲折的办法,实现了不同进程的数据交换.最后当然要把申请的空间用VirtualFreeEx释放,要不就会有内存泄漏了.
  三、问题的解决
  至此,再回头看看文中开头提到的两个问题. 1查找到有特殊标志的QQ号的名字,只要修改DeleWndProc中的匹配QQ号的语句就行了.这个纯粹是一个字符串的匹配了. 2查找指写的的QQ号. DeleWndProc已经是查找指定的QQ号了.示例程序给出的就是这种情况. 当已经找到指定的项时,就可以向那个删除成员Button发出一个BM_Click的消息了,呵呵,人就给T了.这个也不难实现,也照样的找到这个按钮的HWND,用SendMessage就可以把消息发送过去了.至此就解决了开头提出的两个问题了. 在查找群设置的窗口时,也可以用FindWindow和FindWindowEx来得到syslistview32的句柄.
  四、后续工作
  我在把程序也给另一个管理员用的时候,他给我提出要实现以下的功能: 输入被T的QQ号,软件自动搜索自己是管理员的群,软件能在自己是管理员的群中搜索到此QQ号,把这个人在每个群里都T走. 呵呵,我的想法模拟人的操作过程,把TM的联系人面板打开,

图三 TM的联系人面板
  逐个项展开,如果这个项是群就向这个项发出双击消息,让它出现群聊天窗口,再向群聊天窗口中的群设置发双击消息,

图四 聊天窗口工具栏上的群设置
  这样就会出现群设置窗口了,就把问题归结到原来已经解决了的问题了.但我发现那个面板的类是Tencent_UserBar_Class_Ver1.0,如图三所示.不知是从什么派生出的,从而就不知道要发出些什么消息了.还请高人指教.
  五、结束语
  从vckbase学到了很多东西,很感谢大家的共同分享.自己的水平还很菜,但还是把自己碰到的问题写出来了,一方面可以给像我同样的菜鸟吸取经验教训,再碰到同样的问题时,能有一些参考资料.另一方面,是让各位高人指点一下我的不足. 欢迎用下面的联系方式与我继续讨论。

[] [返回上一页] [打 印] [收 藏]
  [相关文章评论]    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
 

  浅谈用VB6.0编写“特..
编程用VC++修改注册..
用VB编程监控CPU的资..
使用VB制作一个摇奖..
用vb6的ActiveX控件..
用VB6.0设计简易赛车..
如何用VB获得机器的..
用VB实现一个简单的..
如何用VB程序来播放..
用VB编写标准CGI程序..


 
中华隐士黑客联盟
免费在线看的电影网站(一)
本站超级酷的Flash (不看会后悔的..
最新QQ空间4.0全屏版效果图!!
免费获得Q币的最新方法
不用木马,轻松万能偷盗QQ号码
黑客快速入门(强烈推荐)
18岁少女欲6000元卖处女身 救患血..
揭秘远程破解盗窃QQ密码的各种方..
免费二级域名申请
 
记一次巧妙的hacking 12-10
通用网址介绍 12-10
史上最简单的Windows密码解救无法.. 12-10
小心防范,网话病毒:病毒搜查记.. 12-10
黑客攻防之PPPoE验证以及对其的利.. 12-10
phpArticle2.06两个本地包含文件.. 12-10
关于一写MD5在线破解的网站 12-10
面对一句话马无写权限 12-10
黑客之门的魅力:感染与加载 12-10
汇编"免杀"基础知识 12-10
 
关于本站 网站帮助 广告合作 下载声明 友情连接 网站地图 访客留言 论坛登录
〖中华隐士黑客联盟〗,Copyright © 2006-2010 WwW.Hack86.Com 闽ICP备:06023304号
站长:小质 QQ:771760,软件发布MAIL:Hack086@21cn.com