领导测试软件测试网
免责声明:纯技术交流,请勿用于其他目的!!
文中讨论的技术的应用范围似乎比较广,不仅为这些相对否定的应用投票,还可以完成手动填表、手动申请邮箱、网站注册等功能。
这里提供了两种方式:
方式一:通过IE控件提供的COM套接字实现。这些方法都是通过来编辑web表单(有时要修改web代码),然后触发提交web页面的风暴。因为这些方法使用的是IE控件,所以打开网页时会下载很多与应用无关的数据,比如图片等(其实IE中可以关闭图片等选项),效率很低,你必须为每一票投票。打开一个IE控件,如果你的机器比较差,等着按Reset~~。另外,这些方法编码比较多,很烦人。
方法二:通过API实现表单提交工作。这些方法比上述技术要复杂得多,不仅执行效率高、资源消耗少,而且具体实现也比前一种简单。
这两种方法描述如下:
方法一:通过IE控件提供的COM套接字实现
1、我的程序是基于对话框的,没有用到,所以我必须先在对话框上放一个IE控件(上面有web浏览器),并给这个IE控件起个名字,比如。另外,记得添加头文件,来自IECOM套接字的所有东西都放在上面。如果没有,请添加它。
2、使用响应加入风暴,这样页面下载完成后,就可以做填表等工作了。其实你也可以在这样的风暴中进行这种操作,但是接下来你要判断网页是否快要下载到合适的位置了。如果想省事,直接用就行了。
3、下一步就是使用这个控件打开目标网页。您可以决定何时打开它。我在上面打开它。代码如下:
vaUrl="";
.(&vaUrl,&,&,&,&);
其中哪个用作默认参数。
4、 然后是主要操作。这个操作就放进去了,为了方便,我写了几个函数来完成具体的功能。在具体说明中执行的操作之前,我先解释一下这些功能。
//功能:判断网页中是否有指定元素
//:: 网页中所有元素的集合
//: 网页中元素的id或名称
布尔(开*,)
{
;
->item((),((long)0),&pDisp);
如果(pDisp==NULL)
错误的;
别的
真的;
}
//功能:在网页的文本框中输入字符串
//:: 网页中所有元素的集合
//: 要编辑的文本框的 id 或名称
//: 在文本框中写什么
无效(开*,,)
{
显示;
->item((),((long)0),&pDisp);
;
如果(pDisp==NULL)
{
(+"未找到!");
}
别的
{
=pDisp;
->(.());
}
}
//功能:为网页提交表单
//:: 网页中所有元素的集合
//: 可以提交Form的按钮的id或者名称(也可以直接提交Form)
无效(开*,)
{
;
->item((),((long)0),&pDisp);
;
如果(pDisp==NULL)
{
(+"未找到!");
}
别的
{
=pDisp;
->点击();
}
}
//功能:选择其中一个网页(当然是点击)
//:: 网页中所有元素的集合
//: 要选择的 id 或名称
无效(开*,)
{
显示;
->item((),((long)0),&pDisp);
;
如果(pDisp==NULL)
{
(+"未找到!");
}
别的
{
=pDisp;
->点击();
}
}
使用这些功能可以轻松完成投票操作。下面列出的代码。
还假设投票页面是,数据提交到/vote2.asp
空白::()
{
//TODO:在此处添加您的代码
开*=空;
*=空;
,;
=.();//获取当前网页的URL
如果(。())
;
=(*).();//从控件中获取插座针
->(&);//获取网页所有元素的集合
//因为这个函数会在所有页面下载完成后执行,所以消息的来源页面必须根据URL来确定
如果(=="")
{
;
if((,"")==true)//投票选项所在的表格
{
->item((""),((long)0),&pDisp);
;
如果(pDisp==NULL)
{
//获取套针失败,程序结束,不做额外处理。原因见下文。
(IDOK);
;
}
别的
{
//如果投票结果是在新窗口中打开,网页代码要改成在这个控件中显示结果
=pDisp;
->(("_self"));//等价于="_self"
->(("投票2.asp"));//等价于="投票2.asp"
}
(,"chk2");//在表格中选择chk2的id
(,"vote");//提交网页,vote是按钮的id或者名字
}
}
(=="")
{
(IDOK);//如果投票处理页面已经下载,则结束程序,原因见下。
}
}
既然已经投了票,但是看完流程,你可能会疑惑,为什么要在投票后结束流程或者中间有错误,而不是继续投票呢?事情是这样的,有些网站只能投一票,并且在创建一个IE控件并连接到服务器后(用它),设置了key的种类(一家之言),所以如果你继续使用这个 IE 控件进行投票,服务器会告诉你已经投票了(其实如果投票程序写的很笨,忽略这个会容易很多)。本来想通过分析API的运行过程来处理这个问题,觉得很麻烦,于是就用了一个很笨但是很简单的方法:把投票程序当成程序,然后另一个程序调用这个投票程序,在投票过程结束后,主程序再次运行投票过程,以此类推。至于投票程序数量限制之类的,使用共享显存段是最简单的(一家之言),这里就不多说了。
方法二:通过API实现表单提交
这些方法实现的代码量非常小,但是因为不需要下载太多无用的数据(比如图片等),而且表单所在的页面也不需要下载,所以效率是高得多。另外,实现代码是一个函数,非常适合使用。在线程中。
使用这些技术的关键是知道应该向服务器提交哪些数据。如果你自己看网页文件,那么分析哪些数据应该提交给服务器。如果网页很简单投票作弊软件,几乎是一样的。. 既然不是考试,我们就不会那样做。现在有一个更简单的方法,就是使用下面的网络监视器手动投票,看看有哪些数据提交到服务器。这样我们就可以复制属于HTTP合约的部分数据了。直接从监视器复制的数据不能使用,因为监视器显示的部分文本中的回车换行等字符被小数点替换,这部分必须改回原来的回车和换行。(HTTP后面的部分可以忽略,只要你能区分边界)。另请注意,提交信息中可能存在-此信息。如果更改了提交数据的内容,并且数据宽度发生了变化,那么-item的值也必须相应的改变。比如-原来的值为100,数据中有一个数据“1”,你现在改成“12”,那么-一定要改成101,否则服务器会报错。
下面列出了投票功能:
()
{
;
.++;//用于记录投票线程数
尝试
{
*=.("");//网站服务器
*pFile=->(::,"vote2.asp");//直接提交数据到投票处理页面
//在下面提交的数据中添加HTTP头,可以通过网络监视器获取
pFile->(":image/gif,image/x-,image/jpeg,image/pjpeg,/vnd.ms-,/vnd.ms-excel,/,*/*");
pFile->(":");
pFile->("-:zh-cn");
pFile->("-Type:/form-data;=----------------------------");
pFile->("-:gzip,");
pFile->("用户代理:/4.0(;MSIE5.01;NT5.0)");
pFile->("-:1351");
pFile->(":Keep-Alive");
pFile->("缓存-:无缓存");
//真正的数据应该在HTTP头的旁边,要提交的数据在下面。服务器处理返回的信息在pFile中
pFile->(NULL,0,..(0),..());//提交所有数据
//虽然这里的投票已经结束了,但是如果想看结果,可以分析返回的页面,获取一些数据
char[11001];//用来存放返回的处理页,多大视实际情况而定。其实也可以动态分配,如果不是太累的话
=pFile->Read(,11000);//读取返回的内容,虽然是投票结果页面的html代码
[nLen]=0;
=;//其实用的有点过头了,不过用起来很方便,呵呵~
pFile->Close();//读取数据后,关闭所有应该关闭的东西
->关闭();
p文件;
;
。关();
//下面的代码是用来分析HTML代码得到你感兴趣的数据的投票作弊软件,跟投票无关,就不详细解释了。
=.Find("选项 A");
诠释=nPos;
如果(nPos==-1)
{
.--;
0;
}
nPos=.Find("=100>",nPos)+36;
int=.Find("票",nPos);
=atoi(.Mid(nPos,-nPos));
nPos=.Find("
1
");
nPos=.Find("=100>",nPos)+36;
=.Find("票",nPos);
=atoi(.Mid(nPos,-nPos))-;
++;
}
抓住(...)
{
}
.--;
0;
}
如您所见,关键代码只有几行。如果不分析投票结果,比一技能少很多,但看起来没有一技能那么乱。不过,这些方法也有方法一中提到的那种重复问题。当我尝试时,新打开的线程也会重复。所以恐怕Key的种类是根据ID来确定的(一家之言,欢迎大家讨论)。但是,如果同时启动N个线程,则所有N个线程都可以成功投票,而不用说“你已经投票了”。恐怕因为这个信息是同时提交的,服务器在处理一个似乎已经投票的消息时并不知道。不知道是不是这个原因,大家可以讨论一下。
这就是两种投票方式。我的水平真的很一般,所以如果文章有错误,请不要嘲笑他们。我将强调错误并一起讨论。另外,希望大家讨论一下文章中提到的问题。
另一个小广告:呵呵~~
峰会亮点