• XSS.stack #1 – первый литературный журнал от юзеров форума

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

ppsmoke

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

C:
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;
}
 
Они меняются не при сборе, а при загрузке. Решение очевидно: либо собирать код c директивами для генерации position independable code (PIC, зависит от компилятора), либо переписать код так, чтобы исключить обращение к внешним данным и функциям (если не ошибаюсь, обращаться к статике можно).
 
link с параметрами: /DYNAMICBASE:NO /FIXED уберет релоки
выставил, но всё равно если я, например, куда то переношу экзешник в другую папку - всё сбивается
 
выставил, но всё равно если я, например, куда то переношу экзешник в другую папку - всё сбивается
и после сборок сбивается
 
Последнее редактирование:
Они меняются не при сборе, а при загрузке. Решение очевидно: либо собирать код c директивами для генерации position independable code (PIC, зависит от компилятора), либо переписать код так, чтобы исключить обращение к внешним данным и функциям (если не ошибаюсь, обращаться к статике можно).
можно для тупых, что имеется в виду "обращаться к статике"? типо мне создать свои "static <type>" функции у которых будут неизменяемые адреса, как обертки для условных strcmp()/exit()/ и тд ?
 
Да.
спасибо за идею, мысль про статик функции натолкнула меня на передачу используемых функций как аргументов в целевую, получилось что то такое


C:
int passVerif( // crc = 4002471382
    int (*_strcmp) (const char*, const char*),
    int (*_printf) (const char*, ...),
    void (*_exit) (int),
    char* (*_cryptStr) (char*),
    char* ppw,
    char* pw,
    char* err
) {
    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(ppw, _cryptStr(pw)) != 0) {
        _printf(_cryptStr(err));
        _exit(-96);
    }
end:;
    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); //crc = 4002471382
    return size;
}

вроде всё заработало
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Теперь думай, как сделать так, чтобы не запатчили твою проверку на патчинг
 
Теперь думай, как сделать так, чтобы не запатчили твою проверку на патчинг
дык понятно что вообще всё можно запатчить, суть в том, чтобы максимально это усложнить
 
uint32_t crc = 0xFFFFFFFF;
Так тебе вот эту строчку пропатчат и даже могут подгадать, чтобы црц совпадал с оригинальным. :) Зачем вообще только часть функции пытаться сличить с оригиналом, можно же ею всю целиком передавать на проверку. Ассемблериста что-ли пустили код писать?
 
Так тебе вот эту строчку пропатчат и даже могут подгадать, чтобы црц совпадал с оригинальным.
Видно же, что это просто отработка концепции. В продакте значение CRC может быть использовано, например, в процессе выработки ключа шифрования. Таким образом, патчится в одном месте, а ломается в другом. Реверсер будет доволен результатом 😈
 
pure asm or “naked” func
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх