295 lines
7.3 KiB
C
295 lines
7.3 KiB
C
#include <string.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <errno.h>
|
||
#include <unistd.h>
|
||
#include <netdb.h>
|
||
#include <time.h>
|
||
#include <sys/time.h>
|
||
#include <sys/ioctl.h>
|
||
#include <sys/types.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <arpa/inet.h>
|
||
#include <netinet/tcp.h>
|
||
#include <net/if.h>
|
||
|
||
#include "util.h"
|
||
#include "version.h"
|
||
#include "main.h"
|
||
|
||
#ifdef _ONE_SERVER
|
||
int checkmac( void )
|
||
{
|
||
|
||
struct ifreq ifreq;
|
||
int sock;
|
||
if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
|
||
{
|
||
perror("socket");
|
||
return 0;
|
||
}
|
||
strcpy(ifreq.ifr_name,"e");
|
||
strcat(ifreq.ifr_name,"t");
|
||
strcat(ifreq.ifr_name,"h");
|
||
strcat(ifreq.ifr_name,"0");
|
||
if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0)
|
||
{
|
||
perror("ioctl");
|
||
return 0;
|
||
}
|
||
/*
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[0]!=0){
|
||
return 0;
|
||
}
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[1]!=25){
|
||
return 0;
|
||
}
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[2]!=224){
|
||
return 0;
|
||
}
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[3]!=43){
|
||
return 0;
|
||
}
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[4]!=195){
|
||
return 0;
|
||
}
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[5]!=232){
|
||
return 0;
|
||
}
|
||
*/
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[0]!=0x00
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[1]!=0x0C
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[2]!=0x29
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[3]!=0x44
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[4]!=0x1E
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[5]!=0x1A){
|
||
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[0]!=0
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[1]!=0x0C
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[2]!=0x29
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[3]!=0xE1
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[4]!=0x44
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[5]!=0x05){
|
||
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[0]!=0
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[1]!=0x15
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[2]!=0x17
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[3]!=0x20
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[4]!=0x67
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[5]!=0x90){
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[0]!=0
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[1]!=0x0C
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[2]!=0x29
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[3]!=0xB3
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[4]!=0xE5
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[5]!=0x0A){
|
||
if((unsigned char)ifreq.ifr_hwaddr.sa_data[0]!=0x00
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[1]!=0x15
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[2]!=0x17
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[3]!=0x88
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[4]!=0xD5
|
||
|| (unsigned char)ifreq.ifr_hwaddr.sa_data[5]!=0xB0){
|
||
close(sock);
|
||
return 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return 1;
|
||
}
|
||
#endif
|
||
|
||
int connectHost( char* hostname , unsigned short port )
|
||
{
|
||
struct sockaddr_in sock; /*connect<63><74><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>*/
|
||
struct hostent* hoste; /*hostname<6D><65>hostent*/
|
||
int fd; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĩ<EFBFBD><C4A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ū<EFBFBD><C5AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||
int lr; /*<2A><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||
|
||
memset( &sock , 0 , sizeof( struct sockaddr_in ) );
|
||
sock.sin_family = AF_INET;
|
||
sock.sin_port = htons( port );
|
||
|
||
/* dot notation <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ëƩ<C3AB><C6A9><EFBFBD><EFBFBD> */
|
||
sock.sin_addr.s_addr = inet_addr( hostname );
|
||
if( sock.sin_addr.s_addr == -1 ){
|
||
|
||
hoste = gethostbyname( hostname );
|
||
if( hoste == NULL ){
|
||
printf( "<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %s\n", hostname);
|
||
return -1;
|
||
}
|
||
|
||
memcpy((void*)&sock.sin_addr.s_addr ,
|
||
hoste->h_addr , sizeof(struct in_addr) );
|
||
}
|
||
|
||
fd = socket( AF_INET, SOCK_STREAM , 0 );
|
||
if( fd == -1 ){
|
||
printf("Cannot Create Socket(%s errno:%d)\n"
|
||
,strerror( errno ) ,errno );
|
||
return -1;
|
||
}
|
||
|
||
lr = connect(fd,(struct sockaddr*)&sock,sizeof(struct sockaddr_in));
|
||
if( lr != 0 ){
|
||
return -1;
|
||
}
|
||
return fd;
|
||
}
|
||
|
||
void readpasswd(char *name, char *passwd)
|
||
{
|
||
char line[256];
|
||
FILE* fp = fopen("./info.txt", "r");
|
||
if (fp == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
while(1){
|
||
line[0]='\0';
|
||
if (fgets(line, sizeof(line), fp) == NULL) break;
|
||
chop(line);
|
||
easyGetTokenFromBuf(line, ":", 1, name, 32);
|
||
easyGetTokenFromBuf(line, ":", 2, passwd, 32);
|
||
}
|
||
|
||
}
|
||
|
||
int attestation( void )
|
||
{
|
||
|
||
#ifdef _ONE_SERVER
|
||
if(checkmac()){
|
||
return 1;
|
||
}
|
||
#endif
|
||
char name[32]="";
|
||
char passwd[32]="";
|
||
readpasswd(name, passwd);
|
||
if(strlen(name)==0){
|
||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||
scanf("%32s",name);
|
||
}
|
||
if(strlen(passwd)==0){
|
||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺");
|
||
scanf("%32s",passwd);
|
||
}
|
||
int rnd=0, nowTime=0, id=0;
|
||
#if _ATTESTAION_ID == 1
|
||
char ip[256]="192.168.1.11";
|
||
#else
|
||
|
||
char ip[64]="abc.17chsa.com";
|
||
|
||
if(ip[0] != 'a'
|
||
|| ip[1] != 'b'
|
||
|| ip[2] != 'c'
|
||
|| ip[3] != '.'
|
||
|| ip[4] != '1'
|
||
|| ip[5] != '7'
|
||
|| ip[6] != 'c'
|
||
|| ip[7] != 'h'
|
||
|| ip[8] != 's'
|
||
|| ip[9] != 'a'
|
||
|| ip[10] != '.'
|
||
|| ip[11] != 'c'
|
||
|| ip[12] != 'o'
|
||
|| ip[13] != 'm'){
|
||
exit(0);
|
||
}
|
||
|
||
#endif
|
||
int svfd = connectHost( ip, 8888);
|
||
if(svfd == -1){
|
||
return 0;
|
||
}
|
||
|
||
|
||
fd_set rfds, wfds , efds;
|
||
struct timeval tmv;
|
||
FD_ZERO( &rfds );
|
||
FD_ZERO( &wfds );
|
||
FD_ZERO( &efds );
|
||
FD_SET( svfd , &rfds );
|
||
FD_SET( svfd , &wfds );
|
||
FD_SET( svfd , &efds );
|
||
tmv.tv_sec = tmv.tv_usec = 0;
|
||
int ret = select( svfd + 1 , &rfds,&wfds,&efds,&tmv );
|
||
if( ret > 0 && svfd > 0) {
|
||
if( FD_ISSET( svfd , &wfds ) ){
|
||
char mess[1024];
|
||
char token[1024];
|
||
char mac[64];
|
||
srand((int)time(0));
|
||
rnd = rand();
|
||
nowTime = ( int ) time( NULL );
|
||
id = _ATTESTAION_ID;
|
||
#if _ATTESTAION_ID == 21
|
||
id = -21;
|
||
#endif
|
||
#if _ATTESTAION_ID == 28
|
||
id = -28;
|
||
#endif
|
||
{
|
||
struct ifreq ifreq;
|
||
int sock;
|
||
|
||
if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
|
||
{
|
||
perror("socket");
|
||
return 2;
|
||
}
|
||
strcpy(ifreq.ifr_name,"eth0");
|
||
if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0)
|
||
{
|
||
perror("ioctl");
|
||
return 3;
|
||
}
|
||
|
||
sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x",(unsigned char)ifreq.ifr_hwaddr.sa_data[0],
|
||
(unsigned char)ifreq.ifr_hwaddr.sa_data[1],
|
||
(unsigned char)ifreq.ifr_hwaddr.sa_data[2],
|
||
(unsigned char)ifreq.ifr_hwaddr.sa_data[3],
|
||
(unsigned char)ifreq.ifr_hwaddr.sa_data[4],
|
||
(unsigned char)ifreq.ifr_hwaddr.sa_data[5]);
|
||
}
|
||
sprintf(token, "%d;%d;%d;%s;%s;%s;saac", nowTime , rnd, id ^ rnd ^ nowTime, name, passwd, mac);
|
||
|
||
int hash = hashpjw(token);
|
||
sprintf(mess, "%d|%s", hash, token);
|
||
|
||
send(svfd,mess,strlen(mess)+1,0);
|
||
}
|
||
}
|
||
|
||
char buf[1024];
|
||
memset( buf, 0, sizeof( buf ) );
|
||
ret = read( svfd, buf, sizeof( buf ) );
|
||
if( ret > 0 ) {
|
||
int retid;
|
||
char token[1024];
|
||
char tmp[1024];
|
||
int hash;
|
||
memset( tmp, 0, sizeof( tmp ) );
|
||
memset( token, 0, sizeof( token ) );
|
||
easyGetTokenFromBuf( buf, "|", 1, tmp, sizeof(tmp));
|
||
hash = atoi(tmp);
|
||
easyGetTokenFromBuf( buf, "|", 2, tmp, sizeof(tmp));
|
||
if(hash != hashpjw(tmp)){
|
||
return 0;
|
||
}
|
||
easyGetTokenFromBuf( tmp, ";", 1, token, sizeof(token));
|
||
retid = atoi(token);
|
||
|
||
if((retid ^ (nowTime % 1234321) ^ (rnd % 123321)) == id){
|
||
return 1;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|