c#破解验证码示例代码

深入解析数美滑块验证码破解:从抓包到实现(C#版) 数美滑块验证码是一种常见的安全验证方式,用于防止自动化脚本和机器人进行恶意操作。本文将详细介绍如何通过抓包获取滑块图片信息、分析加密参数、生成滑动轨迹等步骤,成功破解数美滑块验证码。在滑动滑块的过程中,我们需要分析加密参数。首先,进入数美滑块验证码的演示页面,进行抓包操作以获取滑块验证码的前景和背景图片。通过在浏览器中设置断点,我们可以找到参数aw等的生成函数,并确定这些参数的加密方式。滑动轨迹可以通过模拟人的滑动行为来生成,包括一些随机的抖动和速度变化。最后,结合前面的步骤,实现滑块破解。 阅读详情

来自:http://outofmemory.cn/code-snippet/2037/c-pojie-yanzhengma-example-code

验证码破解是一个很大的课题,也有很多种不同的方式,下面代码采用的方法是首先准备验证码图片的样本图片。然后将验证码图片做灰度处理,并根据字符间距切割验证码图片,最后将切割后的验证码小图和样本之间做余袨值比较,从而计算出验证码图片的字符。

如下是c#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;
using System.Configuration;

namespace ConsoleApplication4
{
    /// <summary>
    /// 根据样本做验证码破解
    /// 
    /// 需要在.config文件中的appSettings配置节中添加key为sampleOcr.sampleDir value设置为样本图片所在路径
    /// 验证码:https://investorservice.cfmmc.com/ https://investorservice.cfmmc.com/veriCode.do?t=1335521167762&ip=202.99.16.22
    /// 
    /// outofmemory.cn 20120427
    /// 100个样例准确数为88个,错误主要发生在389这三个字符的混淆上
    /// </summary>
    public abstract class SampleOcr
    {
        /// <summary>
        /// 灰度中间值
        /// </summary>
        static int MiddleGrayValue = 200;

        /// <summary>
        /// 分割图片的差异容忍度
        /// </summary>
        static int ColorToleranceForSplit = 30;

        /// <summary>
        /// 样本字典
        /// </summary>
        static Dictionary<string, Bitmap> _samples;

        /// <summary>
        /// 破解验证码
        /// </summary>
        /// <param name="bm">验证码图片</param>
        /// <returns>验证码文本</returns>
        public static string Ocr(Bitmap bm)
        {
            //做灰度处理
            GrayByPixels(bm);

            bm = RemoveVerticalSpaceRegion(bm);

            Bitmap[] splitBms = SplitBitmaps(bm);

            char[] result = new char[splitBms.Length];
            for (int i = 0; i < splitBms.Length; i++)
            {
                result[i] = OcrChar(splitBms[i]);
                splitBms[i].Dispose();
            }
            return new string(result);
        }

        /// <summary>
        /// 分割图片
        /// </summary>
        /// <param name="bm">图片</param>
        /// <returns>分割后的图片对象</returns>
        static Bitmap[] SplitBitmaps(Bitmap bm)
        {
            //找出垂直分割线
            List<int> removeXs = new List<int>();
            for (int x = 0; x < bm.Width; x++)
            {
                bool hasDiffPoint = false;
                Color color = Color.White;
                for (int y = 0; y < bm.Height; y++)
                {
                    if (y == 0)
                    {
                        color = bm.GetPixel(x, y);
                    }
                    else
                    {
                        Color currentColor = bm.GetPixel(x, y);
                        int diff = CalculateColorDifference(currentColor, color);
                        if (diff > ColorToleranceForSplit)
                        {
                            hasDiffPoint = true;
                            break;
                        }
                        // color = currentColor;
                    }
                }

                if (!hasDiffPoint)
                {
                    removeXs.Add(x);
                }
            }

            //根据空白区域,计算各个字符的位图          
            List<Rectangle> charRects = new List<Rectangle>();
            for (int i = 1; i < removeXs.Count; i++)
            {
                int diff = removeXs[i] - removeXs[i - 1];
                if (diff > 5)
                {
                    if (diff >= 20)
                    {
                        Rectangle rect = new Rectangle(removeXs[i - 1], 0, diff / 2, bm.Height);
                        charRects.Add(rect);

                        rect = new Rectangle(removeXs[i - 1] + diff / 2, 0, diff / 2, bm.Height);
                        charRects.Add(rect);
                    }
                    else
                    {
                        Rectangle rect = new Rectangle(removeXs[i - 1], 0, diff, bm.Height);
                        charRects.Add(rect);
                    }
                }
            }

            int count = charRects.Count;
            Bitmap[] charBms = new Bitmap[count];
            int charBmIndex = 0;
            foreach (Rectangle item in charRects)
            {
                Bitmap bmChar = bm.Clone(item, bm.PixelFormat);
                charBms[charBmIndex] = bmChar;
                charBmIndex += 1;
            }
            return charBms;
        }

        /// <summary>
        /// 解析字符
        /// </summary>
        /// <param name="bm">分割后的小图</param>
        /// <returns>字符</returns>
        static char OcrChar(Bitmap bm)
        {
            Dictionary<string, Bitmap> samples = LoadSamples();

            double diff = .0;
            string mayBe = null;
            foreach (string key in samples.Keys)
            {
                double diffRate = CalcImageDiffRate(samples[key], bm);
                if (diffRate == 1)
                    return key[0];

                if (diffRate > diff)
                {
                    mayBe = key;
                    diff = diffRate;
                }
            }

            if (mayBe == null) throw new ApplicationException();

            return mayBe[0];
        }

        /// <summary>
        /// 载入样本字典
        /// </summary>
        /// <returns>样本字典</returns>
        private static Dictionary<string, Bitmap> LoadSamples()
        {
            if (_samples == null)
            {
                _samples = new Dictionary<string, Bitmap>();
                string sampleDir = ConfigurationManager.AppSettings["sampleOcr.sampleDir"] ?? @"D:\SampleOcr\samples";
                DirectoryInfo dirInfo = new DirectoryInfo(sampleDir);
                FileInfo[] files = dirInfo.GetFiles("*.jpg");
                foreach (FileInfo item in files)
                {
                    Bitmap bm = (Bitmap)Bitmap.FromFile(item.FullName);
                    string key = Path.GetFileNameWithoutExtension(item.FullName);
                    _samples.Add(key, bm);
                }
            }

            return _samples;
        }

        /// <summary>
        /// 根据RGB,计算灰度值
        /// </summary>
        /// <param name="posClr">Color值</param>
        /// <returns>灰度值,整型</returns>
        static int GetGrayNumColor(System.Drawing.Color posClr)
        {
            return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16;
        }

        /// <summary>
        /// 灰度转换,逐点方式
        /// </summary>
        static void GrayByPixels(Bitmap bm)
        {
            for (int i = 0; i < bm.Height; i++)
            {
                for (int j = 0; j < bm.Width; j++)
                {
                    int tmpValue = GetGrayNumColor(bm.GetPixel(j, i));
                    bm.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));
                }
            }
        }

        /// <summary>
        /// 删除垂直方向上的空白区域
        /// </summary>
        /// <param name="bm">源图片</param>
        /// <returns>删除空白之后的图片</returns>
        static Bitmap RemoveVerticalSpaceRegion(Bitmap bm)
        {
            int topSpaceHeight = 0;
            for (int y = 0; y < bm.Height; y++)
            {
                bool hasDiffPoint = false;
                Color color = Color.White;
                for (int x = 0; x < bm.Width; x++)
                {
                    if (x == 0)
                    {
                        color = bm.GetPixel(x, y);
                    }
                    else
                    {
                        Color currentColor = bm.GetPixel(x, y);
                        int diff = CalculateColorDifference(currentColor, color);
                        if (diff > ColorToleranceForSplit)
                        {
                            hasDiffPoint = true;
                            break;
                        }
                    }
                }

                if (hasDiffPoint)
                {
                    break;
                }
                else
                {
                    topSpaceHeight += 1;
                }
            }

            int bottomSpaceHeight = 0;
            for (int y = bm.Height - 1; y > 0; y--)
            {
                bool hasDiffPoint = false;
                Color color = Color.White;
                for (int x = 0; x < bm.Width; x++)
                {
                    if (x == 0)
                    {
                        color = bm.GetPixel(x, y);
                    }
                    else
                    {
                        Color currentColor = bm.GetPixel(x, y);
                        int diff = CalculateColorDifference(currentColor, color);
                        if (diff > ColorToleranceForSplit)
                        {
                            hasDiffPoint = true;
                            break;
                        }
                        color = currentColor;
                    }
                }

                if (hasDiffPoint)
                {
                    break;
                }
                else
                {
                    bottomSpaceHeight += 1;
                }
            }

            Rectangle rectValid = new Rectangle(0, topSpaceHeight, bm.Width, bm.Height - topSpaceHeight - bottomSpaceHeight);
            Bitmap newBm = bm.Clone(rectValid, bm.PixelFormat);
            bm.Dispose();
            return newBm;
        }

        private static double CalcImageDiffRate(Bitmap bmSample, Bitmap bmCalc)
        {
            int[] eSample = new int[bmSample.Height];
            int[] eCalc = new int[bmSample.Height];
            for (int y = 0; y < bmSample.Height; y++)
            {
                eSample[y] = GetHorizontalValue(bmSample, y);
                eCalc[y] = GetHorizontalValue(bmCalc, y);
            }
            return GetCosine(eSample, eCalc);
        }

        /// <summary>
        /// 获得向量的cos值
        /// </summary>
        /// <param name="e1"></param>
        /// <param name="e2"></param>
        /// <returns></returns>
        static double GetCosine(int[] e1, int[] e2)
        {
            double fenzi = 0;
            for (int i = 0; i < e1.Length; i++)
            {
                fenzi += e1[i] * e2[i];
            }

            double fenmuLeft = 0;
            double fenmuRight = 0;
            for (int i = 0; i < e1.Length; i++)
            {
                fenmuLeft += e1[i] * e1[i];
                fenmuRight += e2[i] * e2[i];
            }

            double fenmu = Math.Sqrt(fenmuLeft) * Math.Sqrt(fenmuRight);
            if (fenmu == 0.0) return 0;

            return fenzi / fenmu;
        }

        /// <summary>
        /// 计算水平方向上的差异点数
        /// </summary>
        /// <param name="bm">位图</param>
        /// <param name="y">y坐标值</param>
        /// <returns>差异点数</returns>
        private static int GetHorizontalValue(Bitmap bm, int y)
        {
            if (y >= bm.Height) return 0;
            int val = 0;
            for (int x = 0; x < bm.Width; x++)
            {
                Color color = bm.GetPixel(x, y);

                int grayVal = GetColorGrayValue(color);
                if (grayVal > MiddleGrayValue)
                {
                    val |= (1 << x);
                }
            }
            return val;
        }

        static int GetColorGrayValue(Color color)
        {
            return (int)(.299 * color.R + .587 * color.G + .114 * color.B);
        }

        /// <summary>
        /// 计算颜色之间的差值,这个只是一个简单的计算,真正的色差计算很复杂
        /// </summary>
        /// <param name="colorA">A色</param>
        /// <param name="colorB">B色</param>
        /// <returns>差值</returns>
        static int CalculateColorDifference(Color colorA, Color colorB)
        {
            int diff = GetColorGrayValue(colorA) - GetColorGrayValue(colorB);
            return Math.Abs(diff);
        }
    }
}


 

使用C#破解极验滑动验证码的完整指南 极验验证码是一种常见的防爬虫机制,通过滑动拼图等方式验证用户的人机身份。在破解验证码之前,我们需要分析极验验证码在验证过程中发起的请求。通过请求ajax.php执行无感验证,如果验证失败,会返回滑块验证等其他类型的验证。w:这是一个加密过的数据,破解的核心就在于解密并伪造这个参数。通过请求get.php获取无感验证的参数,包括c和s。在C#中实现w参数的破解过程,包括生成u和h参数。有了w参数后,我们可以构造滑动验证的请求并发送。// 实现生成h参数的逻辑。最后,将u和h参数合并生成最终的w参数。 阅读详情

相关推荐

使用C#和Selenium破解滑动验证码

滑动验证码是一种常见的验证码形式,通过拖动滑块将缺失的拼图块对准原图中的空缺位置来验证用户操作。本文将介绍如何使用C#中的OpenCV进行模板匹配,并结合Selenium实现自动化破解滑动验证码的过程。通过生成一条模拟人类滑动的轨迹,并使用Selenium模拟滑动操作。使用OpenCV的模板匹配算法,计算滑块在背景图中的最佳匹配位置。编写C#代码,下载验证码的背景图和滑块图,并对图像进行预处理。使用OpenCV的模板匹配算法来确定滑块在背景图中的正确位置。生成模拟人类滑动的轨迹,避免被识别为机器人。

asfdsgdf的博客 1481

C#实现计算题验证码

使用C#生成一个运行在ASP.NET Core API的计算题验证码,前端可以用网页或者客户端输入

绿龙术士的专栏 899

c#破解验证码源码,收集到一个经典的破解验证码源码,供大家学习!

收集到一个经典的破解验证码源码,供大家学习!

C# 验证识别类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace 验证码处理 { c

RootSuper 3703

VeriCode解码Demo(C#)

通过调用官方提供的DLL函数接口进行解码识别,C#完整源代码,识别速度极快!填充版解码结果请查阅源代码说明。

验证码破解源码 C# MODI

采集,去噪,二值化,滤波,调用Tesseract OCR,识别返回结果; vs2008 c#速成版

C# 验证码案例(分析+图+代码)

验证码案例分析: * 1.先在窗体设置一个按钮,和一个接收验证码的容器 * 2.当点击按钮时,接收验证码 * 3.所以在按钮中添加出发 * 4.所以在按钮中添加,实现验证码,然后实现完放入验证码区 * 5.先定义一个空字符串用来储存,然后for循环四次,因为验证码是四个 * 6.用一个随即数变量,储存0.1.2用来if判断(三个if判断) * (1)当随即变量0时,进入判断给空每次加上随机的数字 ...

qq_44858151的博客 461

运用C#来实现破解验证码

文档介绍如何使用C#实现一般验证码破解(有源代码),是在IT168下载的,需要50金币,在此分享

验证码识别实践3:自己动手C#实现,颜色差异法去除干扰线

上一篇文章《C# 验证码识别实践2》 地址:http://blog.youkuaiyun.com/stevenkylelee/article/details/8270069 这是我第三篇验证码识别实践的总结文章。 花了几天时间专门做了这个验证码的识别 验证码地址: http://pay.m3guo.com/include/KeyCode.aspx 截图:

Siliphen Labs 2万+

C#图片验证码识别技术.zip

C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术 C#图片验证码识别技术

团子杂记:SAP收入确认工具RAR(Revenue Recognition&Reporting)在新收入准则下的应用

SAP收入确认工具RAR知识分享

Lucas1211的博客 4281

手机直播代码验证码随机字体,颜色以及大小

验证码的随机获取 Random p = new Random(); //获取随机字符 string zf = ""; for (int i = 0; i < 4; i++) { int type = p.Next(0, 3); i...

云豹网络科技 707

无网环境也能玩转DBeaver?手把手教你离线安装与ClickHouse连接(附实测jar包)

本文详细介绍了在无网环境下如何离线安装DBeaver并配置ClickHouse连接的完整指南。通过准备必备工具如DBeaver安装包、ClickHouse JDBC驱动及Maven本地仓库,确保在物理隔离环境中实现数据库管理。文章包含详细的安装步骤、驱动配置和性能优化建议,帮助开发者在严格网络限制下高效工作。

weixin_42635064的博客 374

验证码块

参考了一些例子做了个简单的生成验证码的类,代码如下 ValidateCode.cs1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Web;5usingSystem.Drawing;6usingSystem.IO;7usingSystem.Drawing.Im...

weixin_30678821的博客 101

TC3xx芯片SPI多从机通信避坑指南:AUTOSAR框架下的DMA配置与片选切换

本文针对英飞凌TC3xx芯片在AUTOSAR框架下实现SPI多从机通信的实战难题,提供了详尽的避坑指南。重点解析了如何利用硬件支持的16路片选(SLSO)灵活切换,在AUTOSAR中正确配置不同时序的从设备,并深入探讨了异步模式下DMA的启用条件与关键配置细节,帮助开发者规避通信失败风险,提升系统可靠性。

nn3456的博客 153

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 424

ASP.NET C# 验证码 支持中文 噪点 弯曲

///<summary> ///根据指定参数返回BitMap对象 ///引用如下: ///usingSystem.Drawing; ///调用例子如下: ///eg1、保存为图象文件为 ///BitmapsrBmp=srBitmap(srs)...

weixin_30732825的博客 219

你的Wi-Fi总断网?可能是DHCP租约到期惹的祸!手把手教你用Windows/路由器设置永久IP或延长租期

本文深入解析家庭Wi-Fi频繁断网的常见原因——DHCP租约到期问题,并提供Windows和路由器设置永久IP或延长租期的详细教程。通过对比静态IP配置与延长租期两种方案,帮助用户有效解决网络不稳定问题,特别适合游戏玩家和远程工作者优化家庭网络环境。

weixin_29305313的博客 1406

使用C#和Selenium库来自动破解极验验证码

首先,我们需要进行一些初始化工作,包括配置Selenium和设置参数。然后,使用Selenium库模拟浏览器对网页进行操作,首先模拟点击验证按钮。接着,获取验证码图片的位置和尺寸,并对网页进行截图和裁剪。如果验证不通过,则会弹出滑动验证窗口,需要拖动滑块以完成验证。通过以上C#和Selenium库的代码,我们可以自动破解极验验证码。通过模拟点击验证按钮、识别验证码图片位置和尺寸、以及模拟拖动滑块,我们可以完成验证码的破解。在这篇文章中,我们将使用C#和Selenium库来自动破解极验验证码。

asdsadgfd的博客 668

Detector-Free SfM 项目复现完整指南:从环境搭建到代码解析与可视化

本文提供了Detector-Free SfM项目的完整复现指南,涵盖技术背景、环境配置、代码解析和可视化方案。重点包括: 技术背景:Detector-Free SfM通过两阶段策略(粗重建+迭代精化)解决了传统SfM在弱纹理区域的瓶颈问题,采用深度学习匹配器替代传统特征点检测。 环境配置: 详细硬件要求与推荐配置(GPU/CPU/内存) 完整的Ubuntu系统设置步骤 Conda环境创建与依赖安装流程 关键组件安装指南(PyTorch、COLMAP等) 常见错误解决方案 项目特点: 支持多种Detector

huanghm88的专栏 120

FAA和EASA在机载电子硬件适航中的发展历史与差异

FAA和EASA在机载电子硬件的适航审查中虽然存在一些差异,但通过近年来的合作,这些差异正在逐步缩小。两者通过。

qq_41854911的博客 745

图形验证码的破解与设计

图形验证码设计目的是利用人脑的不可模拟性来防止机器自动识别.但是一个设计低级的图形验证码(可以被快速破解)除了增加网络流量以外没有任何意义.网上太多的"生成验证码"的教程把重点放在如何生成图片上,而实用性却几乎为零.生成图形本身是零基础技能,任何平台都提供内存图形环境和设备上下文(DC)让你操作,vc中的CDC,java/.NET中的Graphics,都提供比你需要的还要多的绘图API.可以说介绍

诗剑书生的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: c#使用XSLT将xml文档转换为html文档
下一篇: c#如何检测文本文件的编码
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值