fwrite(module, 10, 260, fp);
fwrite(module_weight, 10, 1, fp);
fclose(fp);
return 1;
}
int checkbmp(FILE* fd)
{
int x;
if(!fd)
return 0;
fread(&x, 1, sizeof(int), fd);
if(x!=0x083a4d42) return 0;
fseek(fd, -1, SEEK_END);
x = ftell(fd);
if(x+1!=0x083a)
return 0;
//以上是基本检查,其实可以检查更多的BMP头结构字段
rewind(fd);
fread(buf, 1, 0x083a, fd);
readmap();
return 1;
}
void checkdigit() //判断函数
{
int i,j,k;
unsigned char x;
for (i=0;i<4;i++)
{
diff = 0;
tmpdiff = 0xffffffff;
for (j=0;j<10;j++)
{
diff = 0;
for (k=0;k<260;k++)
{
x = module[j][k]>map[i][k] ?
(module[j][k]-map[i][k]) :
(map[i][k]-module[j][k]);
diff += x*x;
}//计算 Sigma ((x-m)^2)
if(diff{
value[i] = j;
tmpdiff = diff;
}
}//遍历完10个模板
}//4个数字全部解决
}
int study() //训练函数
{
int i,j;
for(i=0;i<4;i++)
{
if(module_weight[value[i]] != 0xff)
{
for(j=0;j<260;j++)
{
module[value[i]][j] += (map[i][j]>0xc0? 1:0 );
}
module_weight[value[i]]++; //又训练完一次
}
}
return 0;
}
int main(int argc, char** argv)
{
FILE* fd;
int i,ret ;
read_mod();
if(argc == 1)
fd = stdin;
if(argc > 1)
{
fd = fopen(argv[1],"rb");
if(!fd)
{
fprintf(stderr, "open file %s failed ", argv[2]);
return 0;
}
}
if(argc > 2) //后跟训练数字
{
for(i=0;i<4;i++)
{
value[i]=argv[2][i]-0x30;
if(value[i]>9 || value[i]<0)
{
fprintf(stderr, "wrong number %s ", argv[2]);
return 0;
}
}
checkbmp(fd);
ret = study();
write_mod();
return ret;
}
if(checkbmp(fd))
{
checkdigit();
outputvalue();
}
if(fd) fclose(fd);
return 1;
}
//----------------------------------------------------------------------------------------------------------------
这个程序维护和依赖一个模板文件digit.mod,如果只有一个参数,则认为是bmp文件名,根据模板文件判断其所代表的数字,例如
myocr 2110.bmp
如果有两个参数,则认为进入学习模式,根据argv[1]代表的bmp文件和argv[2]代表的数字,对模板文件digit.mod进行修改。例如
myocr 2110.bmp 2110
我写了一个bat文件执行所有的训练,多次训练结束后,digit.mod文件中所有的module_weight都变为0xff,就可以了。
以上是针对某个特定网站的图片识别程序,对其中的参数稍加调整就可以对很多这样的图片实现程序辨认。
结论:
纵观整个认证码技术体系,现在基本可以分为静态图片库技术和动态生成技术。
静态图片库方式的确可以通过强烈的变形技术防止程序识别,但太少的图片数目容易被穷举,而生成这样的图片库需要人工参与,否则难以保证可识别程度。所以代价偏高。
动态图片技术由于程序复杂度原因,并兼顾到可识别性,往往不能做到很好的变形甚至没有变形,这样给程序实现攻击提供了可乘之机,对这样的动态图片的攻击可以总结为一句话,“用程序生成的东西是很容易被程序辨认出来的。”
事实上图片认证技术对防止WEB机器人确实起到了一定的作用,但是由于其实现的局限性,并不能完全依赖这种技术保证网站的安全性。