void on_button_exit_clicked () { if (state == READY) on_program_quit(); else send_eap_packet (EAPOL_LOGOFF); }
int main(int argc, char **argv) { int ins_pid; init_arguments (&argc, &argv); //打开锁文件 lockfile = open (LOCKFILE, O_RDWR | O_CREAT , LOCKMODE); if (lockfile < 0){ perror ("Lockfile"); exit(EXIT_FAILURE); } if ( (ins_pid = program_running_check ()) ) { fprintf(stderr,"@@ERROR: zRuijie Already " "Running with PID %d\n", ins_pid); exit(EXIT_SUCCESS); } init_info(); init_device(); init_frames (); signal (SIGINT, signal_interrupted); signal (SIGTERM, signal_interrupted); signal (SIGALRM, signal_alarm); show_local_info(); send_eap_packet (EAPOL_START); alarm(5); pcap_loop (handle, -1, get_packet, NULL); /* main loop */ pcap_close (handle); return 0; }
static void signal_interrupted (int signo) { extern int exit_flag; if (exit_flag) exit (EXIT_SUCCESS); exit_flag = 1; fprintf(stdout,"\n&&Info: Interrupted. \n"); send_eap_packet(EAPOL_LOGOFF); }
void action_eap_req_md5_chg(const struct eap_header *eap_head, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { state = ID_AUTHED; fprintf(stdout, ">>Protocol: REQUEST MD5-Challenge(PASSWORD)\n"); fill_password_md5((uint8_t*)eap_head->eap_md5_challenge, eap_head->eap_id); eap_response_md5ch[0x13] = eap_head->eap_id; send_eap_packet(EAP_RESPONSE_MD5_CHALLENGE); }
void* keep_alive(void *arg) { while (1) { ruijie_int32_to_byte (eap_life_keeping + 0x18, htonl (ruijie_live_serial_num + ruijie_succes_key)); ruijie_int32_to_byte (eap_life_keeping + 0x22, htonl (ruijie_live_serial_num)); ++ruijie_live_serial_num; send_eap_packet (EAP_RESPONSE_IDENTITY_KEEP_ALIVE); sleep (30); } return (void*)0; }
void action_eap_req_idnty(const struct eap_header *eap_head, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { extern int exit_flag; if (state == STARTED){ fprintf(stdout, ">>Protocol: REQUEST EAP-Identity\n"); } if (exit_flag) return; eap_response_ident[0x13] = eap_head->eap_id; send_eap_packet(EAP_RESPONSE_IDENTITY); }
DWORD WINAPI eap_thread() { extern pcap_t *handle; extern char devname[]; init_device(); init_frames (); send_eap_packet (EAPOL_START); pcap_loop (handle, -1, get_packet, NULL); /* main loop */ pcap_close (handle); memset (devname, 0, MAX_DEV_NAME_LEN); update_interface_state(NULL); return 0; }
void error_handle(int sig) { if ( sig == -2 ) { fprintf(stderr, "an error occured, exiting\n"); } else { fprintf(stdout, "user interrupted\n"); } if (dhcp == 1) { if ( system(dhclientreleasecmd) == -1 ) { fprintf(stderr, "error while releasing dhcp\n"); } } if (state == ONLINE) { send_eap_packet(EAPOL_LOGOFF); } pcap_breakloop(handle); return; }
/* * === FUNCTION ====================================================================== * Name: action_by_eap_type * Description: 根据eap报文的类型完成相关的应答 * ===================================================================================== */ void action_by_eap_type(enum EAPType pType, const struct eap_header *header, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { // printf("PackType: %d\n", pType); switch(pType){ case EAP_SUCCESS: state = ONLINE; fprintf(stdout, ">>Protocol: EAP_SUCCESS\n"); fprintf(stdout, "&&Info: Authorized Access to Network. \n"); print_server_info (packet, packetinfo->caplen); if (background){ background = 0; /* 防止以后误触发 */ daemon_init(); } break; case EAP_FAILURE: state = READY; fprintf(stdout, ">>Protocol: EAP_FAILURE\n"); if(state == ONLINE){ fprintf(stdout, "&&Info: SERVER Forced Logoff\n"); } if (state == STARTED){ fprintf(stdout, "&&Info: Invalid Username or Client info mismatch.\n"); } if (state == ID_AUTHED){ fprintf(stdout, "&&Info: Invalid Password.\n"); } print_server_info (packet, packetinfo->caplen); pcap_breakloop (handle); break; case EAP_REQUEST_IDENTITY: if (state == STARTED){ fprintf(stdout, ">>Protocol: REQUEST EAP-Identity\n"); } send_eap_packet(EAP_RESPONSE_IDENTITY); break; case EAP_REQUETS_MD5_CHALLENGE: state = ID_AUTHED; fprintf(stdout, ">>Protocol: REQUEST MD5-Challenge(PASSWORD)\n"); fill_password_md5((uint8_t*)header->eap_md5_challenge, header->eap_id); send_eap_packet(EAP_RESPONSE_MD5_CHALLENGE); break; case EAP_REQUEST_IDENTITY_KEEP_ALIVE: if (state == ONLINE){ fprintf(stdout, ">>Protocol: REQUEST EAP_REQUEST_IDENTITY_KEEP_ALIVE\n"); } // // 使用伪IP模式认证成功后,获取真实IP,并写入RES/IDTY数据块 // if (use_pseudo_ip){ // // //若获取成功,关闭伪IP模式标签 // if (set_device_new_ip() == 0) { // use_pseudo_ip = 0; // } // } send_eap_packet(EAP_RESPONSE_IDENTITY_KEEP_ALIVE); break; default: return; } }
void get_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { const struct eap_header *eap_header = (struct eap_header *) (&packet[ETH_HLEN+AUTH_HLEN]); ehid = eap_header->eap_id; switch (eap_header->eap_code) { case EAP_CODE_REQUEST: switch (eap_header->eap_type) { case EAP_REQUEST_IDENTITY: if (state == STARTED) { fprintf(stdout, "Identification Received\n"); state = IDENTIFIED; send_eap_packet(EAP_RESPONSE_IDENTITY); } else { fprintf(stdout, "Warning: we haven't started\n"); } return; case EAP_REQUEST_NOTIFICATION: /* got this packet if authentication failed or in use*/ fprintf(stdout, "Server Notification: %s\n", packet+ETH_HLEN+AUTH_HLEN+EAP_HLEN); send_eap_packet(EAP_RESPONSE_MD5_CHALLENGE); return; case EAP_REQUEST_MD5_CHALLENGE: state = AUTHED; fprintf(stdout, "MD5 Challenge Received\n"); memcpy(md5_challenge, packet+ETH_HLEN+AUTH_HLEN+EAP_HLEN+0x01, 0x10); md5digest(); send_eap_packet(EAP_RESPONSE_MD5_CHALLENGE); return; } case EAP_CODE_SUCCESS: state = ONLINE; fprintf(stdout, "Login Successfully\n"); if ( system(dhclientcmd) == -1 ) { fprintf(stderr, "Error while executing dhclient\n"); error_handle(-2); } dhcp = 1; get_ip(); if ( init_udp() == -1) { error_handle(-2); } init_daemon(); alarm(31); return; case EAP_CODE_FAILURE: if ( state == ONLINE || state == AUTHED) { fprintf(stdout, "Logout\n"); pcap_breakloop(handle); } return; } fprintf(stderr, "FATAL: Unknown packet[eap_code(%02x), eap_id(%02x), eap_type(%02x)]\n", eap_header->eap_code, eap_header->eap_id, eap_header->eap_type); fprintf(stderr, "Waring: I won't respond to this unknown packet\n"); return; }