程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> QQ號申請工具編寫原理

QQ號申請工具編寫原理

編輯:關於C語言

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.BkJia.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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved