간단한 사용자 정의 포맷 생성 (개념적)
이 단계에서는 간단한 사용자 정의 포맷을 위한 새로운 C 소스 파일을 개념적으로 생성합니다. 이 연습은 새 포맷 파일을 어떻게 구성해야 하는지 보여줄 것입니다.
우리의 목표는 특수 접두사 labex_md5$를 가진 해시를 인식하는 포맷을 만드는 것입니다. 예를 들어, labex_md5$87e4e494b2399b0921d44e03693518f9와 같은 해시입니다.
아직 ~/project/john/src 디렉터리에 있는지 확인하십시오. 새 파일을 만들기 위해 nano 텍스트 편집기를 사용할 것입니다.
nano labex_md5_fmt_plug.c
이제 다음 C 코드를 복사하여 nano 편집기에 붙여넣으십시오. 이것은 단순화된 골격이며 완전히 기능적인 포맷은 아니지만 핵심 구성 요소를 보여줍니다.
#if FMT_EXTERNS_H
extern struct fmt_main fmt_labex_md5;
#elif FMT_REGISTERS_H
john_register_one(&fmt_labex_md5);
#else
#include <string.h>
#include "arch.h"
#include "common.h"
#include "formats.h"
#define FORMAT_LABEL "labex-md5"
#define FORMAT_NAME "LabEx Custom MD5"
#define ALGORITHM_NAME "MD5 32/64"
#define PLAINTEXT_LENGTH 32
#define BINARY_SIZE 16
#define SALT_SIZE 0
#define TAG_PREFIX "labex_md5$"
#define TAG_LENGTH (sizeof(TAG_PREFIX) - 1)
// This function checks if a hash string is valid for our format
static int valid(char *ciphertext, struct fmt_main *self)
{
if (strncmp(ciphertext, TAG_PREFIX, TAG_LENGTH))
return 0;
char *p = ciphertext + TAG_LENGTH;
if (hexlenu(p, 0) != 32)
return 0;
return 1;
}
struct fmt_main fmt_labex_md5 = {
{
FORMAT_LABEL,
FORMAT_NAME,
ALGORITHM_NAME,
BENCHMARK_COMMENT,
BENCHMARK_LENGTH,
0,
PLAINTEXT_LENGTH,
BINARY_SIZE,
BINARY_ALIGN,
SALT_SIZE,
SALT_ALIGN,
MIN_KEYS_PER_CRYPT,
MAX_KEYS_PER_CRYPT,
FMT_CASE | FMT_8_BIT,
{ NULL },
{ TAG_PREFIX },
NULL
}, {
/* init */ init,
/* done */ done,
/* reset */ reset,
/* prepare */ prepare,
/* valid */ valid,
/* split */ split,
/* binary */ binary,
/* salt */ salt,
{ NULL },
/* source */ source,
{
/* get_hash* */ get_hash_0,
/* get_hash* */ get_hash_1,
/* get_hash* */ get_hash_2,
/* get_hash* */ get_hash_3,
/* get_hash* */ get_hash_4,
/* get_hash* */ get_hash_5,
/* get_hash* */ get_hash_6
},
/* cmp_all */ cmp_all,
/* cmp_one */ cmp_one,
/* cmp_exact */ cmp_exact
}
};
#endif
코드를 붙여넣은 후 파일을 저장하고 Ctrl+X, Y, Enter를 눌러 nano를 종료하십시오.
이제 새 포맷의 소스 파일을 만들었습니다. 가장 중요한 부분은 valid() 함수로, 단순히 labex_md5$ 접두사를 확인하고 뒤따르는 해시가 32 자 길이인지 확인합니다.