源代码下载"/>
关于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: string ; override ; /// 输出信息,覆盖
86 end ;
87
88 var
89 MainForm: TMainForm;
90 Codings: array [ 1 .. 9 ] of 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 < 0 ) or (CodeIdx > 9 ) then 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 < 0 ) or (CodeIdx > 9 ) then 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 < 0 ) or (CodeIdx > 9 ) then 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 < 0 ) or (CodeIdx > 9 ) then 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 .. 14 ] of 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( ' / ' );
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( ' =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( ' .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 ' ].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( ' ' ,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( 13 ) then 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
转载于:.html
更多推荐
关于QQ注册如何突破IP限制的说明附全部源代码下载
发布评论