mirror of
https://github.com/albertobsd/keyhunt.git
synced 2025-03-17 21:31:49 +01:00
252 lines
6.3 KiB
C
252 lines
6.3 KiB
C
/*
|
|
Develop by Luis Alberto
|
|
email: alberto.bsd@gmail.com
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#include "util.h"
|
|
|
|
int MAXLENGTHADDRESS = 32;
|
|
|
|
void _sort(char *arr,int n);
|
|
void _insertionsort(char *arr, int n);
|
|
void _introsort(char *arr,int depthLimit, int n);
|
|
void swap(char *a,char *b);
|
|
int partition(char *arr, int n);
|
|
void heapsort(char *arr, int n);
|
|
void heapify(char *arr, int n, int i);
|
|
|
|
int main(int argc,char **argv) {
|
|
int readed;
|
|
char *line_input,*line_output,*aux;
|
|
FILE *input,*output;
|
|
int len,diff,i,count = 0;
|
|
if(argc != 3) {
|
|
printf("Usage:\n%s <input hex file> <output binay file>\n",argv[0]);
|
|
exit(0);
|
|
}
|
|
input = fopen(argv[1],"r");
|
|
output = fopen(argv[2],"wb");
|
|
line_input = malloc(1024);
|
|
line_output = malloc(MAXLENGTHADDRESS);
|
|
if(input == NULL || output == NULL || line_input== NULL || line_output == NULL ) {
|
|
printf("error fopen or malloc\n");
|
|
}
|
|
while(!feof(input)) {
|
|
aux = fgets(line_input,1024,input);
|
|
if(aux == line_input) {
|
|
trim(line_input,"\t\n\r ");
|
|
len = strlen(line_input);
|
|
if(len <= 64){
|
|
if(isValidHex(line_input)) {
|
|
if(len < 64) {
|
|
aux = malloc(65);
|
|
diff = 64 - len;
|
|
strcpy(aux+diff,line_input);
|
|
memset(aux,'0',diff);
|
|
memcpy(line_input,aux,65);
|
|
free(aux);
|
|
}
|
|
hexs2bin(line_input,(unsigned char *)line_output);
|
|
fwrite(line_output,1,MAXLENGTHADDRESS,output);
|
|
count++;
|
|
}
|
|
else {
|
|
printf("Ignoring invalid hexadecimal line: %s\n",line_input);
|
|
}
|
|
}
|
|
else {
|
|
printf("Ignoring invalid length line: %s\n",line_input);
|
|
}
|
|
}
|
|
}
|
|
fclose(input);
|
|
fclose(output);
|
|
free(line_input);
|
|
output = fopen(argv[2],"rb");
|
|
printf("Allocating memory...\n");
|
|
do {
|
|
line_input = malloc(count*MAXLENGTHADDRESS);
|
|
} while(line_input == NULL);
|
|
i = 0;
|
|
while(i < count) {
|
|
readed = fread(line_input+(i*32),1,MAXLENGTHADDRESS,output);
|
|
if(readed != MAXLENGTHADDRESS) {
|
|
fprintf(stderr,"error fread()\n");
|
|
}
|
|
i++;
|
|
}
|
|
fclose(output);
|
|
output = fopen(argv[2],"wb");
|
|
printf("File %s was create with %u records\n",argv[2],count);
|
|
printf("Sorting once... ");
|
|
_sort(line_input,count);
|
|
_insertionsort(line_input,count);
|
|
i = 0;
|
|
while(i < count) {
|
|
fwrite(line_input+(i*32),1,32,output);
|
|
i++;
|
|
}
|
|
fclose(output);
|
|
printf("ready\n");
|
|
free(line_output);
|
|
return 0;
|
|
}
|
|
|
|
|
|
void swap(char *a,char *b) {
|
|
char t[MAXLENGTHADDRESS];
|
|
memcpy(t,a,MAXLENGTHADDRESS);
|
|
memcpy(a,b,MAXLENGTHADDRESS);
|
|
memcpy(b,t,MAXLENGTHADDRESS);
|
|
}
|
|
|
|
void _sort(char *arr,int n) {
|
|
int depthLimit = ((int) ceil(log(n))) * 2;
|
|
_introsort(arr,depthLimit,n);
|
|
}
|
|
|
|
void _introsort(char *arr,int depthLimit, int n) {
|
|
int p;
|
|
if(n > 1) {
|
|
if(n <= 16) {
|
|
_insertionsort(arr,n);
|
|
}
|
|
else {
|
|
if(depthLimit == 0) {
|
|
heapsort(arr,n);
|
|
}
|
|
else {
|
|
p = partition(arr,n);
|
|
if(p >= 2) {
|
|
_introsort(arr , depthLimit-1 , p);
|
|
}
|
|
if((n - (p + 1)) >= 2 ) {
|
|
_introsort(arr + ((p+1) *MAXLENGTHADDRESS) , depthLimit-1 , n - (p + 1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void _insertionsort(char *arr, int n) {
|
|
char *arrj,*temp;
|
|
char key[MAXLENGTHADDRESS];
|
|
int j,i;
|
|
for(i = 1; i < n ; i++ ) {
|
|
j= i-1;
|
|
memcpy(key,arr + (i*MAXLENGTHADDRESS),MAXLENGTHADDRESS);
|
|
arrj = arr + (j*MAXLENGTHADDRESS);
|
|
while(j >= 0 && memcmp(arrj,key,MAXLENGTHADDRESS) > 0) {
|
|
memcpy(arr + ((j+1)*MAXLENGTHADDRESS),arrj,MAXLENGTHADDRESS);
|
|
j--;
|
|
arrj = arr + (j*MAXLENGTHADDRESS);
|
|
}
|
|
memcpy(arr + ((j+1)*MAXLENGTHADDRESS),key,MAXLENGTHADDRESS);
|
|
}
|
|
}
|
|
|
|
int partition(char *arr, int n) {
|
|
char pivot[MAXLENGTHADDRESS];
|
|
int j,i,t, r = (int) n/2,jaux = -1,iaux = -1, iflag, jflag;
|
|
char *a,*b,*hextemp,*hextemp_pivot;
|
|
i = - 1;
|
|
memcpy(pivot,arr + (r*MAXLENGTHADDRESS),MAXLENGTHADDRESS);
|
|
i = 0;
|
|
j = n-1;
|
|
do {
|
|
iflag = 1;
|
|
jflag = 1;
|
|
t = memcmp(arr + (i*MAXLENGTHADDRESS),pivot,MAXLENGTHADDRESS);
|
|
iflag = (t <= 0);
|
|
while(i < j && iflag) {
|
|
i++;
|
|
t = memcmp(arr + (i*MAXLENGTHADDRESS),pivot,MAXLENGTHADDRESS);
|
|
iflag = (t <= 0);
|
|
}
|
|
t = memcmp(arr + (j*MAXLENGTHADDRESS),pivot,MAXLENGTHADDRESS);
|
|
jflag = (t > 0);
|
|
while(i < j && jflag) {
|
|
j--;
|
|
t = memcmp(arr + (j*MAXLENGTHADDRESS),pivot,MAXLENGTHADDRESS);
|
|
jflag = (t > 0);
|
|
}
|
|
if(i < j) {
|
|
if(i == r ) {
|
|
r = j;
|
|
}
|
|
else {
|
|
if(j == r ) {
|
|
r = i;
|
|
}
|
|
}
|
|
|
|
swap(arr + (i*MAXLENGTHADDRESS),arr + (j*MAXLENGTHADDRESS) );
|
|
jaux = j;
|
|
iaux = i;
|
|
j--;
|
|
i++;
|
|
}
|
|
|
|
} while(j > i );
|
|
if(jaux != -1 && iaux != -1) {
|
|
if(iflag || jflag) {
|
|
if(iflag) {
|
|
if(r != j)
|
|
swap(arr + (r*MAXLENGTHADDRESS),arr + ((j )*MAXLENGTHADDRESS) );
|
|
jaux = j;
|
|
}
|
|
if(jflag) {
|
|
if(r != j-1)
|
|
swap(arr + (r*MAXLENGTHADDRESS),arr + ((j-1 )*MAXLENGTHADDRESS) );
|
|
jaux = j-1;
|
|
}
|
|
}
|
|
else{
|
|
if(r != j)
|
|
swap(arr + (r*MAXLENGTHADDRESS),arr + ((j )*MAXLENGTHADDRESS) );
|
|
jaux = j;
|
|
}
|
|
}
|
|
else {
|
|
if(iflag && jflag) {
|
|
jaux = r;
|
|
}
|
|
else {
|
|
if(iflag ) {
|
|
swap(arr + (r*MAXLENGTHADDRESS),arr + ((j)*MAXLENGTHADDRESS) );
|
|
jaux = j;
|
|
}
|
|
}
|
|
}
|
|
return jaux;
|
|
}
|
|
|
|
void heapify(char *arr, int n, int i) {
|
|
int largest = i;
|
|
int l = 2 * i + 1;
|
|
int r = 2 * i + 2;
|
|
if (l < n && memcmp(arr +(l*MAXLENGTHADDRESS),arr +(largest * MAXLENGTHADDRESS),MAXLENGTHADDRESS) > 0)
|
|
largest = l;
|
|
if (r < n && memcmp(arr +(r*MAXLENGTHADDRESS),arr +(largest *MAXLENGTHADDRESS),MAXLENGTHADDRESS) > 0)
|
|
largest = r;
|
|
if (largest != i) {
|
|
swap(arr +(i*MAXLENGTHADDRESS), arr +(largest*MAXLENGTHADDRESS));
|
|
heapify(arr, n, largest);
|
|
}
|
|
}
|
|
|
|
void heapsort(char *arr, int n) {
|
|
int i;
|
|
for ( i = n / 2 - 1; i >= 0; i--)
|
|
heapify(arr, n, i);
|
|
for ( i = n - 1; i > 0; i--) {
|
|
swap(arr , arr +(i*MAXLENGTHADDRESS));
|
|
heapify(arr, i, 0);
|
|
}
|
|
}
|