明天要考数据库应用了,今天仍然忍不住把校内踩踩小工具写完。
上次被打击了,人家刷人气的工具是建立一个平台进行互踩,但是安全性存在问题。我自己写的这个小东西能在校内限制范围内刷50个相同区域的页面(校内限制次数是100,可以执行两次,以后再执行就必须到网页输入验证码),然后通过他人回踩来提高人气。
纯粹是自己写着玩,几乎没有什么应用价值,不过既然写了这么久,也就放上来,大家把玩一下。 阅读全文
明天要考数据库应用了,今天仍然忍不住把校内踩踩小工具写完。
上次被打击了,人家刷人气的工具是建立一个平台进行互踩,但是安全性存在问题。我自己写的这个小东西能在校内限制范围内刷50个相同区域的页面(校内限制次数是100,可以执行两次,以后再执行就必须到网页输入验证码),然后通过他人回踩来提高人气。
纯粹是自己写着玩,几乎没有什么应用价值,不过既然写了这么久,也就放上来,大家把玩一下。 阅读全文
终于又考完一门试,开始做课程设计了,结果课程设计给工作室一个尾气3个月的项目,而这次的先用我写的贴吧放上去,我变得暂时空闲了,开始着手写校内开心农场小工具-全能拖拉机。 首先要解决的就是校内登录的问题,那就是Get/Post方法了,还有用户状态保存,就是session的操作。Java不同于C#,那位可以集成系统的浏览器或者之间创建一个Browser。
这篇文章讲的是Socket中的select,我觉得还不错就转来了
出处:http://www.cnblogs.com/xuyuan77/articles/1206418.html
感谢原作者
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。
下面详细介绍一下!
Select的函数格式(我所说的是Unix系统下的伯克利socket编程,和windows下的有区别,一会儿说明):
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
先说明两个结构体:
因为一直想写一个刷人气的工具,其中最基本的就是post方法了,然后再收集页面中的元素。今天我就开始着手写Java的POST方法。
在Java.net.*;中用URL构造地址,然后用流写入,似乎应该是很简单的方案,我却一直没成功。我百度Google了很久,参考了很多别人代码,似乎很容易实现,可是我的一直问题,而我觉得和网上提供的一样。我的代码如下
package netStudy01;
import java.io.*;
import java.net.*;
public class PostBaidu
{
public static void main(String[] args)
{
try
{
URL url = new URL("http://localhost/xhpx_web/gradequery.asp");
try
{
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(false);
conn.setInstanceFollowRedirects(false);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (compatible; MSIE 6.0; Windows NT)");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(),"ASCII");
String request = "exam_id=123&submit=%CC%E1%BD%BB";
out.write(request);
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuffer content = new StringBuffer();
while ((line = in.readLine()) != null)
{
content.append(line + "\n");
}
System.out.print(content);
} catch (IOException e)
{
e.printStackTrace();
}
} catch (MalformedURLException e)
{
e.printStackTrace();
}
}
}
很不幸,返回的数据一直还是这个提交页面,我尝试了好多方法,甚至用ethereal截取POST信息,用IE的POST信息和JVM的POST信息一一对比并增加信息,包括"User-Agent","Mozilla/5.0 (compatible; MSIE 6.0; Windows NT)""Content-Type", "application/x-www-form-urlencoded"都没有什么效果。
如果POST百度,甚至直接都运行时错误,我Java学的太少,完全不知道错误缘由。再加上本来java.net功能就很弱,我想使用Apache.commons.html-client.*的包来完成,这样也能捕获到网页元素。
Goolge了一会才从Apache的项目列表中找到http://hc.apache.org/downloads.cgi这个组件,呵呵,居然是校内网提供的镜像站点,看来校内的架构也用到了Apache的开源阿。
1.7M下完,配好ClassPath和项目jar,打开java文档,也就是API说明吧,铺天盖地的英文有点怕…呵呵,慢慢看吧,压缩包内还有几个小例子,可以供参考。
网上详细的资料不多了,得研读好一会,继续学习,Lingoes开着,英语果然很重要阿““
想起以前在.NET平台下面做,轻松容易很多,不用自己辛苦的找组件,MS的实力摆在哪里,全都提供好了。
网络编程学习日记(2)_利用WinPcap实现ARP的发送和接受
网络编程学完以太网帧的结构,就开始正式进入IP层的学习了,在学习编程之前,对网络协议的有一定的了解,而且还要知道每个数据包,或者是报文,或者是帧他们每个字节的含义
玩ARP么,肯定得知道他的原理,我就不做什么说明了,书上一大堆的
首先是ARP的接收,来看一下程序的流程
获取网络设备列表
pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf)
然后人机交互一下,获得需要工作的网卡
打开需要的网卡
(adhandle= pcap_open(d->name, // 设备名
65536, // 要捕捉的数据包的部分
// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
)
检查数据链路层,我们只考虑以太网
pcap_datalink(adhandle) != DLT_EN10MB
编译过滤器
pcap_compile(adhandle, &fcode, packet_filter, 1, netmask)
设置过滤器
pcap_setfilter(adhandle, &fcode)
开始捕捉数据包
pcap_loop(adhandle, 0, packet_handler, NULL)
packet_hanler回调函数,就是每次接收到过滤之后的数据包使用的函数
/* 回调函数,当收到每一个数据包时会被libpcap所调用 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
这就是整个流程了,程序只监控,所以是没有结束的,除非用户结束
我不喜欢在这里贴出很多代码,只是简单说一下写时候的注意点
源代码我发到了CSDN,后面会给出网址,如果不能下,可以在Baidu联系我,小弟能帮上忙就一定帮的
整个程序的注意点
1. 结构的定义,写完整个程序,包括ARP接受,发送,欺骗,我最大的感觉就是关于数据长度的重要性,以前不以为意,只是觉得可以省空间,也不觉得64位和32位有什么区别,不过写完网络数据包的分析,就觉得数据长度控制很重要,所以就算有指针,也是需要定义被指向目标的长度。因为指针的出现,数据的转换实在是变得太方便了。可以直接把WinPcap捕捉到的数据直接往后移动14个单位长度,获得ip头,而忽略前面14字节的以太网头部。
2. unsigned char, unsigned short, unsigned int等非负数据的使用和转换必须非常小心,因为插入断电看到的数据未必就是真实的数据,压根看不出真实数据,我后来使用Ethereal来进行数据包的监控,非常有效,Ethereal是一款GUI界面的网络数据包监控软件,非常好用,他本身也是基于WinPcap的。
3. 安全性的控制,程序的框架,其实我是使用的WinPcap自带代码的框架,安全控制几乎是步步为营,刚开始我认为有点大题小做,后来把程序移植到别的机子上运行,真的发现安全控制做的真好,每一步都可以知道问题出在哪里,防止更多错误出现。
4. 有一个MacToStr()的函数写的非常巧妙,是课本上面的事例程序,使用了位运算,本来还有一个IpToStr(),不过似乎出现了一些问题,于是我的Mac地址存储在u_char[6]里面,而Ip地址存储在ip_address里面,自定义了一个结构,这个也是学习WinPcap示例代码的。我觉得自定义结构使用更方便高效。
5. 网络存储字节高地位和本地存储高地位是相反的,有几个函数专门用来转换的,我直接使用的自己人工把那几个自己转换的
6. printf使用很方便,这点要感谢暑假Acm训练…
接受数据包其实非常简单,几乎就是简单的把WinPcap使用了一下
本程序源代码的下载地址(http://download.csdn.net/source/647852)其实很简单,如果有WinPcap开发文档,自己写也差不多
我现在已经写完了欺骗了,会逐渐把自己的心的经验拿上来分享一下
这几天看MFC图形界面,网络编程方面在看使用WinAPI来发送数据包,这样就可以不用装WinPcap了
想不适用WinPcap就直接使用WinPcap的函数,我正在尝试,光考出几个dll还不够,还要一个npf.sys支持,我也是今天刚看到资料,待会儿在机房做完测试会写个帖子的。
呼呼,就写这么点了,晚上图形实验课在机房做ARP欺骗,老师的防火墙一直叫,嘿嘿,不过大家都有360防火墙,倒没什么事故。
系统重装了,打好多补丁啊,还有好多软件重装…郁闷…
老系统用了2年没重装了,也到寿命了…