wuliclient init

This commit is contained in:
root
2018-06-30 12:56:57 +08:00
commit 9e26530f9e
9 changed files with 1141 additions and 0 deletions

18
README.md Normal file
View File

@@ -0,0 +1,18 @@
USED:
1.Download the wuliclient directory to openwrt sdk packages directory.
[if you school H3C server ip is different from my ,you should modify it.
edit wuliclient.c and modify maroc of SER_ADRE SER_PORT and so on]
2.back to sdk top directory
3.running make
4.the .ipk in ./bin/[platform]/packages/base/
5.cp ipk to your route and install it.
6.running wuliclent with you "id passwd net_dev_id"
for example:
wuliclent 130105021035 1234 eth0

BIN
wuliclient/.README.md.swp Normal file

Binary file not shown.

34
wuliclient/Makefile Normal file
View File

@@ -0,0 +1,34 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=wuliclientBulidl
PKG_RELEASE:=1.0
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=utils
CATEGORY:=Utilities
PKGARCH:=all
TITLE:= $(PKG_NAME)
MAINTAINER:=K.L
endef
define Package/$(PKG_NAME)/description
wuliclient for Inode7.1 portal in zhibt
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Package/$(PKG_NAME)/install
echo "Here is Package/install"
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/bin/
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

Binary file not shown.

Binary file not shown.

161
wuliclient/src/MD5.c Normal file
View File

@@ -0,0 +1,161 @@
#include <memory.h>
#include "MD5.h"
unsigned char PADDING[] = { 0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
void MD5_Init(MD5_CTX *context)
{
context->count[0] = 0;
context->count[1] = 0;
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
}
void MD5_Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen)
{
unsigned int i = 0, index = 0, partlen = 0;
index = (context->count[0] >> 3) & 0x3F;
partlen = 64 - index;
context->count[0] += inputlen << 3;
if (context->count[0] < (inputlen << 3))
context->count[1]++;
context->count[1] += inputlen >> 29;
if (inputlen >= partlen)
{
memcpy(&context->buffer[index], input, partlen);
MD5Transform(context->state, context->buffer);
for (i = partlen; i + 64 <= inputlen; i += 64)
MD5Transform(context->state, &input[i]);
index = 0;
}
else
{
i = 0;
}
memcpy(&context->buffer[index], &input[i], inputlen - i);
}
void MD5_Final(unsigned char digest[16], MD5_CTX *context)
{
unsigned int index = 0, padlen = 0;
unsigned char bits[8];
index = (context->count[0] >> 3) & 0x3F;
padlen = (index < 56) ? (56 - index) : (120 - index);
MD5Encode(bits, context->count, 8);
MD5_Update(context, PADDING, padlen);
MD5_Update(context, bits, 8);
MD5Encode(digest, context->state, 16);
}
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len)
{
unsigned int i = 0, j = 0;
while (j < len)
{
output[j] = input[i] & 0xFF;
output[j + 1] = (input[i] >> 8) & 0xFF;
output[j + 2] = (input[i] >> 16) & 0xFF;
output[j + 3] = (input[i] >> 24) & 0xFF;
i++;
j += 4;
}
}
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len)
{
unsigned int i = 0, j = 0;
while (j < len)
{
output[i] = (input[j]) |
(input[j + 1] << 8) |
(input[j + 2] << 16) |
(input[j + 3] << 24);
i++;
j += 4;
}
}
void MD5Transform(unsigned int state[4], unsigned char block[64])
{
unsigned int a = state[0];
unsigned int b = state[1];
unsigned int c = state[2];
unsigned int d = state[3];
unsigned int x[64];
MD5Decode(x, block, 64);
FF(a, b, c, d, x[0], 7, 0xd76aa478); /* 1 */
FF(d, a, b, c, x[1], 12, 0xe8c7b756); /* 2 */
FF(c, d, a, b, x[2], 17, 0x242070db); /* 3 */
FF(b, c, d, a, x[3], 22, 0xc1bdceee); /* 4 */
FF(a, b, c, d, x[4], 7, 0xf57c0faf); /* 5 */
FF(d, a, b, c, x[5], 12, 0x4787c62a); /* 6 */
FF(c, d, a, b, x[6], 17, 0xa8304613); /* 7 */
FF(b, c, d, a, x[7], 22, 0xfd469501); /* 8 */
FF(a, b, c, d, x[8], 7, 0x698098d8); /* 9 */
FF(d, a, b, c, x[9], 12, 0x8b44f7af); /* 10 */
FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */
/* Round 2 */
GG(a, b, c, d, x[1], 5, 0xf61e2562); /* 17 */
GG(d, a, b, c, x[6], 9, 0xc040b340); /* 18 */
GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
GG(b, c, d, a, x[0], 20, 0xe9b6c7aa); /* 20 */
GG(a, b, c, d, x[5], 5, 0xd62f105d); /* 21 */
GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */
GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
GG(b, c, d, a, x[4], 20, 0xe7d3fbc8); /* 24 */
GG(a, b, c, d, x[9], 5, 0x21e1cde6); /* 25 */
GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
GG(c, d, a, b, x[3], 14, 0xf4d50d87); /* 27 */
GG(b, c, d, a, x[8], 20, 0x455a14ed); /* 28 */
GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
GG(d, a, b, c, x[2], 9, 0xfcefa3f8); /* 30 */
GG(c, d, a, b, x[7], 14, 0x676f02d9); /* 31 */
GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
/* Round 3 */
HH(a, b, c, d, x[5], 4, 0xfffa3942); /* 33 */
HH(d, a, b, c, x[8], 11, 0x8771f681); /* 34 */
HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
HH(a, b, c, d, x[1], 4, 0xa4beea44); /* 37 */
HH(d, a, b, c, x[4], 11, 0x4bdecfa9); /* 38 */
HH(c, d, a, b, x[7], 16, 0xf6bb4b60); /* 39 */
HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
HH(d, a, b, c, x[0], 11, 0xeaa127fa); /* 42 */
HH(c, d, a, b, x[3], 16, 0xd4ef3085); /* 43 */
HH(b, c, d, a, x[6], 23, 0x4881d05); /* 44 */
HH(a, b, c, d, x[9], 4, 0xd9d4d039); /* 45 */
HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
HH(b, c, d, a, x[2], 23, 0xc4ac5665); /* 48 */
/* Round 4 */
II(a, b, c, d, x[0], 6, 0xf4292244); /* 49 */
II(d, a, b, c, x[7], 10, 0x432aff97); /* 50 */
II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
II(b, c, d, a, x[5], 21, 0xfc93a039); /* 52 */
II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
II(d, a, b, c, x[3], 10, 0x8f0ccc92); /* 54 */
II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
II(b, c, d, a, x[1], 21, 0x85845dd1); /* 56 */
II(a, b, c, d, x[8], 6, 0x6fa87e4f); /* 57 */
II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
II(c, d, a, b, x[6], 15, 0xa3014314); /* 59 */
II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
II(a, b, c, d, x[4], 6, 0xf7537e82); /* 61 */
II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
II(c, d, a, b, x[2], 15, 0x2ad7d2bb); /* 63 */
II(b, c, d, a, x[9], 21, 0xeb86d391); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}

48
wuliclient/src/MD5.h Normal file
View File

@@ -0,0 +1,48 @@
#ifndef MD5_H
#define MD5_H
typedef struct
{
unsigned int count[2];
unsigned int state[4];
unsigned char buffer[64];
}MD5_CTX;
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#define FF(a,b,c,d,x,s,ac) \
{ \
a += F(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define GG(a,b,c,d,x,s,ac) \
{ \
a += G(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define HH(a,b,c,d,x,s,ac) \
{ \
a += H(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define II(a,b,c,d,x,s,ac) \
{ \
a += I(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
void MD5_Init(MD5_CTX *context);
void MD5_Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen);
void MD5_Final(unsigned char digest[16], MD5_CTX *context);
void MD5Transform(unsigned int state[4], unsigned char block[64]);
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len);
#endif

16
wuliclient/src/Makefile Normal file
View File

@@ -0,0 +1,16 @@
# build helloworld executable when user executes "make"
PKG_NAME:=wuliclientBulidl
$(PKG_NAME): MD5.o wuliclient.o
$(CC) $(LDFLAGS) MD5.o wuliclient.o -o $(PKG_NAME)
MD5.o: MD5.c
$(CC) $(CFLAGS) -c MD5.c
wuliclient.o: wuliclient.c
$(CC) $(CFLAGS) -c wuliclient.c
# remove object files and executable when user executes "make clean"
clean:
rm *.o $(PKG_NAME)

864
wuliclient/src/wuliclient.c Normal file
View File

@@ -0,0 +1,864 @@
/************************************************************************************************/
/* Copyring (C), by K.L & lcuops */
/************************************************************************************************/
/**
* @file wuliclient.c
* @brief HC3 inode 7.1 protal anthenticate client
* @author K.L
* @version 1.0
* @data 2017-2-27
*/
/************************************************************************************************/
/* Include Files */
/************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netdb.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include "MD5.h"
#include <malloc.h>
/************************************************************************************************/
/* Macros & Typedefs */
/************************************************************************************************/
// #define _DEBUG
#define SER_ADRE "10.0.15.103" //服务器地址
#define SER_PORT 50200 //服务器端口号
#define CALL_PORT 50101 //一开始的数据发往的端口
#define MAXDATASIZE 1024 //缓存区的最大字节
#define CHECK_ONLINE 120 //联网检测时间
#define RECV_TIMEOUT 5 //接收超时
/************************************************************************************************/
/* Structre Declarations */
/************************************************************************************************/
typedef struct tar_PACKET_HEAD_S
{
unsigned char version;
unsigned char type;
unsigned char pap_chap;
unsigned char rsvd;
unsigned short int serialNo;
unsigned short int reqId;
unsigned int userIp;
unsigned short int userPort;
unsigned char errCode;
unsigned char attNum;
}PACKET_HEAD_S;
/************************************************************************************************/
/* Global Variables */
/************************************************************************************************/
char g_userId[15];
char g_passwd[15];
char g_eth_name[10];
char userid[8];
char UserPortInDev[31];
char g_recv_buf[MAXDATASIZE];
char g_packeType;
char g_Timelimit_flag;
int g_host_ip;
short int g_randNum;
unsigned int g_loginTimeOut;
unsigned int g_offset = 0;
PACKET_HEAD_S g_packHead_s;
unsigned int ser_infor_len;
struct sockaddr_in ser_infor_s;
struct sockaddr_in ser_addr_s;
const char *share_key = "hello";
const char *vertion = "CH-7.10-0313";
const char *ser_name = "@huawei2.com";
const char call_pack[]={0x02,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
0xba,0xd3,0x4e,0x49,0x6e,0x69,0x2e,0xab,0xff,0xd8,0x9e,0xca,0x49,0x9b,0xba,0xcb,
0x68,0x06,0x00,0x00,0x00,0x00,0x67,0x06,0x00,0x00,0x00,0x00,0x65,0x09,0x68,0x75,
0x61,0x33,0x63,0x6f,0x6d,0x66,0x09,0x68,0x75,0x61,0x33,0x63,0x6f,0x6d,0x71,0x06,
0x02,0xbd,0xc0,0x70};
const char heartData[]={0x7a,0x06,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0x00,0x01,0x7d,0x03,0x63,0x60,
0x03,0x01} ;
//tmp
const char E_vertion[]={0x01,0x1e,0x4d,0x47,0x73,0x4f,0x48,0x78,0x6f,0x45,0x50,0x79,0x74,0x79,0x52,0x78,
0x78,0x68,0x4a,0x31,0x5a,0x79,0x49,0x73,0x52,0x64,0x59,0x30,0x73,0x3d};
const char E_vertion2[]={0x06,0x07,0x4f,0x7a,0x64,0x56,0x54,0x55,0x68,0x66,0x59,0x79,0x42,0x35,0x47,0x30,
0x63,0x7a,0x64,0x51,0x30,0x75,0x4b,0x52,0x48,0x54,0x4f,0x55,0x30,0x3d};
const char E_password[]={0x9a,0x4f,0x87,0x04,0x0b,0x9b,0xdc,0x23};
/************************************************************************************************/
/* Function Declarations */
/************************************************************************************************/
/* NONE */
void free_memory(char *addr)
{
if(NULL != addr){
free(addr);
}
}
void MD5(unsigned char *dst_str , unsigned char *src_str ,int leng)
{
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx,src_str,leng);
MD5_Final(dst_str,&ctx);
}
int addMd5(char *data,int len)
{
char *md5Data = NULL;
char md5Code[16] = {0x000};
md5Data = (char*)malloc(sizeof(char)*(len+5));
if(NULL == md5Data){
printf("malloc error\n");
return -1;
}
memcpy(md5Data, data, g_offset);
memcpy(md5Data+g_offset, share_key , 5); //add share_key
MD5(md5Code, md5Data, (g_offset + 5));
memcpy(data+16, md5Code, 16);
free_memory(md5Data);
return 0;
}
void disp_hex(unsigned char *data, int len)
{
int cnt;
for(cnt=0; cnt<len; cnt++)
{
printf("%02x",data[cnt]);
}
}
int getHostIP(void)
{
int sockfd;
struct sockaddr_in sin;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1){
perror("socket");
return -1;
}
strncpy(ifr.ifr_name, g_eth_name, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
{
perror("ioctl");
close(sockfd);
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
g_host_ip = sin.sin_addr.s_addr;
close(sockfd);
return 0;
}
void packetHeadBuil(char *_pdst)
{
*(_pdst) = g_packHead_s.version;
*(_pdst+1) = g_packHead_s.type;
*(_pdst+2) = g_packHead_s.pap_chap;
*(_pdst+3) = g_packHead_s.rsvd;
*(_pdst+14) = g_packHead_s.errCode;
*(_pdst+15) = g_packHead_s.attNum;
memcpy((_pdst+4), &g_packHead_s.serialNo,2);
memcpy((_pdst+6), &g_packHead_s.reqId,2);
memcpy((_pdst+8), &g_packHead_s.userIp,4);
memcpy((_pdst+12),&g_packHead_s.userPort,2);
}
void attData_add(const unsigned char *src, unsigned char flag, unsigned char len, unsigned char *dst)
{
unsigned char len2;
len2 = len + 2;
memcpy(dst+g_offset, &(flag), 1);
memcpy(dst+g_offset+1, &(len2), 1);
memcpy(dst+g_offset+2, src, len);
g_offset += len2;
}
int sentAndRecv(char *_data, unsigned int _len)
{
int ret;
int sockfd;
struct timeval timeo = {3, 0};
socklen_t t_len;
/*set server's address */
bzero( &ser_addr_s, sizeof(ser_addr_s) );
ser_addr_s.sin_port = htons(SER_PORT);
ser_addr_s.sin_family = AF_INET;
ser_addr_s.sin_addr.s_addr = inet_addr(SER_ADRE);
/* creat a sock */
t_len = sizeof(timeo);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
timeo.tv_sec = RECV_TIMEOUT;
ret = setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeo, t_len); //set receive time out
if(-1 == sockfd && !ret){
printf("creat and set a socket error\n");
perror("socket");
return -1;
}
/* sent to data */
ret = sendto(sockfd, _data, _len, 0, (struct sockaddr *)&ser_addr_s, sizeof(ser_addr_s));
if(_len != ret){
printf("sent error.return value:%d!\n",ret);
return -1;
}
#ifdef _DEBUG
printf("(----sent-to-data-----[len]=%d)\n",_len);
disp_hex(_data,_len);
printf("\n");
#endif
/* Receive the message */
#ifdef _DEBUG
printf("(--Wating-for-server's-answer--)\n");
#endif
memset(g_recv_buf,0,sizeof(g_recv_buf));
ret = recvfrom(sockfd,g_recv_buf,sizeof(g_recv_buf),
0,(struct sockaddr *)&ser_infor_s,&ser_infor_len);
close(sockfd);
if(-1 == ret){
if(errno == EAGAIN){ //time out
printf("Recevce time out \n");
return -1;
}
perror("recvfrom");
return -1;
}
#ifdef _DEBUG
printf("Server return information:[len]=%d \n",ret);
disp_hex(g_recv_buf,ret);
printf("\n");
#endif
return 0;
}
int packetAnalyze()
{
/* check the packet md5 code */
//neet to add check_md5()function
g_packeType = g_recv_buf[1];
/* check the errocode */
if(g_recv_buf[14] != 0){
return g_recv_buf[14];
}
/* check the type */
//need to something
switch(g_recv_buf[1]){
case 0x6f:{
//get userid from server
memcpy(userid,(g_recv_buf+34),sizeof(userid));
#ifdef _DEBUG
printf("[set]--userid--\n");
disp_hex(userid,sizeof(userid));
printf("\n");
#endif
return 0;
}
case 0x65:{
if( *(g_recv_buf+15) == 0x0d ){
//get userportdev from server and success
memcpy(UserPortInDev,(g_recv_buf+148),sizeof(UserPortInDev));
//get login time out
memcpy(&g_loginTimeOut,(g_recv_buf+103),4);
#ifdef _DEBUG
printf("[set]--UserPortInDev--\n");
disp_hex(UserPortInDev,sizeof(UserPortInDev));
printf("\n");
printf("[LoginTimeOut:%d]\n",g_loginTimeOut);
#endif
}
return 0;
}
case 0x69:{ //heartbeat
return 0;
}
default : return 0;
}
}
int getSerInfor()
{
int ret;
char md5Code[16] = {0x000};
unsigned char *data = NULL;
#ifdef _DEBUG
printf("----get server information----\n");
#endif
data = (char*)malloc(sizeof(char)*44);
if(NULL == data){
printf("malloc error\n");
return -1;
}
memset(data, 0, 44);
/* set head information */
memset(&g_packHead_s,0,sizeof(g_packHead_s));
g_packHead_s.version = 0x02;
g_packHead_s.type = 0x6e;
g_packHead_s.serialNo = g_randNum;
g_packHead_s.userIp = g_host_ip;
g_packHead_s.attNum = 0x02;
packetHeadBuil(data);
/* set att data */
g_offset = 32 ;
attData_add((char *)&g_host_ip, 0x67, sizeof(g_host_ip),data);
attData_add((char *)&g_host_ip, 0x68, sizeof(g_host_ip),data);
/* set MD5 code */
ret = addMd5(data,g_offset);
if(ret){
free_memory(data);
return -1;
}
/* sent request to server */
ret = sentAndRecv(data,g_offset);
if(-1 == ret){
free_memory(data);
return -1;
}
/* analyze packet message*/
ret = packetAnalyze();
if(0 != ret && g_packeType == 0x6f){
// need to add analyze_error() function
/* free memory */
free_memory(data);
return ret;
}
free_memory(data);
return 0;
}
int sentReqPacket()
{
int ret;
time_t nowTime;
char interval;
unsigned char *data = NULL;
unsigned char *IDdata = NULL;
#ifdef _DEBUG
printf("--sent userID and password---\n");
#endif
data = (char*)malloc(sizeof(char)*153);
if(NULL == data){
printf("malloc error\n");
return -1;
}
memset(data, 0, 153);
/* set head information */
memset(&g_packHead_s,0,sizeof(g_packHead_s));
g_packHead_s.version = 0x02;
g_packHead_s.pap_chap = 0x01;
g_packHead_s.type = 0x64;
g_packHead_s.serialNo = g_randNum;
g_packHead_s.userIp = g_host_ip;
g_packHead_s.attNum = 0x07;
packetHeadBuil(data);
/* set att data */
IDdata = (char*)malloc(sizeof(char)*56);//store E_vertiong & userID
if(NULL == IDdata){
printf("malloc error\n");
return -1;
}
g_offset = 0;
memcpy(IDdata, E_vertion2, sizeof(E_vertion2));
g_offset += sizeof(E_vertion2);
interval = 0x20;
memcpy(IDdata+g_offset, &interval, 1);
g_offset ++;
memcpy(IDdata+g_offset, &interval, 1);
g_offset ++;
memcpy(IDdata+g_offset, g_userId, strlen(g_userId));
g_offset += strlen(g_userId);
memcpy(IDdata+g_offset, ser_name, 12);
g_offset = 32 ;
interval = 0x01;
attData_add(E_vertion, 0x21, sizeof(E_vertion), data);
attData_add((char *)&g_host_ip, 0x68, sizeof(g_host_ip), data);
attData_add((char *)&g_host_ip, 0x67, sizeof(g_host_ip), data);
attData_add(IDdata, 0x65, 56, data);
attData_add(E_password, 0x66, sizeof(E_password),data);
attData_add(&interval, 0x38, 1, data);
nowTime = time(NULL); // timestamp
nowTime = htonl(nowTime); //chang to net format
attData_add((unsigned char *)&nowTime, 0x71, 4, data);
/* set MD5 code */
ret = addMd5(data,g_offset);
if(ret){
free_memory(data);
free_memory(IDdata);
return -1;
}
/* sent request to server */
ret = sentAndRecv(data,g_offset);
if(-1 == ret){
free_memory(data);
free_memory(IDdata);
return -1;
}
/* analyze packet message*/
ret = packetAnalyze();
if(0 != ret && g_packeType == 0x65){
/* free memory */
free_memory(data);
free_memory(IDdata);
return ret;
}
/* free the memory */
free_memory(data);
free_memory(IDdata);
printf("log in sucess!\n");
return 0;
}
int call_packet()
{
int ret;
int sockfd;
struct timeval timeo = {3, 0};
socklen_t t_len;
/*set server's address */
bzero( &ser_addr_s, sizeof(ser_addr_s) );
ser_addr_s.sin_port = htons(CALL_PORT);
ser_addr_s.sin_family = AF_INET;
ser_addr_s.sin_addr.s_addr = inet_addr(SER_ADRE);
/* creat a sock */
t_len = sizeof(timeo);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
timeo.tv_sec = RECV_TIMEOUT;
ret = setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeo, t_len); //set receive time out
if(-1 == sockfd && !ret){
printf("creat and set a socket error\n");
perror("socket");
return -1;
}
/* sent data */
ret = sendto(sockfd, call_pack, sizeof(call_pack),
0, (struct sockaddr *)&ser_addr_s, sizeof(ser_addr_s));
close(sockfd);
if(sizeof(call_pack) != ret){
printf("sent error.return value:%d!\n",ret);
return -1;
}
return 0;
}
int sentLogReq()
{
int ret;
int cnt;
/* sent call_packet twice */
#ifdef _DEBUG
printf("sent-call_packet\n");
#endif
for(cnt=0; cnt<2; cnt++){
ret = call_packet();
if(-1 == ret){
return -1;
}
}
usleep(500);
/* get server information */
ret = getSerInfor();
if(0 != ret){
return -1;
}
/* sent logReqPacket */
ret = sentReqPacket();
return ret;
}
int sentLogoutReq()
{
int ret;
unsigned char *data = NULL;
data = (char*)malloc(sizeof(char)*54);
if(NULL == data){
printf("malloc error\n");
return -1;
}
memset(data, 0, 54);
/* set head information */
memset(&g_packHead_s,0,sizeof(g_packHead_s));
g_packHead_s.version = 0x02;
g_packHead_s.type = 0x66;
g_packHead_s.serialNo = g_randNum;
g_packHead_s.userIp = g_host_ip;
g_packHead_s.attNum = 0x03;
packetHeadBuil(data);
/* add data */
g_offset = 32 ;
attData_add((char *)&g_host_ip, 0x68, sizeof(g_host_ip), data);
attData_add((char *)&g_host_ip, 0x67, sizeof(g_host_ip), data);
attData_add(userid, 0x64, sizeof(userid), data);
/* set MD5 code */
ret = addMd5(data,g_offset);
if(ret){
free_memory(data);
return -1;
}
/* sent request to server */
ret = sentAndRecv(data,g_offset);
if(-1 == ret){
free_memory(data);
return -1;
}
/* analyze packet message*/
ret = packetAnalyze();
if(0 != ret && g_packeType == 0x67){
/* free memory */
free_memory(data);
return ret;
}
/* free the memory */
free_memory(data);
return 0;
}
int startHeartbeatthread()
{
int ret;
time_t nowTime;
char *data = NULL;
data = (char*)malloc(sizeof(char)*123);
if(NULL == data){
printf("malloc error\n");
return -1;
}
memset(data, 0, 123);
/* set head information */
memset(&g_packHead_s,0,sizeof(g_packHead_s));
g_packHead_s.version = 0x02;
g_packHead_s.type = 0x68;
g_packHead_s.pap_chap = 0x01;
g_packHead_s.serialNo = g_randNum;
g_packHead_s.userIp = g_host_ip;
g_packHead_s.attNum = 0x0b;
packetHeadBuil(data);
/* set att data */
g_offset = 32;
attData_add((char *)&g_host_ip, 0x7f, sizeof(g_host_ip), data);
attData_add((char *)&g_host_ip, 0x7e, sizeof(g_host_ip), data);
attData_add((char *)&g_host_ip, 0x68, sizeof(g_host_ip), data);
attData_add((char *)&g_host_ip, 0x67, sizeof(g_host_ip), data);
attData_add(UserPortInDev, 0x72, sizeof(UserPortInDev), data);
attData_add(userid, 0x64, sizeof(userid), data);
nowTime = time(NULL); // timestamp
nowTime = htonl(nowTime); //chang to net format
attData_add((unsigned char *)&nowTime, 0x71, 4, data);
memcpy((data+g_offset),heartData,sizeof(heartData));
g_offset += sizeof(heartData);
/* set MD5 code */
ret = addMd5(data,123);
if(ret){
free_memory(data);
return -1;
}
/* sent request to server */
#ifdef _DEBUG
printf("-----heartbeat-packet-------\n");
#endif
ret = sentAndRecv(data,123);
if(-1 == ret){
free_memory(data);
return -1;
}
/* analyze packet message*/
ret = packetAnalyze();
if(0 != ret){
// need to add analyze_error() function
/* free memory */
free_memory(data);
return ret;
}
/* free the memory */
free_memory(data);
return 0;
}
int authenticate()
{
int ret;
int cnt;
/* get host IP address */
ret = getHostIP();
if(-1 == ret){
printf("get ip fail.\n");
printf("You might not be connected cables\n");
return -1;
}
#ifdef _DEBUG
printf("ip:%02x\n",g_host_ip);
#endif
/* Ready for log in */
do{
ret = sentLogReq();
if( ret == 0) {
break;
}
/* Analyze ERROR code*/
else if( ret == 2 ){
printf("Checked serialNo Inconsistent with previous\n");
printf("Start to re-login\n");
sentLogoutReq();
sleep(2);
continue;
}
else if(ret == 1)
{
if(0x19 == g_recv_buf[33]){
printf("In to Limit of time\n");
printf("Try to login again after 5 mintues\n");
sleep(300);
return -1;
}
else if(0x26 == g_recv_buf[33]){
printf("!!!! Password ERROR,please don't try again !!!!!!!!!\n");
exit(0);
}
else if(0x21 == g_recv_buf[33]){
printf("Vlan bind fail,Maybe your id is not correct.\n");
exit(0);
}
else if(0x20 == g_recv_buf[33]){
printf("Your Mac address not correct.\n");
exit(0);
}
}
else if(ret == 3){
return -1;
}
else{
printf("log in error!\n");
printf("ErrorCode:%d\n",(unsigned int)ret);
printf("5 second re-log in\n");
sleep(5);
}
}while(1);
printf("Welcome to ZHBIT net!\n");
/* check Server's login time out */
if(g_loginTimeOut == 0){ //Server dose not require heartbeatpacket
do{
/* check whether can surf the internet by ping command*/
ret = system("ping -c 2 114.114.114.114");
if( 256 == ret){
printf("Can't ping to 114.114.114.114\n");
return -1;
}
printf("-----【Online】------\n");
sleep(CHECK_ONLINE);
}while(1);
}
/* start heartbeat packet */
else if(g_loginTimeOut > 1000){ // > 1 second
do{
sleep(g_loginTimeOut);
ret = startHeartbeatthread();
if(ret){
break;
}
}
while(1);
}
}
int main(int argc, char *argv[])
{
if(argc != 4){
printf("输入账号密码错误,请重新输入\n");
printf("格式wuliclient 账号 密码 网卡名\n");
printf("(目前只支持密码为默认密码1234)\n");
return -1;
}
if( strcmp(argv[2], "1234") ){
printf("抱歉目前密码只支持默认密码1234\n");
return -1;
}
printf("-----------------------------------------\n");
printf("WULICLIENT OF ZHBIT\n");
printf("定制号:%s\n",g_userId);
printf("【声明】\n");
printf("本版本仅作为学习交流之用请于24小时内删除\n");
printf("创作者K.L & lcuops\n");
printf("---------欢迎反馈问题---------\n");
printf("反馈/交流 Email: kuling321@qq.com\n");
printf("-----------------------------------------\n");
strcpy(g_userId, argv[1]);
strcpy(g_passwd, argv[2]);
strcpy(g_eth_name, argv[3]);
#ifdef _DEBUG
printf("userid:%s\n",g_userId);
printf("passwd:%s\n",g_passwd);
#endif
do{
/* get random number for serialNo of this connet */
srand(time(NULL));
g_randNum = rand();
#ifdef _DEBUG
printf("randNum: ");
disp_hex((char *)&g_randNum, 2);
printf("\n");
#endif
/* start authenticate */
authenticate();
sleep(3);
}while(1);
return 0;
}