置顶随笔

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

摘要: 上一篇文章我说明了如何破解QQ批量注册的问题,我看有朋友说过,通过HTTPWATCH看到腾讯提交的参数,那个我知道,不过那个朋友你可以测试一下,腾讯的直接提交是不能用的,必须要中间经历一系列的算法,否则会提示“请不要重复申请”的错误提示有朋友在上一篇文章评论将说关于IP限制的问题,我讲一下,首先代理IP是没问题的,同时采取PPPOE拨号的也没问题,代理IP直接用PNHTTP...阅读全文

posted @ 2010-11-25 12:34 cntlis 阅读(2040) 评论(10) 编辑

[置顶]QQ限制WEB页面注册方法解析及其如何采用多线程技术实现QQ号码快速批量申请

摘要: 腾讯在其QQ免费注册页面http://reg.qq.com/中,为了限制用户注册,设置了多种限制手段,尤其是在其JS页面中设置了多种算法,防止用户批量注册。本文主要分析QQ是如何在WEB前台实现防止用户批量的注册,并且提供了相应的技术解决方案,程序早都做好了,没有外放,看到博客园上有其他人对外写了这样的文章,但是比较简陋,因此这里将我的设计方案跟各位分析一下首先看我的最终实现效果图,比较简陋一些,...阅读全文

posted @ 2010-11-25 04:07 cntlis 阅读(3898) 评论(24) 编辑

2011年10月17日

Delphi中接口与类实例的转换

自己需要封装一个COM,能够实现类似于ADODB相似的功能,然后综合想来,感觉直接的基于UniDac封装比较好,于是马上动手就做,在封装的过程中碰到如下问题

 1   //数据库连接类
 2   TCnConnection = class(TAutoObject, ICnConnection)
 3   private
 4     FConn: TConnection;
 5     function GetConnObj: TConnection;
 6   protected
 7   public
 8     destructor Destroy; override;
 9     procedure Initialize; override;
10     property ConnObj: TConnection read GetConnObj;
11   end;
12   
13   TCnQuery = class(TCnDataBase, ICnQuery)
14   private
15     FQuery: TQuery;
16   protected
17   public
18     procedure Set_Connection(const Param1: ICnConnection); safecall;

19   end; 

 

TCnConnection就是ICnConnection接口的类实现

然后TCnQuery是ICnQuery接口的类实现,现在要实现直接的将ICnConnection作为连接属性传给TQuery。

在TUniQuery中,默认的赋值Connection语句应该为

TUniQuery.Connection= TUniConnection

如果再封装一个一模一样的IUniConnection代码量比较大,因此想着能够直接的传入一个接口,然后自动的得到接口的类实例,然后在接口的类实现当中,串出来一个TUniConnection,方案找到,接下来困难点就是从接口转到类对象

经过多次测试,得出最后的实现方法为

 1 procedure TCnDataBase.Set_Connection(const Param1: ICnConnection);
 2 var
 3   FConnObj: TCnConnection;
 4   eAutoObjFactory: TAutoObjectFactory;
 5   eEntry: PInterfaceEntry;
 6 begin
 7   //得到类工厂,Class_CnConnection就是在创建COM的时候,自动生成的
 8   eAutoObjFactory:= TAutoObjectFactory(ComClassManager.GetFactoryFromClassID(Class_CnConnection));
 9   //得到接口标识的接口项
10   eEntry:= eAutoObjFactory.DispIntfEntry;
11   //IOffset为接口的偏移地址,eResource减去IOffset所得到的地址就是对象实例
12   FConnObj:= TCnConnection(Integer(Param1)-eEntry.IOffset);
13   FDataSet.Connection:= FConnObj.ConnObj;

14 end; 

至此,得到所需要的结果

posted @ 2011-10-17 13:35 cntlis 阅读(245) 评论(0) 编辑

2011年6月14日

一个人的习惯有多么可怕

 

最近,公司里边碰到这么一件事情

公司里边有一名员工,暂且命名为小B,然后他的上级,我给明明为小A。

这日,小A打电话给小B,说让他把他之前做给客户的东西给修改一下,然后这个小B在电话里边说话很强势,似乎是他们两个角色换位了一样,小B一个劲的说没法修改,谁会做谁做,最后还把电话直接给挂了!

然后这一幕正好被我给看到,我就在想,这个小B太强悍了,居然敢跟他的上级领导这么说话。回想小B刚来到公司时候的唯唯诺诺,战战兢兢,简直是一个天壤之别,然后我就在考虑是什么原因造成这样的结果呢?后来得出结论就是习惯。

一对情侣,男孩一味的对女孩好,比方说每天都主动做饭给女孩吃,还负责打扫家务。刚开始,女孩会感觉男孩真好,天天的给他做饭,然而时间一久,女孩慢慢的把男孩对他的好当成了习惯,如果哪一天男孩忘记给女孩做饭,或许女孩会对男孩破口大骂,为什么不给我做饭?女孩把男孩对他的好,当成了是一种理所应当的事情,于是慢慢的就失去了对男孩的那种感激,久而久之应该什么样,想必大家都应该可以想明白

同样的,这件事情可以这么去想

我们把小B和小A关于认为分配的事情,按照次数对他们之间的对话大概罗列一下 

第一次

小A:小B啊,你今天把这个任务给完成一下

小B:好的,A总,您有什么问题尽管吩咐,我一定会努力完成的

小A:没关系,不用太紧张,慢慢来

或许第二次

小A:小B,你今天把这个任务给完成一下

小B:A总,这个问题有点复杂,我不一定能够完成

小A:没事,尽力就好,慢慢来

最后,任务可能真没完成

小B:A总,我那个东西做不出来

小A:哦,没关系,以后多努力 

或许第三次

 

小A:小B,你今天把这个任务给完成一下

小B:A总,这个问题估计做不了,要不让其他人做吧,我做一些简单的

小A:好的,没问题

 

或许第四次

小A:小B,你今天把这个任务给完成一下

小B:这个问题我不一定会做,让其他人做吧

小A:好的,没问题

 

或许第五次

小A:小B,你今天把这个任务给完成一下

小B:我不会做,让其他人做吧

小A:好的,没问题

...... 或许中间经历了好多次

现在

 

小A:小B,你今天把这个任务给完成一下

小B:不会!!!谁会做谁做!!!(然后挂断电话,或许如果当面的话,会直接的显示器一关,直接夺门而出)


那么在整个时间的过程中,究竟是哪个环节出现了问题,导致B在开始和现在出现了这么大的反差呢?

刚开始,小B 单从言语看,是一个挺好的员工的,然后到最后,单从言语看,会发现小B是一个如此差劲的员工,敢跟上级叫板

而实质上来讲,小B就是把跟上级可以随便的正常,当成了一种习惯,他根本就没有意识到他这个吵,对于他自身来讲,是一件多么不恰当的事情!

或许小A最开始的时候,在小B任务完不成的情况下,是不想给小B打击,想着小B能够自我领悟小A对他的那个意思;

而小B在最开始任务没完成,和在他向小A提出我任务做不好这个请求并得到小A答复的时候, 他认为是这个领导还蛮好说话呢,我以后只要碰到稍微困难一点的问题就可以直接的提出不做了。

久而久之,小A纵容小B成了一种习惯,而小B可以肆意的对小A顶嘴,对小A下达的任务直接的否决也成了一种习惯!然而万事万物都有相应的规则,或许哪一天,小A受不了小B对他的那种顶嘴,就会直接的对小B说出一些很过激的话或者做出一些很过激的做法,甚至譬如说直接让他辞职,而小B或许哪一天也会做出一些过激的事情,譬如说对小A和公司规章制度视而不见,甚至说肆意践踏公司的规章制度,如果小A提出意见,小B直接的会对此进行顶嘴。

 

总结

第一,公司有公司的运行规则,社会有社会的运行规则,如果违背了这些规则,那么最终肯定是要出大问题;

第二,防微杜渐,公司里边如果碰到哪怕再小的事情,只要是危害到公司正常运行规则的,一定要及时的给找出来,该批评的批评,该惩罚的惩罚(就像如果最开始,小B向小A提出不会做的时候,小A采取另外一种相对强硬的方式,事情还会像今天这样发展吗)

第三,人治和法治的取舍,毫无疑问的,必须要法治在线,人治在后。因为社会造就了形形色色的人,不是所有人的都是高尚的,也不是所有的人都是卑鄙的

等等,似乎还有好多还都可以写, 但是暂且先写到这里,下次有空了再进行分析

 

 

请注意,这里所讲的主要就是一个人的习惯的问题,一个人无论他所做的事情是对的还是错的,一旦形成了习惯,那么他就会局限于他这个习惯之中,看不到自己的对和错,甚至周围的人也会看不到他的对或错,然而,这件事情发展到最后,肯定会凸显出来他的对或者错的 

 

posted @ 2011-06-14 11:43 cntlis 阅读(7252) 评论(75) 编辑

2011年6月8日

Delphi或者BCB在运行中出现“Stack Overflow- save your work and restart CodeGear”错误提示的解决方案

最近用D在做项目的过程中,IDE突然抛出了“Stack Overflow- save your work and restart CodeGear”的错误提示,经过错误跟踪,最终发现是MMX的问题。

如果使用MMX,超过最大使用期限,那么他就会莫名其妙的让IDE动不动抛出类似异常,具体解决方案如下

1.卸载MMX;

2.删除注册表里边的 HK_USER\SoftWare\ModelMaker目录

3.删除\Application Data\ModelMakerTools\Shared文件夹

然后就可以正常使用了

如果之前有MMX过期的问题,同样的也可以采取这种方法重装 

posted @ 2011-06-08 11:26 cntlis 阅读(328) 评论(0) 编辑

2011年3月7日

Delphi中variant 和 Stream 的互換

DELPHI中使用COM,COM+时候经常需要用到STREAM和VARIANT类型的转换

 

 1 procedure VarToStream(var AStm: TStream; var AOvar: Olevariant);
 2 var
 3     p: Pointer;
 4 begin
 5     AStm:= TMemoryStream.Create;
 6     AStm.Position := 0;
 7     p := VarArrayLock(AOvar);
 8     AStm.Write(p^, VarArrayHighBound(AOvar, 1));
 9     VarArrayUnlock(AOvar);
10 end;
11 
12 procedure StreamToVar(var AStm: TStream; var AOvar: Olevariant);
13 var
14     p: Pointer;
15 begin
16   AOvar := VarArrayCreate([0, AStm.Size - 1], VarByte);
17   p := VarArrayLock(AOvar);
18   AStm.ReadBuffer(p^, AStm.Size);
19   VarArrayUnlock(AOvar);
20 end;

 

posted @ 2011-03-07 11:22 cntlis 阅读(653) 评论(1) 编辑

2010年12月31日

QQ批量自动登录程序的设计

因为自己的QQ号码有好几个,每次重启机子的时候一个一个的登录超级麻烦,而且腾讯老是在偶尔的时候,再把以前已经记住密码的QQ密码给置空,还要重新输入,太麻烦,因此尝试着自己搞一个批量自动登录的程序

以TM2009为例,查看了一下,未登录之前一个窗体,上边两个控件,登录以后,窗体捕获到一个控件,根据这个,首先找到QQ的登录框,输入用户名,密码的位置,获取窗体句柄的具体代码如下:

这里先定义了一个record类型,

1   TQQWnd= record
2     QQWnd,QStatusWnd: HWND;  //QQ的窗口句柄,QQ的弹出登录状态句柄
3     QQNumWnd, QQPassWnd: HWND; //QQ号码输入句柄,QQ密码输入句柄
4   end;
5 

 

 

 1   function GetQQLoginHwd(var AQQWnd: TQQWnd): Boolean;
 2   var
 3     WinTitle: array[0..254of Char;
 4     WinClass: array[0..254of Char;
 5   begin
 6     Result:= False;
 7     AQQWnd.QQWnd:= 0;
 8     AQQWnd.QQNumWnd:= 0;
 9     AQQWnd.QQPassWnd:= 0;
10     AQQWnd.QQWnd:= FindWindow(nil'TM2009');
11     while AQQWnd.QQWnd<> 0 do begin
12       AQQWnd.QQNumWnd:= FindWindowEx(AQQWnd.QQWnd, 0'ATL:30A4D1D8'nil);
13       AQQWnd.QQPassWnd:= FindWindowEx(AQQWnd.QQWnd, 0'Edit'nil);
14       if (AQQWnd.QQNumWnd<> 0)and (AQQWnd.QQPassWnd<> 0then begin
15         Result:= True;
16         FOpened:= True;
17         Exit;
18       end else begin
19         AQQWnd.QQWnd:= GetWindow(AQQWnd.QQWnd, GW_HWNDNEXT);
20         if AQQWnd.QQWnd=0 then Continue;
21         GetWindowText(AQQWnd.QQWnd, @WinTitle, SizeOf(WinTitle));
22         if WinTitle<>'TM2009' then Continue;
23       end;
24     end;
25   end;
26 

 

 

因为腾讯的密码输入框,采用的是低级钩子,然后定时的释放,建立钩子这种方式来防止木马程序去捕获,我尝试了下,直接的用Sendmessage去发送密码信息,没反应,因此这里我采用了SendInput的方式去输入密码,而用户框因为没有做任何的保护措施,所以可以直接的通过发送消息,将QQ账户信息给赋值过去,具体代码为

 

 1       SetForegroundWindow(QQWnds.QQWnd); //QQ窗体设置为活动窗体
 2       //设置QQ号码
 3        SendMessage(QQWnds.QQNumWnd,WM_SETFOCUS,0,0); //聚焦至QQ号码输入框
 4       Sleep(20);
 5       SendMessage(QQWnds.QQNumWnd,WM_SETTEXT,0,LPARAM(FQQNum)); //设置QQ号码
 6 
 7       SendMessage(QQWnds.QQPassWnd,WM_SETFOCUS,0,0); //聚焦密码输入框
 8       Sleep(20);
 9       //设置QQ密码
10       SIKeyInput(FQQPass, 10); //QQ密码采取SENDINPUT方式
11 
12 
13 

 

 

解下来要操作的,就是设置登录方式了,譬如说“我在线上”,“隐身”等状态,由于腾讯的登录窗体是采用的GUI,所以是捕获不到句柄的,只能通过坐标来捕获,我之前的时候,是用的固定坐标,然后有的电脑可以用,有的不能用,后来才发现,是由于腾讯的界面可以拉动,只要一拉动,他的坐标位置就变了,因此我这里采取相对坐标,根据QQ密码框的坐标,来设置点击的坐标。腾讯的状态是在窗体上点击以后,弹出一个跟登录框平级的窗口,因此点击以后,需要检测是否弹出选择状态窗口,找到那个窗口句柄以后,再发送相应的点击命令,这样就完成整个的流程了

 

 1 const
 2   QQStatusYArray: array[0..5of Integer= (19386286105131);
 3 
 4 
 5       ClickTimes:= 0//为防止有的时候点击过程中出现其他不可预料的错误,这里可以重复点击三次
 6       QQWnds.QStatusWnd:= 0//设置QQ状态初始句柄为0
 7       //鼠标点击
 8       while ClickTimes<3 do begin
 9         PostMessage(QQWnds.QQWnd,$201,MK_LBUTTON,StrToInt(#36+IntToHex(QQNumRec.Bottom- QQRect.Top+21,4)+IntToHex(QQNumRec.Left-QQRect.Left+25,4))); //发送点击消息,这里如果采用SendMessage,会死线程,因此我采用了PostMessage
10         PostMessage(QQWnds.QQWnd,$202,MK_LBUTTON,StrToInt(#36+IntToHex(QQNumRec.Bottom- QQRect.Top+21,4)+IntToHex(QQNumRec.Left-QQRect.Left+25,4)));
11         Sleep(200);
12         QQWnds.QStatusWnd:= FindWindow('TXGuiFoundation','TXMenuWindow'); //检测是否存在QQ设置状态窗体
13         if QQWnds.QStatusWnd<>0 then begin
14           try
15             PostMessage(QQWnds.QStatusWnd,$201,MK_LBUTTON,StrToInt(#36+IntToHex(QQStatusYArray[FQQStatus],4)+IntToHex(27,4))); //如果存在窗体,直接的发送点击信息
16             PostMessage(QQWnds.QStatusWnd,$202,MK_LBUTTON,StrToInt(#36+IntToHex(QQStatusYArray[FQQStatus],4)+IntToHex(27,4)));
17           except
18           end;
19           Break;
20         end;
21         ClickTimes:=ClickTimes+1;
22       end;
23       if QQWnds.QStatusWnd=0 then begin //如果一直没有捕获到设置状态窗体,程序则自动退出
24         Task.Comm.Send(MSG_QQ_ERR, IntToStr(QQRect.Left)+''+ IntToStr(QQRect.Top)+ ''+ IntToStr(QQRect.Right)+ ''+ IntToStr(QQRect.Bottom)
25           +''+ IntToStr(QQNumRec.Left)+''+ IntToStr(QQNumRec.Top)+ ''+ IntToStr(QQNumRec.Right)+ ''+ IntToStr(QQNumRec.Bottom)
26           + IntToStr(QQNumRec.Bottom- QQRect.Top+21)+'设置状态失败');
27 //        Task.Comm.Send(MSG_QQ_ERR, IntToStr(QQNumRec.Left-QQRect.Left+25)+''+ IntToStr(QQNumRec.Bottom- QQRect.Top+21)+'设置状态失败');
28         Exit;
29       end;
30 

 

 

最后,直接的点击登录按钮就可以了,这个地方,也是要计算相对于密码输入框的坐标

 

1       //点击登录按钮
2       try
3         PostMessage(QQWnds.QQWnd,$201,MK_LBUTTON,StrToInt(#36+IntToHex(QQNumRec.Bottom- QQRect.Top+114,4)+IntToHex(QQNumRec.Left-QQRect.Left+64,4)));
4         PostMessage(QQWnds.QQWnd,$202,MK_LBUTTON,StrToInt(#36+IntToHex(QQNumRec.Bottom- QQRect.Top+114,4)+IntToHex(QQNumRec.Left-QQRect.Left+64,4)));
5       except
6       end;
7 

 

 

至此,整个的流程完毕了,最后,还可以增加上检测该QQ号码是否已经登录

以下是最后出来的界面,我直接的将QQ信息保存在数据库当中,密码采用了AES加密,所以也不用担心密码信息被泄

可以点击这里下载QQ批量下载

posted @ 2010-12-31 13:50 cntlis 阅读(2440) 评论(19) 编辑

2010年11月25日

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

摘要: 上一篇文章我说明了如何破解QQ批量注册的问题,我看有朋友说过,通过HTTPWATCH看到腾讯提交的参数,那个我知道,不过那个朋友你可以测试一下,腾讯的直接提交是不能用的,必须要中间经历一系列的算法,否则会提示“请不要重复申请”的错误提示有朋友在上一篇文章评论将说关于IP限制的问题,我讲一下,首先代理IP是没问题的,同时采取PPPOE拨号的也没问题,代理IP直接用PNHTTP...阅读全文

posted @ 2010-11-25 12:34 cntlis 阅读(2040) 评论(10) 编辑

QQ限制WEB页面注册方法解析及其如何采用多线程技术实现QQ号码快速批量申请

摘要: 腾讯在其QQ免费注册页面http://reg.qq.com/中,为了限制用户注册,设置了多种限制手段,尤其是在其JS页面中设置了多种算法,防止用户批量注册。本文主要分析QQ是如何在WEB前台实现防止用户批量的注册,并且提供了相应的技术解决方案,程序早都做好了,没有外放,看到博客园上有其他人对外写了这样的文章,但是比较简陋,因此这里将我的设计方案跟各位分析一下首先看我的最终实现效果图,比较简陋一些,...阅读全文

posted @ 2010-11-25 04:07 cntlis 阅读(3898) 评论(24) 编辑

2009年3月14日

基于JQUERY制作的仿GOOGLE自动完成插件

摘要: 基于JQUERY制作的仿GOOGLE自动完成插件数据采用JSON,格式为{keylist:[{'keyname':关键字1,'keyextend':扩展文字(譬如说结果数目)},{'keyname':关键字2,'keyextend':扩展文字(譬如说结果数目)}]}效果如图完整的JS代码如下[代码]CSS文件[代码]调用范例$("#Keyword").AutoComplete("search.as...阅读全文

posted @ 2009-03-14 23:45 cntlis 阅读(4103) 评论(11) 编辑

2009年2月22日

银行登录控件仿制--防钩子,防嗅探

摘要: 银行登录控件仿制--防全局钩子,防嗅探类似于支付宝登录控件、工商、招商银行登录控件,这个是一个DLL钩子,用于注入其他进程另外有一个控件,用来模拟INPUT控件,近期发布!变量定义 unit hook_const; interface uses windows; const Mouse_MFileName='_MyDllMouse'; Key_MFileName='_MyDllKey'; cons...阅读全文

posted @ 2009-02-22 16:17 cntlis 阅读(919) 评论(2) 编辑

工作需要根据资料写的一个SHA1RSA算法

摘要: 工作需要根据资料写的一个SHA1RSA算法其中用到了libeay32.dll和ssleay32.dll,版本不限制,直接从官方下载源码然后编译function ReadPrivateKey(AFileName: TFileName): pEVP_PKEY; //读取私钥文件varkeyfile: pBIO;function cb(buffer: PChar; blength: integer; v...阅读全文

posted @ 2009-02-22 16:13 cntlis 阅读(844) 评论(1) 编辑