/*** Retorna o nome do cliente que instalou o produto. ***/ char* GetName() { // Nao preciso de variavel estatica auxiliar pois na // estrutura ja tem o \0. Nao preciso calcular os des- // locamentos aqui. if( !iIsDecrypt ){ return( NULL ); } return( NOME( str_pers ) ); }
u_ocor(char *pre, char *pos) { char *q, *get_rand(); int i, u, n, j, max, seq, nseq; OSET r, x, *p = &set_aux; seq = 0; troca = OP_1_CAST; por = OP_1_CAST; Operador = U_OCOR; if (g_tab_operador[Operador].percent==0) return; set_new_inic(&r,"char\0unsigned char\0int\0float\0unsigned\0unsigned int\0short\0short int\0long\0long int\0unsigned long\0unsigned long int\0double\0long float\0"); set_new_inic(&x, "char\0unsigned char\0int\0float\0unsigned\0short\0long\0unsigned long\0double\0"); u = sym.no; max = g_tab_operador[Operador].maximum; if (max ==0) max--; if (expre_pos.topo >= 0) { ex_aux = expre_pos; for (i = 0; i <= ex_aux.topo; i++) { /* procura operador do tipo desejado */ if (ex_aux.no[i].tipo != troca || set_inn(&r, NOME((&ex_aux), i)) < 0) continue; set_dup(&x, p); nseq = set_card(p); for (n = max, q = get_rand(p, Operador); q != NULL && n != 0; q = get_rand(p, Operador),n--) { /* troca pelos outros operadores */ if (expre_pos.no[i].tipo == por && strcmp(NOME((&expre_pos), i), q) == 0) { n++; continue; } seq = set_inn(&x, q); expre_pos.no[i].tipo = por; expre_pos.no[i].nome = expre_pos.livre; strcpy(&(expre_pos.buf[expre_pos.livre]), q); expre_pos.livre += strlen(q)+1; if (expre_valida(&expre_pos)) { monta_in_expre(&expre_pos, 0, expre_pos.topo); /* monta infixa */ strcpy(bufmen, pre); strcat(bufmen, expre_pos.buf); sprintf(bufmen, "%s %s ",pre, expre_pos.buf); strcat(bufmen, pos); add_descritor(sym.inicio, sym.comprimento, u, bufmen); sorteia_grupoU(Operador, Seq[Operador] + seq); } else n++; expre_pos = ex_aux; } set_free(p); Seq[Operador] += nseq; } set_free(&r); set_free(&x); } }
/*** Personaliza um arquivo dado. Parametros: FileName: Nome do arquivo a personalizar Name: Nome do usuario Company: Nome da compania Serial: Serial Number ActKey: Chave de ativacao Inportante: · O número serial deve estar na forma 11.222222.3333.444444 com pontos separando os campos. Ele deve sempre ter o strlen() <= 32. . O campo 1 eh de tamanho fixo. Os demais sao de tamanho variavel ate o limite maximo de 32 caracteres. · 11 = tipo da cópia · 222222 = Data. Se começar com número > 0 é data absoluta. Se começar (ATENCAO) com 0 é time bomb e se começar com letra indica cópia não demo. · 3333 = Número de terminais · 444444 = Um número serial Retorna: PE_DATA: Chave com data absoluta ja expirou PE_TYPE: Tipo nao bate PE_ACTKEY: Chave de ativacao nao bate PE_SERIAL: Numero de serie com formacao ou tamanho errado PE_PARAM: Parametros invalidos PE_TIMEBOMB: Tentando personalizar copia time-bomb de novo. Deve Re-instalar PE_LOCALIZA: Nao achou marca no arquivo PE_POSERROR: Falhou no seek PE_WRITEERROR: Falhou ao tentar escrever no arquivo PE_OK: Ok ***/ int Personalize( char *szFileName, char *szName, char *szCompany, char*szSerial, char *szActKey ) { char data_hoje[MAXDATAINST+1]; time_t time_aux; FILE *fp; int check = 0; char data[MAXDATA+1]; char szBufAux[MAXDATA+1]; struct tm *dma; long tloc; if( szFileName == NULL || szName == NULL || szCompany == NULL || szSerial == NULL || szActKey == NULL ){ return( PE_PARAM ); } if( strlen( szSerial ) > MAXSIZESERIAL ){ return( PE_SERIAL ); } if( !ValidKey( szSerial, szActKey ) ){ return( PE_ACTKEY ); } // Calculo os deslocamentos variaveis em relacao ao serial passado if( CalculaDeslocamentos( szSerial ) != PE_OK ){ return( PE_SERIAL ); } // Verifico se eh uma data absoluta e se ja expirou. if( isdigit( szSerial[DESLOCDATA] ) && szSerial[DESLOCDATA]>'0' ){ /* Eh uma copia demo com data absoluta. VAMOS VERIFICAR!!! */ time( &tloc ); dma = localtime( &tloc ); sprintf( szBufAux, "%04.2d%02.2d", dma->tm_year + 1900, dma->tm_mon + 1 ); // MAXDATA deve ser 6 ; yyyymm. Assim mesmo nos protegemos procurando o '.' istrncpychar( data, szSerial+DESLOCDATA, MAXDATA, '.' ); if( strncmp( szBufAux, data, MAXDATA ) > 0 ) { return( PE_DATA ); } } /* procura a estrutura str_pers */ if( (fp = localiza( szFileName, str_pers )) == NULL ) { return( PE_LOCALIZA ); } // Verifico TIPO da copia antes de decriptografar pois esta em // area nao criptografada. if( strncmp( TIPO( str_pers ), szSerial+DESLOCTIPO, MAXTIPO ) != 0 ){ return( PE_TYPE ); } if( PERS( str_pers ) == PE_PERS ) { /* Jah passou o "person" por aqui antes. * decriptografo a estrutura, para nao perder as * demais informacoes nela contidas: data_instalacao, num_serie, etc. */ Decriptografa( DATAINST(str_pers), CHECKSUM( str_pers ) ); iIsDecrypt = TRUE; } if( szSerial[DESLOCDATA] == '0' ){ // Eh um numero de serie time-bomb if( PERS( str_pers ) == PE_PERS ){ /* Tentando fazer person de time bomb sobre uma copia * previamente personalizada. Nao deixo!!!! Que o filho * da mae re-instale o produto. */ fclose( fp ); return( PE_TIMEBOMB ); } } // Posiciono no inicio da marca para gravar estrutura de // personalizacao if( fseek( fp, lPosicao, 0 ) == -1 ) { fclose( fp ); return( PE_POSERROR ); } // Monto a estrutura de personalizacao time_aux = time( &time_aux ); strftime( data_hoje, sizeof( data_hoje ), "%Y%m%d", localtime( &time_aux ) ); istrncpy( DATAINST( str_pers ), data_hoje, MAXDATAINST ); istrncpy( NOME( str_pers ), szName, MAXNOME ); istrncpy( NAMECOMPANY( str_pers ), szCompany, MAXCOMPANY ); istrncpy( SERIE( str_pers ), szSerial, MAXSIZESERIAL ); // O tipo da copia ja vem pre-gravado e nao preciso colocar. /* indica que o produto estah personalizado */ PERS( str_pers ) = PE_PERS; check = Criptografa( DATAINST( str_pers ), CHECKSUM( str_pers ) ); CHECKSUM( str_pers )[ 0 ] = ( check & 0xFF00 ) >> 8; CHECKSUM( str_pers )[ 1 ] = ( check & 0x00FF ); if( fwrite( (char *) str_pers, sizeof str_pers, 1, fp ) != 1 ) { fclose( fp ); return( PE_WRITEERROR ); } fclose( fp ); return( PE_OK ); }
void DirVarRepLoc(char *pre, char *pos) { SIMBOLO *q, *var_get_rand(); int i, j, n, max, seq, nseq; int u, k, t; VAR_SET *p = &var_set_aux, *r; char *var_name; Operador = DIR_VAR_REP_LOC; if (g_tab_operador[Operador].percent == 0) return; u = sym.no; max = g_tab_operador[Operador].maximum; if (max == 0) max--; if (expre_pos.topo >= 0) { expre_completa(&expre_pos); /* completa expressao */ ex_aux = expre_pos; for (i = 0; i <= expre_pos.topo; i++) { /* procura referencia do tipo desejado */ j = root_of_ref(&expre_pos, i); if ( j < 0 || expre_pos.no[j].tipo != VARIAVEL || ! e_interface(NOME((&expre_pos), j)) ) continue; expre_exec_tipo(&expre_pos, expre_pos.no[i].final, i, tipo, ptar); r = &setL; var_set_dup(r, p); nseq = var_set_card(p); for (n = max,q = var_get_rand(p, Operador); n != 0 && q != NULL; q = var_get_rand(p, Operador), n--) { if ( ! compara_tipos(tipo, ptar, q->tipo, q->ptar)) { n++; continue; } seq = var_set_inn(r, q->nome); expre_substitui(&expre_pos, i, q->nome, VARIAVEL); if (! expre_valida(&expre_pos) || compara_expre(&expre_pos, &ex_aux)) { n++; expre_pos = ex_aux; continue; } monta_in_expre(&expre_pos, 0, expre_pos.topo); sprintf(bufmen, "%s IF_MUTA(%s, ", pre, expre_pos.buf); expre_pos = ex_aux; monta_in_expre(&expre_pos, 0, expre_pos.topo); strcat(bufmen, expre_pos.buf); strcat(bufmen, ")"); strcat(bufmen, pos); add_descritor(sym.inicio, sym.comprimento, u, bufmen); sorteia_grupo1(Operador, Seq[Operador]+seq); expre_pos = ex_aux; } var_set_free(p); Seq[Operador] += nseq; } }