由于原作者没时间管了,C#的客户端源码就公布于世吧,计算机系有部分童鞋喜欢C#,你们可以拿去研究。

点我下载源码

里面已经添加验证码识别功能。

有需要的可以去试试下载

依旧是采用winpcap的EAP包进行认证,需要提前安装好winpcap4.1.3

blob.png

下面是部分代码:

                this.Icon = Properties.Resources.KJB_128;
                notifyIcon1.Icon = Properties.Resources.KJB_128;
                int FileCount = 0;
                DirectoryInfo Dir = new DirectoryInfo(System.Environment.CurrentDirectory);
                foreach (FileInfo FI in Dir.GetFiles())
                {
                    if (System.IO.Path.GetExtension(FI.Name) == ".ini")
                    {
                        FileCount = 1; break;
                    }                    
                }
                if (FileCount == 0)
                {
                    string Current;
                    Current = Application.StartupPath + "\\";//获取当前根目录
                    ini ini = new ini(Current + "config.ini");
                    ini.writeini("Setting", "key", "false");
                    ini.writeini("Setting", "key1", "false");
                }
                if (FileCount == 1)
                {
                    string Current;
                    Current = Application.StartupPath + "\\";//获取当前根目录
                    ini ini = new ini(Current + "config.ini");
                    string user = ini.readini("Setting", "user");
                    string psw = ini.readini("Setting", "psw");
                    autogo= ini.readini("Setting", "key1");
                    textBox1.Text = user;
                    textBox2.Text = Security.DecryptDES(psw, "ABCD1234");
                    string WEBuser = ini.readini("Setting", "WEBuser");
                    string WEBpsw = ini.readini("Setting", "WEBpsw");
                    string stemp2 = ini.readini("Setting", "key");
                    string stemp3 = ini.readini("Setting", "key1");
                    textBox5.Text = WEBuser;
                    textBox4.Text = Security.DecryptDES(WEBpsw, "ABCD1234");
                    checkBox2.Checked = Convert.ToBoolean(stemp2);
                    checkBox1.Checked = Convert.ToBoolean(stemp3);
                }
                if (checkBox2.Checked == true)
                {
                    panel2.Location = new Point(8, 238);
                }
                else { this.Height = this.Height - 65; panel2.Location = new Point(8, 176); textBox3.Height = 190; }
                label9.Text = "离线";
                classInstance = new ManagementClass("Win32_NetworkAdapterConfiguration");
                objectCollection = classInstance.GetInstances();
                devices = DeviceList.getalldevice(out errorbuf);
                List<string> network_name = getnetworkname();
                
                if (network_name.Count == 0)
                {
                    MessageBox.Show("检测不到网卡?");
                }
                else
                {
                    foreach (string d in network_name)
                    {
                        comboBox1.Items.Add(d);
                    }
                    comboBox1.SelectedIndex = bijiao();
                }
                if (autogo == "true") 
                {
                    button1_Click(sender, e); ; 
                }

以上是winform加载代码

认证过程如下:

            FlushClient fc = new FlushClient(textbox3add);
            FlushClient fc2 = new FlushClient(xiaohua);
            FlushClient1 fc1 = new FlushClient1(xiaxian);
            FlushClient fc3 = new FlushClient(lab);
            device.setfilter("(ether proto 0x888e) and (ether dst host " + mac_string + ")", out errorbuf);
            t4 = new Thread(new ThreadStart(ceshi));
            this.Invoke(fc, "发送START包...");
            this.Invoke(fc3, "认证中...");
            this.notifyIcon1.ShowBalloonTip(1000, "", "开始认证", ToolTipIcon.Info);
            byte[] EAP_start = eap.getEAP_start(mac);
            device.sendpacket(EAP_start, out errorbuf);
            while (true)
            {
                byte[] packet = device.getpacketnext(out errorbuf);
                if (packet != null)
                {
                    if (packet[15] == 0x00)
                    {
                        if (packet[18] == 0x01)
                        {
                            if (packet[22] == 0x01)
                            {
                                this.Invoke(fc, "发送Identity包...");
                                // MessageBox.Show("mac:"+mac.ToString() + "----packet:" + packet.ToString()+ "----username:" +username.ToString()+ "----password:" +password.ToString());
                                byte[] EAP_respone_identity = eap.getEAP_respone_identity(mac, packet, username, out errorbuf);
                                device.sendpacket(EAP_respone_identity, out errorbuf);
                            }
                            else if (packet[22] == 0x04)
                            {
                                this.Invoke(fc, "发送RESPONSE包...");
                                byte[] EAP_respone_md5_challenge = eap.getEAP_respone_md5_challenge(mac, packet, username, password);
                                device.sendpacket(EAP_respone_md5_challenge, out errorbuf);
                            }
                            else if (packet[22] == 0x02)
                            {
                                try
                                {
                                    byte[] n = new byte[packet.Length - 22];
                                    Array.Copy(packet, 23, n, 0, packet.Length - 22);
                                    this.Invoke(fc, "接收到系统发来的信息:" + System.Text.Encoding.Default.GetString(n) + "");                                    
                                }
                                catch (Exception e) { e.ToString(); }
                            }
                        }
                        else if (packet[18] == 0x03)
                        {
                            this.Invoke(fc, "认证成功");
                            getip();
                            success = 1;
                            this.Invoke(fc, "开始网页认证....\n");
                            getweb();
                            this.Invoke(fc2, "");
                        }
                        else if (packet[18] == 0x04)
                        {
                            byte[] n = new byte[packet.Length - 24];
                            Array.Copy(packet, 24, n, 0, packet.Length - 24);                            
                            this.Invoke(fc, "认证失败\r\n错误信息:" + System.Text.Encoding.Default.GetString(n));
                            MessageBox.Show("认证失败,请查看日志", "错误");
                            this.Invoke(fc1);       
                        }
                    } if (packet[15] == 0x03)
                    {
                        if (success == 1)
                        {
                            byte[] EAP_key2 = eap.getEAP_key2(mac, packet);
                            device.sendpacket(EAP_key2, out errorbuf);
                        }
                    }
                }
            }


然后重头戏,网页认证代码如下:

             int s = (int)DateTime.UtcNow.Subtract(DateTime.Parse("1970-1-1")).TotalSeconds;
            StringBuilder sb = new StringBuilder();
            // MessageBox.Show(s.ToString());
            System.Net.ServicePointManager.Expect100Continue = false;
            Uri uri = new Uri("http://125.88.59.131:10001/common/image.jsp?time=" + s.ToString());
            HttpWebRequest requeszt = (HttpWebRequest)HttpWebRequest.Create(uri);
            HttpWebResponse responsze = (HttpWebResponse)requeszt.GetResponse();
            string cookie = responsze.Headers["set-cookie"];
            Stream resStream = responsze.GetResponseStream();//得到验证码数据流
            Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片
            // sourcebm.Save(@"C:\test.gif");//可以保存到本地
            sourcebm = CutMap(sourcebm);
            Bitmap[] arrmap = SplitImg(sourcebm, 4, 1);
            string c = DrawCode(arrmap);
            string[] arrv = c.Split(new string[] { "=======" }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < arrv.Length; i++)
            {
                sb.Append(new Compar(arrv[i]).GetCode());
            }
            string yzm = sb.ToString();



            FlushClient fc = new FlushClient(textbox3add);
            FlushClient fc3 = new FlushClient(lab);
            string Current;
            Current = Application.StartupPath + "\\";//获取当前根目录
            ini ini = new ini(Current + "config.ini");
            string WEBuser = "";
            string WEBpsw = "";
            string stemp2 = ini.readini("Setting", "key");
            if (stemp2 == "true")
            {
                WEBuser = ini.readini("Setting", "WEBuser");
                WEBpsw = Security.DecryptDES(ini.readini("Setting", "WEBpsw"), "ABCD1234");

            } if (stemp2 == "false")
            {
                WEBuser = textBox1.Text;
                WEBpsw = textBox2.Text;

            }

            IPAddress[] arrIPAddresses = Dns.GetHostAddresses(Dns.GetHostName());
            string IPADD = "";
            foreach (IPAddress ip in arrIPAddresses)
            {
                if (ip.AddressFamily.Equals(AddressFamily.InterNetwork))
                {
                    if (ip.ToString().Substring(0, 2) == "10")
                    {
                        IPADD = ip.ToString(); break;
                    }
                }
            }
            string url = "http://125.88.59.131:10001/login.do?edubas=113.98.13.29&eduuser=" + IPADD + "&userName1=" + WEBuser + "&password1=" + WEBpsw+"&rand="+yzm;
            try{
                WebRequest request = WebRequest.Create(url);
                request.Headers.Add("Cookie", cookie);
 WebResponse rea = request.GetResponse();
            }catch (Exception e) { e.ToString(); }
            if (Ping() == true)
            {
                this.Invoke(fc, "网页认证成功\n");
                this.Invoke(fc3, "在线");
                this.notifyIcon1.ShowBalloonTip(1000, "", "网页认证成功", ToolTipIcon.Info);
                websuccess = 1;
                t4.Start(); //检测网页是否掉线线程启动
            }
            else
            {
                this.Invoke(fc, "http_timeout\n");
                this.notifyIcon1.ShowBalloonTip(1000, "", "网页认证超时", ToolTipIcon.Info);
                if (websuccess == 0) { getweb(); }
            }

我就不细化讲解了,对于重要部分已经在上面贴了出来。

各位程序猿慢慢研究~