Meu primeiro programa

1. Meu primeiro programa

Renan Novaes
zerotres

(usa Outra)

Enviado em 22/05/2013 - 18:16h

Bom, não estou fazendo nenhum tipo de curso técnico, quanto mais faculdade. Resolvi abrir um livro de C e estudar. Meu primeiro programa, está sendo esse gerador de wordlists pra quem gosta de brincar com o aircrack, hydra e outras coisas mais e precisam de uma lista de senhas.
Se alguém conhece esses programas, gostaria que avaliassem o simples resultado e o código. Oque mudariam, oque está errado. Meu primeiro programa tosco e ainda não está acabado claro:


/* Opções do programa:
wlfilter <wordlist.txt> [opções]
-min valor
-max valor
-f --format
-w --write saída.txt
-h --help

Programa: wlfilter.c
Escrito por: Renan Novaes - zerotres.br@gmail.com
Data: 11/05/2013 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <ctype.h>
#include <wchar.h>
#include <wctype.h>

#define VERSAO "0.2"

struct indice {
unsigned int tamanhoDaPalavra;
unsigned int posicaoNoArquivo;
unsigned int elementoCompativel;
} *indice;

const unsigned int COMPRIMENTO_MINIMO = 1;
const unsigned int COMPRIMENTO_MAXIMO = 128;
unsigned int min, max;

int obter_palavra(FILE *fp, wchar_t *string) {

/* Percorre o arquivo a procura da primeira palavra */
while (!iswgraph(*string = fgetwc(fp)))
if (feof(fp)) return EOF; /* Atingiu o fim do arquivo */

/* Grava a palavra na string passada por
referência até encontrar um caractere de espaço */
while (iswgraph(*string)) {
*(++string) = fgetwc(fp);
}

*string = '{TEXTO}'; /* Troquem por barra zero se o viva o linux trocar por {TEXT} */
return wcslen(string);
}

int gerar_senhas(FILE *fp) {
wchar_t string[COMPRIMENTO_MAXIMO];
wchar_t strBase[COMPRIMENTO_MAXIMO];
wchar_t strSenha[COMPRIMENTO_MAXIMO]; /* Contém o resultado de cada mixagem */

fprintf(stderr, "Gerando senhas\n");

int contador = 0;

while (obter_palavra(fp, strBase) != EOF) {
contador = ftell(fp);
if ((wcslen(strBase) >= min) && (wcslen(strBase) <= max))
fwprintf(stdout, L"%ls\n", strBase); /* Imprime o cabeçalho */
wcscpy(strSenha, strBase);
rewind(fp);
while (obter_palavra(fp, string) != EOF) {
wcscat(strSenha, string);
if ((wcslen(strSenha) >= min) && (wcslen(strSenha) <= max))
fwprintf(stdout, L"%ls\n", strSenha); /* Imprime a senha mixada */
wcscpy(strSenha, strBase);
}
fseek(fp, contador, SEEK_SET);
}

return 0;
}

/* Extensão da função qsort em stdlib.h */
static int cmpfunc(const void *p1, const void *p2)
{
size_t tamanhoDaPalavra1 = ((const struct indice *)p1)->tamanhoDaPalavra;
size_t tamanhoDaPalavra2 = ((const struct indice *)p2)->tamanhoDaPalavra;

if (tamanhoDaPalavra1 <= tamanhoDaPalavra2)
return -1;
else if (tamanhoDaPalavra1 >= tamanhoDaPalavra2)
return 1;
}

/* Em fase de implementação */
int gerar_indice(FILE *fp) {
wchar_t string[COMPRIMENTO_MAXIMO]; /* Conterá palavras do arquivo de entrada mas não será efetivamente usado nessa função */
int numeroDePalavras = 0; /* armazena o número de palavras contidas no arquivo de entrada *fp */
int contador; /* contador de uso geral */

fprintf(stderr, "Gerando índices\n");

/* Obtem a quantidade de palavras no arquivo de entrada */
while (obter_palavra(fp, string) != EOF)
if (wcslen(string) <= max) ++numeroDePalavras;

rewind(fp); /* rebobina o arquivo */

/* Armazena memória para criar o índice */
if ((indice = (struct indice *)calloc(numeroDePalavras, sizeof(struct indice))) == NULL) {
fprintf(stderr, "Não foi possível gerar um índice. Ausência de memória.\n");
exit(EXIT_FAILURE);
}

/* Armazena as informações do indice (cria o índice) */
contador = 0;
while (obter_palavra(fp, string) != EOF)
if (wcslen(string) <= max) {
indice[contador].tamanhoDaPalavra = wcslen(string);
indice[contador].posicaoNoArquivo = ftell(fp) - indice[contador].tamanhoDaPalavra;
++contador;
}

qsort(indice, numeroDePalavras, sizeof(struct indice), cmpfunc);

/*for (contador = 0; contador < numeroDePalavras; contador++)
fprintf(stdout, "Palavra %d: Tamanho %d, Posição: %d\n", contador + 1, indice[contador].tamanhoDaPalavra, indice[contador].posicaoNoArquivo);*/

rewind(fp); /* rebobina o arquivo */
return 0;
}

int main(int argc, char *argv[]) {
FILE *fpEntrada;
int contador;

if (setlocale(LC_ALL, "") == NULL) {
printf("locale error\n");
exit(EXIT_FAILURE);
}

/* Verifica se o programa foi chamado corretamente */
if (argc < 2) {
fprintf(stdout, "Ausência de argumento\n");
exit(EXIT_FAILURE);
}

/* Verifica se o primeiro argumento é uma solicitação da versão */
if (strncmp(argv[1], "-v", 2) == 0) {
fprintf(stderr, "Wordlist Filter Versão: %s\n", VERSAO);
return 0;
}

/* Verifica se o arquivo especificado pode ser aberto para leitura */
if ((fpEntrada = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Não foi possível ler o arquivo %s\n", argv[1]);
exit(EXIT_FAILURE);
}

/* Processamento da linha de comando começa aqui */
min = COMPRIMENTO_MINIMO;
max = COMPRIMENTO_MAXIMO;

for (contador = 2; contador < argc; contador += 2) {

/* Processando a opção -min */
if (strncmp(argv[contador], "-min", 4) == 0) {

/* Verifica se há ausencia de argumento em -min */
if (argv[contador + 1] == NULL) {
fprintf(stderr, "Ausência de argumento na opção -min\n");
exit(EXIT_FAILURE);
}

min = (int)atoi(argv[contador + 1]); /* Converte o argumento de -min para um número inteiro (int) */

if (min < COMPRIMENTO_MINIMO) {
fprintf(stderr, "Necessário um valor acima de %d para -min\n", COMPRIMENTO_MINIMO - 1);
exit(EXIT_FAILURE);
}
} /* Processamento de -min termina aqui */

/* Processando a opção -max */
if (strncmp(argv[contador], "-max", 4) == 0) {

/* Verifica se há ausencia de argumento em -max */
if (argv[contador + 1] == NULL) {
fprintf(stderr, "Ausência de argumento na opção -max\n");
exit(EXIT_FAILURE);
}

max = (int)atoi(argv[contador + 1]); /* Converte o argumento de -max para um número inteiro (int) */

if (max > COMPRIMENTO_MAXIMO) {
fprintf(stderr, "Necessário um valor abaixo de %d para -max\n", COMPRIMENTO_MAXIMO + 1);
exit(EXIT_FAILURE);
}
} /* Processamento de -max termina aqui */

/* Verifica se o argumento de -min é maior que o argumento de -max */
if (min > max) {
fprintf(stderr, "Necessário que o argumento de -min seja igual ou menor que o argumento de -max\n");
exit(EXIT_FAILURE);
}

/* Funções ainda não implementadas */
if (strncmp(argv[contador], "-f", 2) == 0) {
fprintf(stderr, "-f ainda não foi implementado\n");
}
if (strncmp(argv[contador], "-w", 2) == 0) {
fprintf(stderr, "-w ainda não foi implementado\n");
}

} /* Termina o processamento da linha de comando */

//gerar_indice(fpEntrada); /* Em fase de implementação */
gerar_senhas(fpEntrada);

free(indice);
fclose(fpEntrada);

/* Finaliza o programa com sucesso */
return 0;
}

Esse programa trabalha com arquivos contendo uma lista de palavras, tal como um dicionário. Digamos que contenha duas palavras nesse arquivo:
echo dia azul > wordlist.txt
./wlfilter wordlist.txt resulta em:
diadia diaazul azuldia azulazul

O interessante é que você pode jogar esse resultado pra outro arquivo tal como
./wlfilter wordlist.txt > wordlist2.txt
./wlfilter wordlist2.txt > wordlist3.txt etc...
Aceita caracteres em qualquer idioma.


  


2. Re: Meu primeiro programa

???
gokernel

(usa Linux Mint)

Enviado em 22/05/2013 - 20:45h

Bom, passei aqui só para desejar felicidades para vc no seu aprendizado ...

Para falar a verdade estou irado neste momento por perder o meu chip no tablet de minha sobrinha que ganhou na escola ... é um da positivo e isso aumentou mais o meu desprezo pela marca ... aahzhaah RIR PARA NÃO CHORAR. ;)

INFO: o chip ficou perdido/solto dentro da "maconha".


3. Re: Meu primeiro programa

Renan Novaes
zerotres

(usa Outra)

Enviado em 22/05/2013 - 20:57h

gokernel escreveu:

Bom, passei aqui só para desejar felicidades para vc no seu aprendizado ...

Para falar a verdade estou irado neste momento por perder o meu chip no tablet de minha sobrinha que ganhou na escola ... é um da positivo e isso aumentou mais o meu desprezo pela marca ... aahzhaah RIR PARA NÃO CHORAR. ;)

INFO: o chip ficou perdido/solto dentro da "maconha".


MEU!!! KASODKASODkosa... vc colocou o chip e ele se escondeu dentro do aparelho?? Pânico pela marca. Trabalhei na produção da linha de notebooks da Samsung e cara, é grotesco a forma como os computadores vão pra caixa. Direto eu encontrava fitas e alguns cabos pra fora do computador e com uma chave de fenda, a gente jogava pra dentro de qualquer jeito, fechava e mandava pra venda.


4. Re: Meu primeiro programa

???
gokernel

(usa Linux Mint)

Enviado em 22/05/2013 - 23:42h

@zerotres:
"vc colocou o chip e ele se escondeu dentro do aparelho ??"

Ele ficou solto/jogado dentro do tablet e lógico sem reconhecer o chip.

Ainda tentei retirar balancando mas não consegui ... estou mais acalmado agora pois os meus contatos ficaram gravado no smart pois pensei que ficavam no chip.