You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C语言crypt函数时出现Segmentation Fault问题求助

解决C语言密码破解程序的段错误问题

嘿,我来帮你搞定这个段错误!从你贴的代码片段来看,有几个关键问题很可能导致了崩溃——咱们一步步拆解,把问题彻底解决。

你的代码里可能触发段错误的点

  • 没检查文件是否成功打开:你直接打开了wordlist.txt,但完全没判断fopen是不是返回了NULL。如果文件不存在、没权限或者路径不对,fopen就会返回空指针,后续对这个空指针操作肯定会触发段错误。
  • 未完成的while循环:你的代码写到while(...)就断了,要是你原本想用不安全的方式(比如无边界的fscanf)读取内容,或者循环条件写错,也会导致内存访问出错。
  • crypt函数的潜在误用:如果给crypt传了无效参数(比如格式错误的salt),或者没正确处理它的返回值,同样可能引发内存问题。

修复后的完整代码

#define _XOPEN_SOURCE
#include<stdio.h>
#include<crypt.h>
#include<unistd.h>
#include<string.h>

int main(int argc, char *argv[]) {
    // 先检查参数数量是否正确
    if(argc != 3) {
        printf("Usage: ./craken salt hash\n");
        return 1; // 用非0返回值表示错误,符合UNIX程序惯例
    }

    // 打开字典文件,必须检查是否成功
    FILE *fPointer = fopen("wordlist.txt", "r");
    if(fPointer == NULL) {
        perror("打开wordlist.txt失败");
        return 1;
    }

    char singleLine[150];
    // 用fgets安全读取每一行,避免缓冲区溢出
    while(fgets(singleLine, sizeof(singleLine), fPointer) != NULL) {
        // 去掉换行符——fgets会把换行符也读进字符串里,会导致哈希对比失败
        singleLine[strcspn(singleLine, "\n")] = '\0';

        // 用给定的salt加密当前单词
        char *hashed = crypt(singleLine, argv[1]);
        if(hashed == NULL) {
            perror("crypt函数执行失败");
            fclose(fPointer);
            return 1;
        }

        // 对比加密结果和目标哈希
        if(strcmp(hashed, argv[2]) == 0) {
            printf("找到密码:%s\n", singleLine);
            fclose(fPointer);
            return 0;
        }
    }

    // 循环结束还没找到,说明字典里没有目标密码
    printf("字典中未找到该密码。\n");
    fclose(fPointer);
    return 0;
}

关键修复说明

  • 添加文件打开检查:现在会判断fopen是否返回空指针,并用perror输出具体错误信息,彻底避免空指针操作。
  • 安全读取行内容:用fgets配合sizeof(singleLine)读取,保证不会溢出缓冲区;同时用strcspn去掉换行符,否则即使密码正确,哈希对比也会失败。
  • 处理crypt的错误返回:检查crypt是否返回空指针(比如salt格式错误时会出现),出错时先关闭文件再退出,避免资源泄漏。
  • 规范返回值:用非0值表示错误,这是UNIX程序的标准做法,方便后续脚本调用时判断执行结果。

内容的提问来源于stack exchange,提问作者Jasmeet Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:17:03