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.
/* 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;
}
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta