Определите адрес, который будет изменен после компиляции программы на C - PullRequest
0 голосов
/ 30 августа 2018

У меня есть небольшой пример программы на С:

#include <stdio.h>

#define CIAO 0x15151515;
#define PROVA 0x14141414;

int main(){
    unsigned char *ptr = (unsigned char *)CIAO;
    long int nbytes = PROVA;

    long int i;

    int cpt = 0;

    char key[] = { 'a','b','a','b','a','b','a','b','\0' };
    int keyLength = 8;

    for (i = 0; i < nbytes; i++){
        ptr[i] = ptr[i] ^ key[cpt];
        cpt = cpt + 1;
        if (cpt == keyLength)
            cpt = 0;
    }
    return 0;
}

Моя цель - скомпилировать его, а затем с помощью HexEditor найти конкретные значения 0x15151515 и 0x14141414 и заменить их другим значением.

Я пробовал с другой программой меньшего размера, мне удалось сделать это действительно легко. Используя это вместо этого у меня возникли некоторые проблемы. 0x15151515 написано как 0x16151515, и я искал 0x14141414, но мне не удалось найти ничего подобного.

Вот соответствующий шестнадцатеричный вид exe: https://pastebin.com/dLi4tfU5

Есть ли у вас какие-либо понятия о том, почему иногда написанное значение меняется? Есть ли способ избежать этого и быть уверенным, что всякий раз, когда я пишу "CIAO", в exe, который рассматривается как hex, я всегда найду 0x15151515?

p.s. Я знаю, что это не то, что вы обычно должны делать, и, конечно, я знаю, что редактирование exe может привести к неожиданному поведению программы. Я просто делаю это для удовольствия

1 Ответ

0 голосов
/ 30 августа 2018

Оптимизирующий компилятор может вносить изменения в константы в вашем коде.

Вы можете использовать ключевое слово volatile в качестве подсказки компилятору о том, что значение переменной может быть изменено или доступно для чего-то внешнего для самой программы, и, таким образом, во избежание его чрезмерной оптимизации:

#include <stdint.h>

volatile const uint32_t CIAO = 0x15151515;
volatile const uint32_t PROVA = 0x14141414;

Попробуйте заменить свои операторы #define этим кодом, а затем откройте двоичный файл и найдите эти значения.

...