Giter Site home page Giter Site logo

easydrcom's People

Contributors

bryant1410 avatar coverxit avatar mylight avatar swimmingtiger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easydrcom's Issues

关于EasyDrcom登陆问题的一点疑问

目前在我自己的宿舍中把EasyDrcom装在OpenWrt中使用,有个小问题,就是登陆成功后发送心跳包失败:

........
[EAP Info] Logoff.
[EAP Info] Logoff.
[EAP Info] Start.
[EAP Info] Gateway returns: Request, Identity
[EAP Info] Response, Identity.
[EAP Info] Gateway returns: Request, MD5-Challenge EAP
[EAP Info] Response, MD5-Challenge EAP.
[EAP Info] Gateway returns: Success

但是接着发送心跳包就失败了:

Send Alive Packet 1.
Send Alive Packet 1: select: timeout
Failed to perform Send Alive Packet 1, retry times = 1
Try to perform Send Alive Packet 1 after 2 seconds.
Send Alive Packet 1: select: timeout
........

我的解决办法是,在它登陆成功之后([EAP Info] Gateway returns: Success),立即把它关掉,然后就没什么问题了。我的问题是,1) 为什么不需要发送心跳包也能保持在线?

但是这个方法不太通用,在我隔壁的宿舍,经常出现登陆不成功:

.......
[EAP Info] Logoff.
[EAP Info] Logoff.
[EAP Info] Start.
[EAP Error] Start: pcap_next_ex: timeout.
[EAP Error] Failed to perform Start, retry times=1
[EAP Info] Try to perform Start after 2 seconds.
[EAP Error] Start: pcap_next_ex: timeout
[EAP Info] Failed to perform Start, retry times = 2
[EAP Info] Try to perform Start after 2 seconds.
[EAP Info] Gateway returns: Request, Identity
[EAP Error] Failed to perform Start, stopped
[EasyDrcom Info] Connection broken, try to redial after 5 seconds.
[EAP Info] Logoff
[EAP Info] Logoff
[EAP Info] Start
.....

而且即使登陆成功了(如第一种情况一样),也会出现十分钟掉一次线的情况。2) 这种情况难道是因为发送心跳包失败导致的?但是为什么在第一种情况中不需要发送心跳包也能保持在线?

由于本人对802.1x这个协议不是很熟悉,所以发现这些问题都无法一一解答,希望大家可以帮助一下。

3)最后一个问题是,配置文件EasyDrcom.conf中的认证服务器IP地址需不需要改?目前我保持着默认的 172.25,8.4,配置文件中也只是改了UserName和PassWord,但是我还是觉得认证服务器这些应该根据不同情况进行相对应的改变,不知道对不对?

在路由器内自动启动失败

ssh登录后手动运行可以认证成功,并运行很好
但是加入启动脚本自动启动后,会出现获取不到ip地址的问题,log如下(账号和密码我删了)

2015-10-11 02:49:24 [EasyDrcom Info] EasyDrcom v0.7 for OpenWrt (mips AR7xxx/9xxx) (build on May 13 2014 12:43:32), Code by Shindo.

2015-10-11 02:49:24 [EasyDrcom Info] Initializing...
2015-10-11 02:49:24 [EasyDrcom Info] Loading config from '/root/EasyDrcom.conf'...
2015-10-11 02:49:24 [EasyDrcom Debug] General.UserName = XXXX, General.PassWord = XXXX, General.Mode = 1
2015-10-11 02:49:24 [EasyDrcom Debug] General.AutoOnline = True, General.AutoRedial = True
2015-10-11 02:49:24 [EasyDrcom Debug] Remote.IP:Port = 192.168.211.3:61440, Remote.UseBroadcast = True
2015-10-11 02:49:24 [EasyDrcom Debug] Local.NIC = eth0, Local.HostName = EasyDrcom for HITwh, Local.KernelVersion = 0.7_mips_AR7xxx_AR9xxxx
2015-10-11 02:49:24 [EasyDrcom Debug] Local.EAPTimeout = 1000, Local.UDPTimeout = 2000
2015-10-11 02:49:24 [EasyDrcom Error] Failed to fetch NIC info - get_ip_address: NIC 'eth0' not found.

U29通讯协议移植需要抓包数据中的哪些要素?

产品版本:5.2.0.201204251.A.W.100030
主模块:5.2.0.201204250.A.W.100029
通讯模块:0.8(U29.R110908)(1x)Build(k10.20120411)
升级模块:5.2.0.201204250.A.W.100029
检测模块:5.2.0.201204250.A.W.100029
网际协议:IPV4
认证/封装方式:802.1X_Ext / 不封装防代理
内网认证:已禁用

客户端情况如上。我校比较特别……用上5.2.0了然而还是U29的协议。请问该着重侦听哪些信息?

D版可以用么

我们学校的Dr客户端版本是5.2.0 D版,不知道能不能用

新发现:心跳包7-10字节的含义及“发送心跳包失败”的解决方法

v1.7 版本的 EasyDrcomGUI 在我校无法正常运行,在修改心跳服务器地址为我校的172.16.192.111之后,程序会发送无数个心跳包(send_alive_pkt1)导致栈溢出而崩溃。

我抓包对比了程序发送的心跳包(send_alive_pkt1)和原生客户端的区别,发现了第7第8字节是不同的。程序将其设置为 { 0x1F, 0x00 },而原生客户端发送的是 { 0xdc, 0x02 },并且从服务器端返回的 7-8 字节也是 { 0xdc, 0x02 }。

我将这两个字节改为 { 0xdc, 0x02 },然后原本会发送无数次心跳包的客户端就顺利的连上了。所以我想,这两个字节应该类似于协议的版本号,客户端必须和服务器一致才能使服务器接受该心跳包。

我仔细的观察原生客户端的心跳包,发现它是这么处理的:首先用自己的两个字节填充心跳包的 7-8 字节,然后发送给服务器,从服务器接收到一个拒绝包(就是“Received 'Misc, File'”)。然后从拒绝包中读出服务器的版本号,填充到 7-8 字节,再发一个相同的心跳包,然后服务器就接受了。

顺便我还发现了 9-10 字节的作用,就是一个校验串,客户端填充了什么服务器就原样返回。

我模仿了填充心跳包版本号的过程,程序工作的很好,估计能够适应不同学校的网络环境了。我顺便还把心跳服务器的地址端口等信息放进了配置文件里。版本库在这里:https://github.com/SwimmingTiger/EasyDrcomGUI/

贴出改进后的 drcom_dealer_u62.hpp (原谅我使用tab导致的不对齐,它们在VS中看起来是一样的╮(╯▽╰)╭)

class drcom_dealer_u62 : public drcom_dealer_base {
private:
    unsigned char version_id[2] = { 0x00, 0x00 }; //协议版本号(不需要与服务器端一致,程序会自动侦测服务器端版本号)
public:
    ......
    int send_alive_pkt1(int retry_times = 0)
    {
        U62_LOG_INFO("Send Alive Packet 1." << std::endl);

        std::vector<uint8_t> pkt_data;
        pkt_data.push_back(0x07); // Code
        pkt_data.push_back(pkt_id);
        pkt_data.insert(pkt_data.end(), { 0x28, 0x00 }); // Type
        pkt_data.insert(pkt_data.end(), { 0x0B, 0x01 }); // Step
        pkt_data.insert(pkt_data.end(), { version_id[0], version_id[1] }); // 可认为是协议版本号,若和服务器端的不一致则认证失败
        pkt_data.insert(pkt_data.end(), { 0x12, 0x34 }); // 随机码,服务器的响应中会包含同样的内容
        pkt_data.insert(pkt_data.end(), { 0x00, 0x00, 0x00, 0x00 }); // some time
        pkt_data.insert(pkt_data.end(), { 0x00, 0x00 }); // Fixed Unknown

        // some flux
        pkt_data.insert(pkt_data.end(), 4, 0x00);
        memcpy(&pkt_data[16], &misc1_flux, 4);

        pkt_data.insert(pkt_data.end(), 8, 0x00); // Fixed Unknown, 0x00 *8
        pkt_data.insert(pkt_data.end(), { 0x00, 0x00, 0x00, 0x00 }); // Client IP (Fixed: 0.0.0.0)
        pkt_data.insert(pkt_data.end(), 8, 0x00); // Fixed Unknown, 0x00 *8

        U62_LOG_SEND_DUMP

        auto handler_success = [&](std::vector<uint8_t> recv) -> int {
            U62_LOG_RECV_DUMP("Alive Packet 1");

            if (recv[0] != 0x07) // Misc
                return -1;

            if (recv[5] == 0x06) // File
            {
                U62_LOG_INFO("Received 'Misc, File', Send Keep Alive Packet 1 again." << std::endl);

                //复制服务器的协议版本号
                version_id[0] = recv[6];
                version_id[1] = recv[7];

                //递归调用太多次会导致程序崩溃,因此加了限制
                if (retry_times < 10) {
                    return send_alive_pkt1(retry_times + 1);
                }
                else {
                    U62_LOG_INFO("Send Too Many Keep Alive Packets!" << std::endl);
                    return -1;
                }

            }
            else
            {
                U62_LOG_INFO("Gateway return: Response for Alive Packet 1." << std::endl);

                pkt_id++;
                U62_LOG_DBG("next packet id = " << (int) pkt_id << std::endl);

                memcpy(&misc3_flux, &recv[16], 4);
                return 0;
            }
        };

        U62_HANDLE_ERROR("Send Alive Packet 1");
        U62_PERFORM("Send Alive Packet 1");
    }

    int send_alive_pkt2()
    {
        U62_LOG_INFO("Send Alive Packet 2." << std::endl);

        std::vector<uint8_t> pkt_data;
        pkt_data.push_back(0x07); // Code
        pkt_data.push_back(pkt_id);
        pkt_data.insert(pkt_data.end(), { 0x28, 0x00 }); // Type
        pkt_data.insert(pkt_data.end(), { 0x0B, 0x03 }); // Step
        pkt_data.insert(pkt_data.end(), { version_id[0], version_id[1] }); // 可认为是协议版本号,若和服务器端的不一致则认证失败
        pkt_data.insert(pkt_data.end(), { 0x43, 0x21 }); // 随机码,服务器的响应中会包含同样的内容
        pkt_data.insert(pkt_data.end(), { 0x00, 0x00, 0x00, 0x00 }); // some time
        pkt_data.insert(pkt_data.end(), { 0x00, 0x00 }); // Fixed Unknown

        // some flux
        pkt_data.insert(pkt_data.end(), 4, 0x00);
        memcpy(&pkt_data[16], &misc3_flux, 4);

        pkt_data.insert(pkt_data.end(), 8, 0x00); // Fixed Unknown, 0x00 *8
        pkt_data.insert(pkt_data.end(), local_ip.begin(), local_ip.end()); // Client IP
        pkt_data.insert(pkt_data.end(), 8, 0x00); // Fixed Unknown, 0x00 *8

        U62_LOG_SEND_DUMP

        auto handler_success = [&](std::vector<uint8_t> recv) -> int {
            U62_LOG_RECV_DUMP("Alive Packet 2");

            if (recv[0] != 0x07 && recv[5] != 0x04) // Misc 4
                return -1;

            U62_LOG_INFO("Gateway return: Response for Alive Packet 2." << std::endl);

            pkt_id++;
            U62_LOG_DBG("next packet id = " << (int) pkt_id << std::endl);

            memcpy(&misc1_flux, &recv[16], 4);
            return 0;
        };

        U62_HANDLE_ERROR("Send Alive Packet 2");
        U62_PERFORM("Send Alive Packet 2");
}
......

drcom_dealer_u31.hpp 做了同样的改进后也工作良好。

此外,吐槽一下 Drcom 的心跳服务器:

2016-10-14 11:18:27 [U62 Debug] Received after Alive Packet 1, dump:
00000000: 07 00 10 01 0b 06 dc 02  12 34 00 00 00 00 00 00  .........4......
00000010: a8 a8 00 00 e6 59 f1 67  00 00 00 00 dc 02 00 00  .....Y.g........
00000020: 4d 5a 90 00 03 00 00 00  04 00 00 00 ff ff 00 00  MZ..............
00000030: b8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  ........@.......
00000040: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
00000050: 00 00 00 00 00 00 00 00  00 00 00 00 08 01 00 00  ................
00000060: 0e 1f ba 0e 00 b4 09 cd  21 b8 01 4c cd 21 54 68  ........!..L.!Th
00000070: 69 73 20 70 72 6f 67 72  61 6d 20 63 61 6e 6e 6f  is program canno
00000080: 74 20 62 65 20 72 75 6e  20 69 6e 20 44 4f 53 20  t be run in DOS 
00000090: 6d 6f 64 65 2e 0d 0d 0a  24 00 00 00 00 00 00 00  mode....$.......
000000a0: 7c c3 83 5a 38 a2 ed 09  38 a2 ed 09 38 a2 ed 09  |..Z8...8...8...
000000b0: 61 81 fe 09 3a a2 ed 09  43 be e1 09 39 a2 ed 09  a...:...C...9...
000000c0: bb aa b0 09 32 a2 ed 09  bb be e3 09 3a a2 ed 09  ....2.......:...
000000d0: 57 bd e6 09 39 a2 ed 09  57 bd e7 09 3d a2 ed 09  W...9...W...=...
000000e0: 57 bd e9 09 3a a2 ed 09  38 a2 ec 09 81 a2 ed 09  W...:...8.......
000000f0: 0e 84 e9 09 3b a2 ed 09  0e 84 e6 09 30 a2 ed 09  ....;.......0...
00000100: ff a4 eb 09 39 a2 ed 09  c7 82 e9 09 3b a2 ed 09  ....9.......;...

MZ ... This program cannot be run in DOS mode ...
这么大大的一个PE结构体就这么发过来了。分明是发生了内存泄漏。
还有,操作系统无疑是 Windows。

关于登上一会就掉线心跳不正常的问题

在我们学校用了同学你的easydcom能够登上一会但是很快就会掉线。一开始提示
Received 'Misc, File', Send Keep Alive Packet 1 again.
自己根据抓的心跳包稍作修改后可以正常发送
Alive Packet 1,Alive Packet 2,alive request()。虽然程序正常发送接收但是仍然掉线,不清楚什么地方的原因。
这是我们的正常心跳
1
millisecond是什么
2
还有这个找不到规律

发了一份心跳到你的邮箱麻烦帮看一下,谢谢,。

请求指导修改drcom认证支持0.8(U62.R110908)(1x)Build(k36.20150515) 谢谢

请求程序猿大神指导一下如何修改支持以下拨号器:

产品版本:5.2.1.201507101.A.W.100440
主模块:5.2.1.201506110.A.W.100440
通讯模块:0.8(U62.R110908)(1x)Build(k36.20150515)
升级模块:5.2.1.201506110.A.W.100440
检测模块:5.2.1.201506110.A.W.100440
网际协议:IPV4
认证/封装方式:802.1X_Ext / 不封装防代理
内网认证:已禁用

有关抓包文件以及可用的拨号器请移步百度云下载
链接: http://pan.baidu.com/s/1bodKSVH
提取密码: r5b1

现在的问题是,可以过1x(我自己写了拨号器,可以过1x),但是无法过drcom认证。
用EasyDrcomGUI版本在win10x64下测试家属区模式,提示失败。

请大大指导如何修改,谢谢!万分感激!

代码结构及资源管理问题

main函数中如果使用background模式的话会产生两次线程调用,导致登录过程非常慢,而且占用额外内存。
使用的shared_ptr无法及时释放,导致在openwrt上运行时必须要重启进程才能解决认证服务器超时的问题。使用传统指针则可以正常的释放资源,不过有的时候还是得重启进程。

ARMhf v6设备 网卡获取不了

我现在编译了最新版……但是看了log发现居然不能找到网卡
编译是DLINUX标准编译
错误如Failed to fetch NIC info - get_ip_adress: NIC eth0 not found

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.