探讨: 有一个投票站点,做的比较变态,谁来挑战一下(纯粹探讨,无其他目的)

godlessme 2009-01-07 04:12:05

这是投票地址: http://app.zsnews.cn/Top10Citizen/2008/Redirect.asp

这个网站为了防止刷票,真是费尽了心思:

1、需要输入姓名和身份证 (但可以伪造);

2、姓名、身份证、验证码 ,还有 提交 按钮,封装成了一个ActiveX 控件,要投票,必须装控件;

3、输入框一定要用鼠标点击一下,才可以输入; (伪造了鼠标点击事件)

4、身份证输入框和验证码输入框禁止复制粘贴; (伪造键盘事件,将事先准备好的 身份证和验证码逐个字符输入)

5、验证码不是从服务器获取的,而是在本地的ActiveX控件生成的; (我用截屏将验证码那一小块保存为bmp,然后再识别出来)

6、如果以上都搞定了,你就以为可以投票的话,那你就错了。继续往下看:

7、一个IP地址3分钟内只能投一票,如果你投了一票,然后改了IP地址(通常是用ADSL断开重连来换IP地址),会提示你“检测到IP地址被非法篡改,不能投票”,
根据我的分析,它可能在第一次投票时候将你的IP地址记录下来,第二次投票时候如果IP地址变了,就说明你有刷票嫌疑,就不给投了; (未搞定)

8、每台机器限制了只能投 50 票; (未搞定)


这个投票9号就到期了,所以即便做出来刷票机也没什么意义了,但很想和大家探讨一下技术问题。
...全文
365 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
kazi21com 2009-01-09
  • 打赏
  • 举报
回复
人海战术有可能 我们学校为了刷票 停了全校的课 一天 叫我们去学校机房刷票 那个网站投票IP可以重复
就是有验证码 我们学校很垃圾 所以没人写出自动投票的程序 学校一个搞DELPHI的老师 只会数据库 其他的不搞
godlessme 2009-01-08
  • 打赏
  • 举报
回复
楼上的说的没错,我是这么处理这个问题的。已经搞定。
godlessme 2009-01-08
  • 打赏
  • 举报
回复
NO NO NO

你用本人网名在网上搜索便知绝对不是。嘿嘿,本人的网名可以绝对独一无二的。

这次是有个朋友要帮忙,咱也想趁此机会展下身手,让朋友知道咱还会那么点技术。

谁知…………

总之,天外有天,人外有人,还是要继续修炼技术。

PS: 现在对那个能刷票的朋友佩服的五体投地, 真希望能向他讨教讨教。
hsower 2009-01-08
  • 打赏
  • 举报
回复
即使能够分析到验证码也没有用,因为官网ActiveX控件已经更新了,验证码的第5位是在前4位输入正确的情况下才显示出来,除非你此时再截一次图,再分析一次验证码,再模拟输入....
hsower 2009-01-08
  • 打赏
  • 举报
回复
楼上的,Post的数据已经加密了,除非你能模拟出正确的加密数据,提交到投票服务器,才能达到刷票的目的.
但是你抓包看看ActiveX加密后的数据,要解密太困难了.
kenlewis 2009-01-08
  • 打赏
  • 举报
回复
既然所有的判断都是在本地ActiveX上进行的,那我们只需要抓取网络的发送与接收包,分析其中的格式,向服务器发假数据包就可以了。这样可以绕开验证码,IP校验等。
godlessme 2009-01-08
  • 打赏
  • 举报
回复
这个问题不难解决,用抓屏,但实际应用中比较麻烦,

首先,分辨率要固定;

其次,显示效果要统一,如颜色质量都用32真彩,如果有机器用了16位的就不行了;

还有,在“外观”--“效果”--平滑字体边缘的选项 也要统一;

最后,要保证验证码每次都出现在相同的位置,这个也容易,只要每次都将浏览器的滚动条拖到最下面即可。

zsrobin 2009-01-08
  • 打赏
  • 举报
回复
谢谢楼上的朋友,问题是它的验证码是捆绑在ACTIVEX上的,而非图片验证码。获取验证码的区域比较麻烦。
hsower 2009-01-08
  • 打赏
  • 举报
回复
楼主不要灰心,有人在刷票,极有可能是人海战术...搜了一下,有专门的公司搞人海战术的.

呵呵...我在怀疑楼主会不会是这些公司的技术员?
godlessme 2009-01-08
  • 打赏
  • 举报
回复

呵呵,但我们正在这讨论的时候,正有人在疯狂的刷票呢。

不知道是何方高手。 惭愧啊。



识别验证码那个,其实很简单。这种验证码是最最简单的了,没有变形,没有加入干扰线,而且只有数字。
原理很简单,没啥技术含量,代码我贴出来在下面:


unit GetTokenCode;

interface

///验证码分析;
/// 由五位组成,每位的宽度为12像素,高度19像素,两个数字之间间隔3个像素
/// 在开发的时候,发现数字出现在不同位置时,显示效果不完全一样,
/// 因此将最后一行、最后一列像素去掉不做比较 ,经测试,成功率100%

uses
Windows, Graphics;

type
TNumberMatrix = array [0..17, 0..10] of byte;

// 9个数字的特征
var
num0: TNumberMatrix = ((0,0,0,0,1,1,1,1,1,0,0),
(0,0,0,1,1,1,1,1,1,1,1),
(0,0,1,1,1,0,0,0,1,1,1),
(0,1,1,1,0,0,0,0,0,1,1),
(0,1,1,1,0,0,0,0,0,1,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(1,1,1,0,0,0,0,0,0,0,1),
(0,1,1,1,0,0,0,0,0,1,1),
(0,1,1,1,0,0,0,0,0,1,1),
(0,0,1,1,1,0,0,0,1,1,1),
(0,0,0,1,1,1,1,1,1,1,1));

//1 到 8 的省略了

num9: TNumberMatrix = ((0,0,0,1,1,1,1,1,0,0,0),
(0,1,1,1,1,1,1,1,1,0,0),
(0,1,1,1,0,0,0,1,1,1,0),
(1,1,1,0,0,0,0,1,1,1,0),
(1,1,1,0,0,0,0,0,1,1,0),
(1,1,1,0,0,0,0,0,1,1,1),
(1,1,1,0,0,0,0,0,1,1,1),
(1,1,1,0,0,0,0,0,1,1,1),
(1,1,1,0,0,0,0,0,1,1,1),
(0,1,1,1,0,0,0,1,1,1,1),
(0,1,1,1,1,1,1,1,1,1,1),
(0,0,1,1,1,1,0,0,1,1,1),
(0,0,0,0,0,0,0,0,1,1,1),
(0,0,0,0,0,0,0,0,1,1,1),
(1,1,1,0,0,0,0,1,1,1,0),
(1,1,1,0,0,0,0,1,1,1,0),
(0,1,1,1,0,0,1,1,1,0,0),
(0,1,1,1,1,1,1,1,0,0,0));



function IsSpecialNumber(const NumberMatrix, DestNumberMatrix: TNumberMatrix): boolean; //判断两个 TNumberMatrix 是否相等
function MatrixToNumber(NumberMatrix: TNumberMatrix): string; //根据传入的 TNumberMatrix,返回对应的数字
function BitmapToNumber(Bitmap: TBitmap): string; //将图片转换成数字字符串

implementation

function IsSpecialNumber(const NumberMatrix, DestNumberMatrix: TNumberMatrix): boolean; //判断两个 TNumberMatrix 是否相等
var
i, j: integer;
begin
Result := False;
try
if Length(NumberMatrix) = 0 then
Exit;

if Length(NumberMatrix[0]) = 0 then
Exit;

for i := 0 to Length(NumberMatrix) - 1 do
begin
for j := 0 to Length(NumberMatrix[0]) - 1 do
begin
if NumberMatrix[i, j] <> DestNumberMatrix[i, j] then
Exit;
end;
end;
except
Exit;
end;

Result := True;
end;

function MatrixToNumber(NumberMatrix: TNumberMatrix): string; //根据传入的 TNumberMatrix,返回对应的数字
var
i, j: integer;
begin
Result := '';
if IsSpecialNumber(NumberMatrix, num0) then Result := '0';
if IsSpecialNumber(NumberMatrix, num1) then Result := '1';
if IsSpecialNumber(NumberMatrix, num2) then Result := '2';
if IsSpecialNumber(NumberMatrix, num3) then Result := '3';
if IsSpecialNumber(NumberMatrix, num4) then Result := '4';
if IsSpecialNumber(NumberMatrix, num5) then Result := '5';
if IsSpecialNumber(NumberMatrix, num6) then Result := '6';
if IsSpecialNumber(NumberMatrix, num7) then Result := '7';
if IsSpecialNumber(NumberMatrix, num8) then Result := '8';
if IsSpecialNumber(NumberMatrix, num9) then Result := '9';
end;


function BitmapToNumber(Bitmap: TBitmap): string; //将图片转换成数字字符串
var
numMatrix1, numMatrix2, numMatrix3, numMatrix4, numMatrix5: TNumberMatrix;
i, j, m, n: integer;
begin
for i := 0 to Bitmap.Height - 2 do //最后一行不要了
begin
for j := 0 to Bitmap.Width - 1 do
begin
m := Bitmap.Canvas.Pixels[j, i];
if m = $00000000 then
m := 1
else
m := 0;

if (j >= 0) and (j <= 10) then //每个数字的最后一列也不要了
numMatrix1[i, j] := m;
if (j >= 15) and (j <= 25) then
numMatrix2[i, j - 15] := m;
if (j >= 30) and (j <= 40) then
numMatrix3[i, j - 30] := m;
if (j >= 45) and (j <= 55) then
numMatrix4[i, j - 45] := m;
if (j >= 60) and (j <= 70) then
numMatrix5[i, j - 60] := m;
end;
end;

Result := MatrixToNumber(numMatrix1) + MatrixToNumber(numMatrix2) + MatrixToNumber(numMatrix3) + MatrixToNumber(numMatrix4) + MatrixToNumber(numMatrix5);
end;

end.
hsower 2009-01-08
  • 打赏
  • 举报
回复
呵呵...故布疑阵,有意思...
imho888 2009-01-08
  • 打赏
  • 举报
回复
强,这种加密数据上传到服务器方式很难解
godlessme 2009-01-08
  • 打赏
  • 举报
回复

郁闷啊, 看着有人正在刷票, 我却一直找不到解决方法。
zsrobin 2009-01-08
  • 打赏
  • 举报
回复
厉害,中山市中山网这个小地方还有如此高手。
beifangke 2009-01-08
  • 打赏
  • 举报
回复
厉害
godlessme 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hyryxgs 的回复:]
我花了10分钟,就搞定啦,用winsock连接61.142.80.242这个IP的确80端口,然后发送下面的数据就可以给前面10位的侯选人各投一票啦.
注意数据结尾处要加两个回车符啊.

[/Quote]


你说这个方法是我最开始尝试的,但不同的是,我抓到的数据是提交到 kaje_rt4kaey4.asp ,而不是 mnbvc_2u2iop4d.asp 。

当时,在向 kaje_rt4kaey4.asp 提交数据时,会提示说 非法投票。


现在,我按照你的说法提交数据,每次都返回“1,投票成功”,但实际的票数没有增加。

我估计是这个 zsnews 故布疑阵,糊弄我们。
starluck 2009-01-08
  • 打赏
  • 举报
回复
kazi21com 2009-01-08
  • 打赏
  • 举报
回复
楼主有识别验证码的原代码吗 可以传份给我参考下不? 156710661@qq.com
hyryxgs 2009-01-08
  • 打赏
  • 举报
回复
用ActiveX控件的好处谁也知道,我的意思是在Activex控件的基础上,再对通信进行加密就很难破解了.

模拟鼠标键盘操作容易,如果用变形后汉字做验证码,分析验证码几乎是不可能的吧?如果那样与其去破解验证码不如去破解通信的数据好了.
如果用SSL通信的话,就抓不到包了.
hsower 2009-01-08
  • 打赏
  • 举报
回复
ActiveX控件的好处在于程序是非公开的(不像Js可以被任意查看),客户机运行可以获取MAC地址提交至服务器数据库用于重复性投票验证,这些似乎除了ActiveX外,没有其他什么好的办法实现.
加载更多回复(21)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧