脑洞 – 折腾(存档) https://blog.sorz.org 已停止更新和维护。该页面为2018年3月创建的存档,其内容可能已过于陈旧、与现状不符,仅作为历史存档用作参考。 Sun, 14 Jan 2018 11:08:20 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.4 乱发数据包 /p/illegal-send/ /p/illegal-send/#comments Sun, 23 Mar 2014 10:43:58 +0000 https://sorz.org/?p=347865 这是去年写的一个用于干扰教学的工具。

Computer Networks 这门课,需要用到 Wireshark 这个抓包软件查看网络流量。
写了这玩意,通过广播一些特制的数据,可以在其他人的机子上刷出点有趣(?)的东西:在 Wireshark 上刷奇怪的东西

如图,一眼就能看出不正常.. 其实就是乱发 HTTP Response,并把原来显示状态码(200、404 …)的部分,改成了其他文字…

由于需要发,用了 WinPcap,它提供了一些 API 能够比较方便地跳过系统的协议栈,让网卡发送完全自定义的数据。这里使用了它的一个 Python 绑定 winpcapy

最后需要发送的是以太网帧,也就是说,要自己从 HTTP、TCP、IP 一路构建下来。为了简化工作使用了 dpkt ,里面提供了丰富的协议支持,能很方便地构建数据包。

一点小细节:Wireshark 会分析 TCP 协议,并把不正常的包用红色标出。为了避免这样,每个包的目的端口都是随机选取的,让 Wireshark 认为每个包都属于不同的 TCP 会话。当然换成随机的 IP 也没问题。

代码贴 Gist 上了 Gist 9721330

玩法:

  1. 下载安装 Python 2.7 和 WinPcap
  2. 下载打包的好的工具;
  3. 运行net_test.py得到网卡列表和对应的地址(e.g rpcap://\Device\NPF_{x-x-x-x-x});
  4. 运行net_test.py rpcap://\Device\NPF_{x-x-x-x-x}发送。
    完整用法是net_test.py <interface> [repeat_times [message]],可选重复次数与消息内容(默认是 5 次、发送随机表情)。

注意需要管理员权限,系统如有开 IP Forwarding 功能需关闭

代码不复杂,想玩更多花样可以自己改..
注意这样不按协议标准发数据的事.. 还是少做得好.. 玩玩就好,切勿滥用..

]]>
/p/illegal-send/feed/ 4
一种公平防作弊的抽签方式 /p/p2p-lucky-draw/ /p/p2p-lucky-draw/#respond Sun, 01 Dec 2013 09:50:14 +0000 https://sorz.org/?p=347782 luckydraw-cheat看到一张长图,讲程序猿群里分红包的。

其中有一段,有人写了一个程序用来摇号,但是随之而来的是摇号作弊问题..

最后的解决方法竟然是在摇号软件里加入“本人承诺……”复选框(见左图),这明显不是程序猿的风格啊,应该更蛋疼认真严谨才对。

我当即想了个简单易行的方法,保证摇号结果的公正随机。大致思路是:通过各自生成随机数,将随机性分散到每个人手中;用先公布随机数的散列值后公布随机数的方式,确保每个人在生成随机数时不知道别人的随机数;每个人都进行一次运算,所有人的结果均一致结果才有效。

有点 P2P 的意思。反正大家都是程序猿,读一遍代码就能确保没人在实现上做手脚,再不放心各自写一个互相兼容的客户端也行。

具体算法:

  1. 现有 n 个成员参加摇号,为其编号为 1, 2, …, n;
  2. 商定一个伪随机数算法 Rnd(seed) ,一个 Hash 算法 Hash()
  3. 各成员用任意算法生成一足够大的随机数,记作 Ri (i = 1, 2, …, n) ;
  4. 各自计算 Hi = Hash(Ri),并广播 Hi
  5. 当任意成员 j (j = 1, 2, …, n) 得到所有 Hi 后,广播自己的 Rj
  6. 当任意成员 j 得到所有成员的 Ri 后,计算每个 Hi == Hash(Ri) 。若非全真,则提出异议并终止;
  7. 若全为真,计算 Sj = Rnd(∑Ri) % n + 1,并广播;
  8. 若无异议且 S1 == S2 == … == Sn 为真,则选 S1 号成员为本轮抽签幸运儿。

作为一个守规矩的成员 h,我只要保证第3步自己生成的 Rh 是随机的,不管他人如何改变算法,结果都是随机的公平的。
作为一个想要作弊的成员 f,我想要控制结果,就得在公布 Rf 前取得其余的 Ri (这样就能预知 ∑Ri ,设定特殊的 Rf 使结果变得对我有利)。但由于我必须在第4步公布 Hash(Ri) ,这就使得我无法在知道其他其余 Ri 后改变 Rf

实际上的一个月前的事了,这两天没课闲着蛋疼才贴出来,免得被人喷不更新..

编辑于 2016-01-04,修正一处 typo,感谢缺梦。

]]>
/p/p2p-lucky-draw/feed/ 0