0

目前正在尝试使用 g++ -o crack crack2.c -lcrypt -lpthread -lmalloc并正在编译该程序:

z@ubuntu:~/Desktop$ g++ -o crack crack2.c -lcrypt -lpthread -lmalloc

/usr/bin/ld: cannot find -lmalloc

collect2: error: ld returned 1 exit status

所以..如果我删除-lmalloc,我得到undefined reference to 'passwordLooper(void*)'.

真的不确定如何解决这个问题。它必须与 malloc 或 -lmalloc 相关,因为在我使用 malloc() 之前,一切都按预期工作并且程序已编译。

/*
crack.exe
*/
/*  g++ -o crack crack.c -lcrypt -lpthread -lmalloc */
//define _GNU_SOURCE
#include <malloc.h>

#include <crypt.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <string.h>
#include <math.h>



void *passwordLooper(void *passwordData);
//void *threadFunction(void *threads);
typedef struct{
    int keysize;
    char *target;
    char *salt;
}passwordData;

int main(int argc, char *argv[]){           /* usage = crack threads keysize target */
    int i = 0;
    /*  arg[0] = crack, arg[1] = #of threads arg[2] = size of password, arg[3] = hashed password being cracked */

    if (argc !=  4) {
        fprintf(stderr, "Too few/many arguements give.\n");
        fprintf(stderr, "Proper usage: ./crack threads keysize target\n");
        exit(0);
    }

    int threads = *argv[1]-'0';         // threads is now equal to the second command line argument number
    int keysize = *argv[2]-'0';         // keysize is now equal to the third command line argument number
    char target[9]; 
    strcpy(target, argv[3]);
    char salt[10];

    while ( i < 2 ){            //Takes first two characters of the hashed password and assigns them to the salt variable
        salt[i] = target[i];
        i++;
    }


    printf("threads = %d\n", threads);      /*used for testing */
    printf("keysize = %d\n", keysize);
    printf("target = %s\n", target);        
    printf("salt = %s\n", salt);        


    if (threads < 1 || threads > 8){
        fprintf(stderr, "0 < threads <= 8\n");
        exit(0);
    }                                               /*Checks to be sure that threads and keysize are*/
    if (keysize < 1 || keysize > 8){                                                /*of the correct size   */
        fprintf(stderr, "0 < keysize <= 8\n");
        exit(0);
    }

    pthread_t t1,t2,t3,t4,t5,t6,t7,t8;

    struct crypt_data data;
    data.initialized = 0;
    //~ passwordData.keysize = keysize;
    //~ passwordData.target = target;
    //~ passwordData.salt = salt;

    passwordData *pwd = (passwordData *) malloc(sizeof(pwd));
    pwd->keysize = keysize;
    pwd->target = target;
    pwd->salt = salt;


    //~ if ( threads = 1 ){
        //~ pthread_create(&t1, NULL, *threadFunction, threads);
    //~ }


    char unSalted[30];
    int j = 0;
    for (i = 2; target[i] != '\0'; i++){        /*generates variable from target that does not include salt*/
        unSalted[j] = target[i];
        j++;
    }
    printf("unSalted = %s\n", unSalted); //unSalted is the variable target without the first two characters (the salt)

    char password[9] = {0};
    passwordLooper(pwd);


}




/*_____________________________________________________________________________________________________________*/
/*_____________________________________________________________________________________________________________*/
void *passwordLooper(passwordData *pwd){
    char password[9] = {0};
    int result;

    int ks = pwd->keysize;
    char *target = pwd->target;
    char *s = pwd->salt;

    for (;;){
        int level = 0; 
        while (level < ks && strcmp( crypt(password, s), target ) != 0) {
            if (password[level] == 0){
                password[level] = 'a';
                break;
            }
            if (password[level] >= 'a' && password[level] < 'z'){
                password[level]++;
                break;
            }
            if (password[level] == 'z'){
                password[level] = 'a';
                level++;
            }
        }

        char *cryptPW = crypt(password, s);
        result = strcmp(cryptPW, target);

        if (result == 0){               //if result is zero, cryptPW and target are the same
            printf("result = %d\n", result);
            printf ("Password found: %s\n", password);
            printf("Hashed version of password is %s\n", cryptPW);
            break;  
        }
        if (level >= ks){           //if level ends up bigger than the keysize, break, no longer checking for passwords
            printf("Password not found\n");
            break;
        }
    }
    exit(0);
}
4

1 回答 1

2

您的代码似乎是纯 C。您应该使用 gcc 而不是 g++ 编译它。

malloc函数<stdlib.h>在标准 C 库中声明和实现。您不需要#include <malloc.h>-lmalloc

您的passwordLooper函数有两个不一致的声明。您的“前向声明”:

void *passwordLooper(void *passwordData);

与定义不符:

void *passwordLooper(passwordData *pwd){
    /* ... */
}

的“前向声明”passwordLooper需要遵循 type 的定义passwordData

你有这一行:

//define _GNU_SOURCE

您需要取消注释:

#define _GNU_SOURCE

使类型struct crypt_data可见。

当我进行所有这些更改时,我可以编译它(至少在我的系统上):

gcc c.c -o c -lcrypt
于 2013-09-29T20:17:54.553 回答