LINUX.ORG.RU

MD5 без определённого куска файла

 , ,


0

1

Как бы мне через C сделать проверку кэша своего бинарного файла, но без определённого промежутка hex-символов? Этот промежуток будет использоваться для задания сравниваемой хэш суммы (сгенерирую другим бинарником и помещу туда через hex редактор), которая тоже будет расчитана без этого фрагмента и зашифрована. Не хочу создавать второй файл с проверкой и привлекать к нему внимание, а просто хочу спрятать код в гигантских дебрях своей программы (сам сравниваемый образец будет зашифрован, чтобы нельзя было ничего там изменить, даже если кто-то его найдёт).

Нужна функция, которая будет вычислять md5 во всех байтах кроме определённого пула адресов.

Так я хоть избавлюсь от халявщиков, которые меняют автора в моей программе и выкладывают на youtube, при том что меня вообще почти никто не знает в интернете, а их очень даже узнают, и верят, что это их программа, автор то изменён.

Когда-то давно делал такое следующим образом: в программе объявлял константную строку такой длинны чтобы в неё влезал хэш и заполнял её всю одним символом (пусть будет буква A). Потом написал вторую программу, которая умела открывать бинарь, читать с него все данные кроме «AAAA…AA» и скармливать их в расчёт хэша, а полученный хэш писать в исходный файл на место этой строки. Соответственно основная прога после запуска так же открывала свой бинарь, читала все данные кроме хэша (пропускался просто сравнением с хэшом из константы), считала хэш и сравнивала. Делалось всё это на Qt.

Но защита, прямо скажу, такая себе, поломать её не будет очень долго.

dyb4hzvo ()
Ответ на: комментарий от gradle

Можно запустить под отладкой, посмотреть на каком месте завершается и почему, самому посчитать хэш и переписать его. Меняют же как-то плагиатчики твои в бинаре автора.

dyb4hzvo ()
Ответ на: комментарий от gradle

Ты прогу свою точно сам написал?)

У тебя строка «AAA..AA». Если встречаешь такое - пропускаешь.

Тоже и с хэшом в самой проге при запуске, ищешь «abd124556778» или что там будет и пропускаешь.

dyb4hzvo ()
Последнее исправление: dyb4hzvo (всего исправлений: 1)
Ответ на: комментарий от dyb4hzvo

Ты меня кажется не понял, я уже сказал, эта хэшсумма будет зашифрована моим собственным шифром, функция будет спрятана в самом неожиданном месте, названия переменных будут удалены, название функции будет непримечательным, а программа вместо закрытия продолжит работать, но сегфолтнится в другом месте в течение загрузки, чтобы невозможно было найти причину. И вообще, я собираю программу с такими флагами, которые делают отладку невозможной, забыл название.

gradle ()
Ответ на: комментарий от gradle

Тогда примеры чего тебе нужны? Как взять и вырезать из бинаря кусок? Ну давай ты расскажешь нам что за прога и где её скачать на ютубе, а я напишу тебе вырезатель куска?

dyb4hzvo ()
Ответ на: комментарий от gradle

Ты не можешь открыть файл на чтение как поток hex-символов и прочитать его в массив чаров, скипая определенные заранее заданные последовательности символов? Ты точно сам писал свою прогу?

leave ★★★★★ ()
Ответ на: комментарий от gradle

С файлами я вообще почти не знаком, использовал для их открытия функции qt

У меня нет большого опыта в C, я понятия не имею о его функциях, типах и т.д, поэтому ищу образец.

Ты определись, у тебя C или C++?

а не какие-то там массивы, ещё и символов вместо байтов.

Ты открываешь файл и потом ЧИТАЕШЬ ЕГО СОДЕРЖИМОЕ. Например, так https://doc.qt.io/qt-5/qdatastream.html

leave ★★★★★ ()
Ответ на: комментарий от gradle

Ваааау, а что я предлагаю? Пропустить кусок в котором хэш лежит считав всё остальное. Мотвация у меня одна - хочу посмотреть на твоё творение, должно быть забавно. Не хочешь сотрудничать - досвидос.

dyb4hzvo ()
Ответ на: комментарий от gradle

будет вычислять MD5 из СОБСТВЕННОГО БИНАРНИКА без ОПРЕДЕЛЁННЫХ АДРЕСОВ.

Мож всё-таки стоит вычислять MD5 только каких-то определённых строк в программе?

anonymous ()

Нужна функция, которая будет вычислять md5 во всех байтах кроме определённого пула адресов.

Тебе исходники для подсчета md5 нужны? Вот первое попавшееся нагуглил: https://openwall.info/wiki/people/solar/software/public-domain-source-code/md5

Сперва инициализируешь структуру с помощью MD5_Init, затем в MD5_Update пихаешь данные в нужном тебе порядке, и в конце вызываешь MD5_Final.

V1KT0P ★★ ()
Ответ на: комментарий от gradle

На тебе образец, не забудь рассказать о результатах.

#define _GNU_SOURCE
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

void fail(void);
void hashprotect(void);

int main(int argc, char **argv)
{
	hashprotect();

	printf("АФФТАР - АНОНИМУС\n");
	return 0;
}

void hashprotect(void)
{
	static char *mask = "maxcom, СЦУКО, ПОСТАВЬ ЧЕЛОВЕЧЕСКУЮ КАПЧУ.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
	size_t prefix_len = strlen(mask);

	FILE *me = fopen("/proc/self/exe", "r");
	if (!me) fail();

	MD5_CTX hashctx;
	if (!MD5_Init(&hashctx)) fail();

	unsigned char buf[1024];
	size_t buf_cap = 1024;
	size_t buf_len = 0;

	unsigned char expected[16];
	bool found = false;

	while ((buf_len = fread(buf, 1, buf_cap, me)) != 0) {
		unsigned char *pos = memmem(buf, buf_len, mask, prefix_len);
		if (pos && ((pos - buf) < (buf_len - prefix_len - 17))) {
			unsigned char *first_ptr = buf;
			size_t first_len = pos - buf + prefix_len + 1;
			unsigned char *second_ptr = first_ptr + first_len + 16;
			size_t second_len = buf_len - first_len - 16;
			if (!MD5_Update(&hashctx, first_ptr, first_len)) fail();
			if (!MD5_Update(&hashctx, second_ptr, second_len)) fail();
			memcpy(expected, pos + prefix_len + 1, 16);
			found = true;
		} else {
			size_t min = (buf_len < (buf_cap << 1)) ? buf_len : (buf_cap << 1);
			if (!MD5_Update(&hashctx, buf, min)) fail();
			if (buf_len > (buf_cap << 1)) {
				long of = (buf_cap << 1) - buf_len;
				if (fseek(me, of, SEEK_CUR) == -1) fail();
			}
		}
	}
	
	fclose(me);

	if (!found) fail();

	unsigned char hash[16];
	if (!MD5_Final(hash, &hashctx)) fail();
/*
	printf("expected:   ");
	for(int i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", expected[i]);
	printf("\n");

	printf("calculated: ");
	for(int i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", hash[i]);
	printf("\n");
*/
	if (memcmp(hash, expected, 16) != 0) fail();
}


void fail(void)
{
	printf("ПОШЁЛ ОТСЮДО, СЦУКО\n");
	exit(1);
}
anonymous ()