关于QQ注册如何突破IP限制的说明附全部源代码下载

上一篇文章我说明了如何破解QQ批量注册的问题,我看有朋友说过,通过HTTPWATCH看到腾讯提交的参数,那个我知道,不过那个朋友你可以测试一下,腾讯的直接提交是不能用的,必须要中间经历一系列的算法,否则会提示“请不要重复申请”的错误提示

 

有朋友在上一篇文章评论将说关于IP限制的问题,我讲一下,首先代理IP是没问题的,同时采取PPPOE拨号的也没问题,代理IP直接用PNHTTP都可以实现,PPPOE可以采取一些相应的组件,譬如说CnPack里边的拨号组件等,

 

1   with Http.ProxyParams do begin
2     ProxyServer:= ''//代理地址
3     ProxyPort:= 80//端口
4     ProxyUsername:= ''//代理登录用户名
5     ProxyPassword:= ''//代理登录密码
6   end;
7 

 

 

我这边自己测试的,还有一种方案,这种方案也可以破解腾讯的IP限制,但是不稳定,就是一会可以,一会不可以,但是总归算下来,比不用的强,原理是更改提交给腾讯服务器的主机头,然后让腾讯误以为是通过代理访问的页面(之前有朋友说代理访问提示没权限,那个有可能就是因为你的代理服务器给你额外增加主机头信息了)。

 

伪造IP
1   Randomize;
2   StrIP:= IntToStr(Random(255)+ 1)+'.'+ IntToStr(Random(255)+ 1)+'.'+ IntToStr(Random(255)+ 1)+'.'+ IntToStr(Random(255)+ 1);
3   Http.Request.CustomHeaders.Add('X-Forwarded-For:'+ StrIP);
4 

 

 

这样去提交数据的时候,就会额外给他增加一条头部信息,让他误以为咱们是通过代理IP访问的,但是这个伪造,还是我之前所说的,不稳定,有时候好用,有时候不好用

 

附带所有的代码

全部代码
  1 unit MainFrm;
  2 
  3 interface
  4 
  5 uses
  6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7   Dialogs, StdCtrls, Mask, RzEdit, ExtCtrls,PN_ThreadPool,PNHttp,PNCE_GlbFun,
  8   PerlRegEx;
  9 
 10 type
 11   TMainForm = class(TForm)
 12     grp1: TGroupBox;
 13     bvl1: TBevel;
 14     Input1: TRzEdit;
 15     grp2: TGroupBox;
 16     bvl2: TBevel;
 17     Input2: TRzEdit;
 18     grp3: TGroupBox;
 19     bvl3: TBevel;
 20     Input3: TRzEdit;
 21     img1: TImage;
 22     img2: TImage;
 23     img3: TImage;
 24     grp4: TGroupBox;
 25     bvl4: TBevel;
 26     img4: TImage;
 27     Input4: TRzEdit;
 28     grp5: TGroupBox;
 29     bvl5: TBevel;
 30     img5: TImage;
 31     Input5: TRzEdit;
 32     grp6: TGroupBox;
 33     bvl6: TBevel;
 34     img6: TImage;
 35     Input6: TRzEdit;
 36     grp7: TGroupBox;
 37     bvl7: TBevel;
 38     img7: TImage;
 39     Input7: TRzEdit;
 40     grp8: TGroupBox;
 41     bvl8: TBevel;
 42     img8: TImage;
 43     Input8: TRzEdit;
 44     grp9: TGroupBox;
 45     bvl9: TBevel;
 46     img9: TImage;
 47     Input9: TRzEdit;
 48     btn1: TButton;
 49     RegNum: TEdit;
 50     procedure FormCreate(Sender: TObject);
 51     procedure FormDestroy(Sender: TObject);
 52     procedure Input1KeyPress(Sender: TObject; var Key: Char);
 53     procedure btn1Click(Sender: TObject);
 54   private
 55     { Private declarations }
 56   public
 57     { Public declarations }
 58     procedure DownProcessRequest(Sender: TPNThreadPool;
 59       aDataObj: TPNTaskObject; aThread: TPNPoolThread);
 60   end;
 61 
 62   TCoding= record
 63     Status: integer;  //忙碌1,空闲0,等待用户输入数据2,用户已经输入,等待处理3
 64     ShowBegin: integer; //开始显示验证码的时间
 65   end;
 66 
 67   ///线程池中的线程处理类,可以派生,也可以不用派生
 68   TRegThread = class(TPNPoolThread)
 69   private
 70     MyCodeIdx: integer;
 71     bmp: TBitmap;
 72     procedure ShowImg1;
 73     procedure ShowImg;
 74   public
 75     destructor Destroy;
 76   end;
 77 
 78   TRegData= class(TPNTaskObject)
 79   private
 80     FId: String; //编号
 81   public
 82     constructor Create(const AId: string);
 83     function Duplicate(DataObj: TPNTaskObject;
 84       const Processing: Boolean): Boolean;  ///判断两个任务是否重复,此函数必须在派生类写明
 85     function Info: stringoverride;  ///输出信息,覆盖
 86   end;
 87 
 88 var
 89   MainForm: TMainForm;
 90   Codings: array[1..9of TCoding;
 91   CodingCs: TPNCriticalSection; ///申请打码资源的CS
 92 
 93   RegId: integer;
 94 
 95   StrLog: string///日志数据
 96   PoolReg: TPNThreadPool;  ///线程池
 97   csLog: TPNCriticalSection;  ///保存日志的临界区
 98 
 99 function CodingApply: integer;  //申请打码显示资源,如果申请成功,返回显示的标号,否则返回-1
100 function CodingRelease(CodeIdx: Integer): string;  //释放显示资源,返回的是打码的信息
101 function CodingWait(CodeIdx: Integer): Boolean; //将状态更改为等待
102 function CodingOK(CodeIdx: Integer): Boolean; //将状态更改为处理完毕
103 function CodingStatus(CodeIdx: Integer): integer; //获取当前状态
104 
105 implementation
106 
107 {$R *.dfm}
108 
109 function CodingApply: integer;
110 var
111   i: integer;
112 begin
113   CodingCs.Enter;
114   Result:= -1;
115   try
116     for i := 1 to 9 do begin
117       if Codings[i].Status=0 then begin
118         Result:= i;
119         Codings[i].Status:= 1;
120         Break;
121       end;
122     end;
123   finally
124     CodingCs.Leave;
125     Sleep(0);
126   end;
127 end;
128 
129 function CodingRelease(CodeIdx: Integer): string;
130 begin
131   if (CodeIdx<0or (CodeIdx>9then Exit;
132   CodingCs.Enter;
133   try
134     try
135       Result:= TEdit(MainForm.FindComponent('Input'+ IntToStr(CodeIdx))).Text;
136     except
137       Result:= '';
138     end;
139     Codings[CodeIdx].Status:= 0;
140   finally
141     CodingCs.Leave;
142     Sleep(0);
143   end;
144 end;
145 
146 function CodingWait(CodeIdx: Integer): Boolean;
147 begin
148   if (CodeIdx<0or (CodeIdx>9then Exit;
149   Result:= True;
150   CodingCs.Enter;
151   try
152     try
153       Codings[CodeIdx].Status:= 2;
154     except
155       Result:= False;
156     end;
157   finally
158     CodingCs.Leave;
159     Sleep(0);
160   end;
161 end;
162 
163 function CodingOK(CodeIdx: Integer): Boolean;
164 begin
165   if (CodeIdx<0or (CodeIdx>9then Exit;
166   Result:= True;
167   CodingCs.Enter;
168   try
169     try
170       Codings[CodeIdx].Status:= 3;
171     except
172       Result:= False;
173     end;
174   finally
175     CodingCs.Leave;
176     Sleep(0);
177   end;
178 end;
179 function CodingStatus(CodeIdx: Integer): integer;
180 begin
181   if (CodeIdx<0or (CodeIdx>9then Exit;
182   CodingCs.Enter;
183   try
184     Result:= Codings[CodeIdx].Status;
185   finally
186     CodingCs.Leave;
187     Sleep(0);
188   end;
189 end;
190 
191 constructor TRegData.Create(const AId: string);
192 begin
193   FId:= AId;
194 end;
195 
196 function TRegData.Duplicate(DataObj: TPNTaskObject;
197   const Processing: Boolean): Boolean;
198 begin
199   Result := (not Processing) and
200     (FId = TRegData(DataObj).FId);
201 end;
202 
203 function TRegData.Info: string;
204 begin
205   Result:= 'FId='+ FId+ ';';
206 end;
207 
208 
209 procedure TRegThread.ShowImg1;
210 begin
211   try
212     TImage(MainForm.FindComponent('Img'+ IntToStr(MyCodeIdx))).Picture.Assign(bmp);
213     TEdit(MainForm.FindComponent('Input'+ IntToStr(MyCodeIdx))).Text:= '';
214   except
215   end;
216   CodingWait(MyCodeIdx);
217 end;
218 procedure TRegThread.ShowImg;
219 begin
220   Synchronize(ShowImg1);
221 end;
222 destructor TRegThread.Destroy;
223 begin
224   try
225     if bmp<>nil then bmp.Free;
226   except
227   end;
228   inherited Destroy;
229 end;
230 
231 function HexToInt(const S: String): DWORD;
232 asm
233   PUSH EBX
234   PUSH ESI
235 
236   MOV ESI, EAX //字符串地址
237   MOV EDX, [EAX-4//读取字符串长度
238 
239   XOR EAX, EAX //初始化返回值
240   XOR ECX, ECX //临时变量
241 
242   TEST ESI, ESI //判断是否为空指针
243   JZ @@2
244   TEST EDX, EDX //判断字符串是否为空
245   JLE @@2
246   MOV BL, $20
247   @@0:
248   MOV CL, [ESI]
249   INC ESI
250 
251   OR CL, BL //如果有字母则被转换为小写字母
252   SUB CL, '0'
253   JB @@2 // < '0' 的字符
254   CMP CL, $09
255   JBE @@1 // '0'..'9' 的字符
256   SUB CL, 'a'-'0'-10
257   CMP CL, $0A
258   JB @@2 // < 'a' 的字符
259   CMP CL, $0F
260   JA @@2 // > 'f' 的字符
261   @@1// '0'..'9''A'..'F''a'..'f'
262   SHL EAX, 4
263   OR EAX, ECX
264   DEC EDX
265   JNZ @@0
266   JMP @@3
267   @@2:
268   XOR EAX, EAX // 非法16进制字符串
269   @@3:
270   POP ESI
271   POP EBX
272   RET
273 end;
274 
275 procedure TMainForm.DownProcessRequest(Sender: TPNThreadPool;
276   aDataObj: TPNTaskObject; aThread: TPNPoolThread);
277 var
278   Http: TPNHttp;
279   i,j,LBase,IdxA,IdxB: integer;
280   RndStr,FormParams,StrResult,StrQQ,StrCookie,StrIP: string;
281   SListA,SListB: TStringList;
282   Reg: TPerlRegEx;
283   ParamArray: array[0..14of string;
284 begin
285 //  FPNWriteLnText('日志.txt',TRegData(aDataObj).FId+'开始注册',False);
286   Http:= TPNHttp.Create(nil,True,True);
287   Randomize;
288   StrIP:= '1.193.86.'+ IntToStr(Random(255)+ 1);
289 //  StrIP:= IntToStr(Random(255)+ 1)+'.'+ IntToStr(Random(255)+ 1)+'.'+ IntToStr(Random(255)+ 1)+'.'+ IntToStr(Random(255)+ 1);
290   Http.Request.CustomHeaders.Add('X-Forwarded-For:'+ StrIP);
291   with Http.ProxyParams do begin
292     ProxyServer:= ''//代理地址
293     ProxyPort:= 80//端口
294     ProxyUsername:= ''//代理登录用户名
295     ProxyPassword:= ''//代理登录密码
296   end;
297   try
298     try
299       Http.HttpGet('http://reg.qq.com/');
300 //      FPNWriteLnText(TRegData(aDataObj).FId+'HEADER信息.txt','首页:'+ Http.HttpHeader,False);
301       TRegThread(aThread).MyCodeIdx:= CodingApply;
302       ///等待获取打码资源
303       while TRegThread(aThread).MyCodeIdx=-1 do begin
304         sleep(500);
305         if not aThread.Terminated then
306           TRegThread(aThread).MyCodeIdx:= CodingApply
307         else
308           exit;
309       end;
310       try
311         TRegThread(aThread).Bmp:= Http.HttpBmp('http://captcha.qq.com/getimage?aid=1007901&0.9408595752591837');
312   //      FPNWriteLnText(TRegData(aDataObj).FId+'HEADER信息.txt','验证码:'+ Http.HttpHeader,False);
313         TRegThread(aThread).ShowImg;
314       finally
315         if TRegThread(aThread).Bmp<>nil then
316           TRegThread(aThread).Bmp.Free;
317       end;
318       while CodingStatus(TRegThread(aThread).MyCodeIdx)=2 do begin
319         Sleep(200);
320         if aThread.Terminated then
321           Exit;
322       end;
323       RndStr:= CodingRelease(TRegThread(aThread).MyCodeIdx);
324 //      FPNWriteLnText('日志.txt',TRegData(aDataObj).FId+':RndStr='+ RndStr,False);
325       FormParams:= Http.HttpGet('http://reg.qq.com/cgi-bin/checkconn?seed0.8865932116432269');
326 //      FPNWriteLnText(TRegData(aDataObj).FId+'HEADER信息.txt','CheckConn:'+ Http.HttpHeader,False);
327 //      FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt','返回的参数集:'+ FormParams,False);
328 //      FormParams:= Copy(FormParams,33,402);
329       StrCookie:= Http.CookieMgr.CookieCollection.Cookie['PCCOOKIE','qq.com'].Value;
330 //      FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt','PCCOOKIE值为:'+ StrCookie,False);
331       StrCookie:= copy(StrCookie,length(StrCookie)-1,2);
332 //      FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt','LBASE值为:'+ StrCookie,False);
333       LBase:= HexToInt(StrCookie);
334 
335       ParamArray[0]:= 'QQ';
336       ParamArray[1]:= 'EMAIL';
337       ParamArray[2]:= 'zeze';
338       ParamArray[3]:= '0';
339       ParamArray[4]:= '1985';
340       ParamArray[5]:= '1';
341       ParamArray[6]:= '2';
342       ParamArray[7]:= '1';
343       ParamArray[8]:= '2';
344       ParamArray[9]:= 'abc111111';
345       ParamArray[10]:= 'abc111111';
346       ParamArray[11]:= '1';
347       ParamArray[12]:= '11';
348       ParamArray[13]:= '1';
349       ParamArray[14]:= RndStr;
350      try
351         SListA:= FPNSplit(Copy(FormParams,33,402),',');
352         SListB:= FPNSplit(Copy(FormParams,447,64),',');
353 //        FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt',Copy(FormParams,447,64),False);
354         FormParams:= '';
355         for i := 0 to 12 do begin
356           IdxA:= StrToInt(SListB[i]) xor LBase;
357           IdxB:= 12-i;
358           IdxA:= IdxA xor 6818;
359           IdxA:= IdxA xor 8315;
360           IdxA:= IdxA xor 5123;
361           IdxA:= IdxA xor 2252;
362           for j := 0 to 5 do
363             IdxA:= IdxA xor 0;
364           IdxA:= IdxA mod 15;
365 //          FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt','IdxA:'+ IntToStr(IdxA),False);
366 
367           FormParams:= FormParams+ Copy(SListA[IdxB],2,28)+ '='+ ParamArray[IdxA]+ '&'
368         end;
369 
370 //        FormParams:= Copy(SList[0],2,28)+ '=1&'+ Copy(SList[1],2,28)+ '=1&'+ Copy(SList[2],2,28)+ '=pop67579818&'
371 //          + Copy(SList[3],2,28)+ '=1983&'+ Copy(SList[4],2,28)+ '='+ RndStr+'&' + Copy(SList[5],2,28)+ '=1&'
372 //          + Copy(SList[6],2,28)+ '=lovezeze&'+ Copy(SList[7],2,28)+ '=pop67579818&'+ Copy(SList[8],2,28)+ '=0&'
373 //          + Copy(SList[9],2,28)+ '=1&'+ Copy(SList[10],2,28)+ '=2&'+ Copy(SList[11],2,28)+ '=11&'
374 //          + Copy(SList[12],2,28)+ '=1';
375       finally
376         SListA.Free;
377         SListB.Free;
378       end;
379       for i := 0 to Http.CookieMgr.CookieCollection.Count - 1 do
380         StrCookie:= StrCookie+ Http.CookieMgr.CookieCollection.Items[i].CookieName+ ':'
381         + Http.CookieMgr.CookieCollection.Items[i].CookieText;
382       StrResult:= Http.HttpPost('http://reg.qq.com/cgi-bin/getnum',FormParams,True);
383 //      FPNWriteLnText(TRegData(aDataObj).FId+'HEADER信息.txt','POST时候:'+ Http.HttpHeader,False);
384 //      FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt','提交COOKIE为:'+ StrCookie,False);
385 //      FPNWriteLnText(TRegData(aDataObj).FId+'数据日志.txt','提交参数为:'+ FormParams,False);
386 //      FPNWriteLnText(TRegData(aDataObj).FId+'返回数据.txt',StrResult,False);
387       Reg:= TPerlRegEx.Create(nil);
388       try
389         Reg.Subject:= StrResult;
390         Reg.RegEx:= '您获得的号码为:\<span id\=\"aq\-uin\" class\=\"number\">([\s\S]*?)\<';
391         if Reg.MatchAgain then begin
392           StrQQ:= Reg.SubExpressions[1];
393           FPNWriteLnText('注册成功的QQ.txt',StrQQ,False);
394         end else begin
395           FPNWriteLnText('注册失败线程.txt',TRegData(aDataObj).FId,False);
396         end;
397 //        FPNWriteLnText(TRegData(aDataObj).FId+'匹配结果.txt',StrResult,False);
398       finally
399         Reg.Free;
400       end;
401     except
402 
403     end;
404   finally
405     Http.Free;
406   end;
407 end;
408 
409 procedure TMainForm.btn1Click(Sender: TObject);
410 var
411   i: integer;
412 begin
413   for i := 1 to StrToInt(RegNum.Text) do begin
414     RegId:= RegId+ 1;
415     PoolReg.AddRequest(TRegData.Create(IntToStr(RegId)));
416   end;
417 end;
418 
419 procedure TMainForm.FormCreate(Sender: TObject);
420 begin
421   RegId:= 0;
422   CodingCs:= TPNCriticalSection.Create;
423   PoolReg := TPNThreadPool.Create(nil);
424   with PoolReg do begin
425     OnProcessRequest := DownProcessRequest; ///线程处理函数
426     AdjustInterval := 5 * 1000///减少线程间隔时间,5
427     MinAtLeast := False;  ///是否设置最小线程数
428     ThreadDeadTimeout := 10 * 1000///线程死亡超时时间
429     ThreadsMinCount := 10///最小线程数
430     ThreadsMaxCount := 50;  ///最大线程数
431     uTerminateWaitTime := 2 * 1000///挂起等待时间
432   end;
433 
434 end;
435 
436 procedure TMainForm.FormDestroy(Sender: TObject);
437 begin
438   PoolReg.Free;
439   CodingCs.Free;
440 end;
441 
442 procedure TMainForm.Input1KeyPress(Sender: TObject; var Key: Char);
443 var
444   CodeIdx: integer;
445   ObjName: string;
446 begin
447   if Key= Char(13then begin
448     ObjName:= (Sender as TRzEdit).Name;
449     CodeIdx:= StrToInt(Copy(ObjName,6,1));
450     CodingOK(CodeIdx);
451     if CodeIdx=9 then
452       CodeIdx:= 1
453     else
454       CodeIdx:= CodeIdx+ 1;
455     TRzEdit(FindComponent('Input'+ IntToStr(CodeIdx))).SetFocus;
456   end;
457 end;
458 
459 end.

 

 

 

QQ批量注册全部源代码下载

/Files/cntlis/QQ批量注册.rar

posted on 2010-11-25 12:34  cntlis  阅读(3954)  评论(10编辑  收藏  举报

导航