QQ号申请工具编写原理
QQ号申请工具 编写原理
作 者: ddsoft
大家都知道现在有很多申请QQ号的软件,只要填写软件上的验证码,就可以帮你自动申请一个QQ,并保存下来。 它简化了 注册的流程。
通常这类软件有两种,一个编程时用了IE的控件,直接向这些表单填写数据,另一种就是今天要讲的,用封包的方法来实现自动申请QQ。
想一下,我们面临的难题有:
1.验证码的gif图片在哪,如何让程序获取图片,并显示出来。
2.http请求中包的分析和构建。
当然第二个是重点。
先完成第一项任务。
我们打开 www.reg.qq.com ,会有这个http请求
2.gif下载此附件需要消耗2Kx,下载中会自动扣除。
用文字就是:
GET: http://captcha.qq.com/getimage?aid=1007901&0.3621022082160978
Accept: */*
Referer: http://reg.qq.com/
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; http://www.zzzyk.com) ; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0E; .NET4.0C)
Host: captcha.qq.com
Connection: Keep-Alive
---------------------------------------------
http://captcha.qq.com/getimage?aid=1007901&0.3621022082160978
看这个url,有两个数据,是否是定值呢。
再重新登陆 reg.qq.com,会发现 aid=后面的数字没有变,但第二个数据变化了。
这个很容易理解,因为每次登陆会有不同的验证码嘛。
但第一个数据,仔细看看之前发的包,就会知道 1007901,是GetDay产生的,过一天可能就加1了。呵呵!但今天无论怎么换验证码,都不会改变的。
OK。 gif图片已经获取。
代码:
char szAccept[] = "Accept: */gif";
char szReferer[] = "Referer: http://reg.qq.com/\r\n\r\n";
CString strBuffer = _T("");
CString strRecv = _T("");
HINTERNET hSession;
HINTERNET hConnect;
HINTERNET hRequest;
BOOL bReturn = FALSE;
CString str=_T("/getimage?aid=1007901&0.0022421072022002497");
// 之前使用Socket,现在使用Wininet相关API建立链接
hSession = InternetOpen("InetAll",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
hConnect = InternetConnect(hSession,"captcha.qq.com",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1);
hRequest = HttpOpenRequest(hConnect,"GET",str,NULL,"http://reg.qq.com/",(PCSTR*)szAccept,INTERNET_FLAG_RELOAD,1);
// 提交数据表单
bReturn = HttpSendRequest(hRequest,NULL,-1,NULL,0);
if(!bReturn)
{
MessageBox("发送Http请求失败!","提示",MB_ICONERROR | MB_OK);
return FALSE;
}
//之后就是生成图片了。
hFile.Open("temp.dat",CFile::modeWrite | CFile::modeCreate,NULL);
InternetReadFile(hRequest,szRecvBuf,1024,&dwNumberOfBytesRead);
}
1.2 怎么在VC的对话框窗口上显示出这个图片呢。
在此结出了一种借助于COM接口的OLE方法来实现上述功能
要使用IPicture 的COM接口,其主要的接口是IPicture和IPictureDisp,后者是由IDispatch接口派生以便通过自动化对图像的属性进行访问。图像对象也支持外部接口IPropertyNotifySink,以便用户能在图像属性发生改变时作出决定。图像对象也支持IPersistStream接口,所以它能从一个IStream接口的实例对象保存、装载自己,而IStream接口也支持对流对象的数据读写。
我们可以用函数OleLoadPicture从包含有图像数据的流中装载图像。该函数简化了基于流的图像对象的创建过程,可以创建一个新的图像对象并且用流中的内容对它进行初始化。其函数原型为:
STDAPI OleLoadPicture( IStream * pStream, //指向包含有图像数据的流的指针
LONG lSize, //从流中读取的字节数
BOOL fRunmode, //图像属性对应的初值
REFIID riid, //涉及到的接口标识,描述要返回的接口指针的类型
VOID ppvObj // 在rrid中用到的接口指针变量的地址) ;
先将图片数据放入内存
代码:
bool CQQ号申请工具Dlg::LoadPic(CString m_path)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open(m_path,CFile::modeRead)&&file.GetStatus(m_path,fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.Read(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
return TRUE;
}
补充:软件开发 , C语言 ,