Задать вопрос
@blecked88

Почему CRC участка кода меняется при перезапусках проги?

Чтобы противодействовать бинарному патчингу хочу контролировать CRC участка кода между метками begin, end. В этом участке происходит проверка пароля пользователя. Но CRC меняется при перезапусках проги (не при каждом, но меняется), так как меняются некоторые байты в этом участке кода при сборке видимо, соответственно я не могу закрепить какое то ХОРОШЕЕ значение, которое буду сравнивать с тем что выдает прога у потенциального взломщика. И смысла в таком CRC мало. Подскажите пожалуйста, что я делаю не так и как всё таки сделать так, что бы при легальном пользовании программой CRC не менялось?

int passVerif() {
    char* begin_ptr;
    char* end_ptr;

    __asm {
        lea eax, begin
        mov begin_ptr, eax
        lea eax, end
        mov end_ptr, eax
    }

    int size = (int)(end_ptr - begin_ptr);
begin:;
    if (strcmp(potentialPass, CR(",15=6!96=.\"4759=+0")) != 0) {
        printf(CR("/*76?x(9++/7*<"));
        exit(INCORRECT_PW);
    }
end:;
    printf("bytes between begin and end:\n");

    uint32_t crc = 0xFFFFFFFF;
    for (int i = 0; i < size; i++) {
        unsigned char byte = *(begin_ptr + i);

        crc ^= byte;
        for (size_t j = 0; j < 8; j++) {
            if (crc & 1) {
                crc = (crc >> 1) ^ POLYNOMIAL;
            }
            else {
                crc >>= 1;
            }
        }

        printf("%02X ", byte);
    }
    printf("\n");
    printf("CRC = %u\n", ~crc);
    return size;
}
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Дело в том, что при загрузке программы загрузчик перезаписывает в ней всякие адреса, которые используются при вызовах функций и переходах. Это нужно из-за того, что программа-то может быть загружена по произвольному адресу. А некоторые команды процессора принимают абсолютный адрес. Так же всякие техники защиты вроде ASLR тут все дополнительно портят. У вас там функции библиотеки вызываются, а где они в памяти лежат - вы заранее узнать не можете. Вот и как минимум аргументы call в памяти оказываются разными.

И защита ваша ничем не поможет, потому что можно пропатчить не только проверку пароля, но и проверку CRC.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы