Как целые числа хранятся в двоичном файле после компиляции? - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь создать программу, которая может изменять скомпилированный (или эквивалентный) файл. Проблема в том, чтобы найти различные значения в скомпилированном файле, мне удается найти строковые значения, но не целочисленные значения.

Что я сделал до сих пор, так это то, что я беру скомпилированный файл в качестве входных данных и создаю новый файл, «читаемый человеком», в основном я читаю байт за байтом скомпилированного файла и записываю каждый байт в новый файл как строка битов, например, байт в исходном файле со значением 124 становится «01111100» в новом файле. Кажется, это работает нормально, я могу выполнить обратную операцию над «читаемым человеком» файлом и запустить его.

#include <stdlib.h>
#include <stdio.h>

int main()
{
    printf("Hello world!\n");
    return 0;
}

Например, если я скомпилирую и переведу выходной файл с кодом выше, я найду последовательность битов, соответствующую "Hello world! \ N".

Но в приведенном ниже коде при переводе выходного файла после его компиляции я не могу найти что-то, соответствующее 3000 (ищу ли я целое число или строку, соответствующую 3000).

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int x = 3000;
    printf("%d", x);
    return 0;
}

До сих пор я предполагаю, что 3000 написано таким образом, о котором я не знаю. Хотя в равной степени возможно, что я делаю что-то не так в процессе перевода. До сих пор я пытался найти 3000 с двумя следующими последовательностями битов:

  • как целое число 00001011 10111000
  • в виде строки 00110011 00110000 00110000 00110000

Редактировать: может быть важно подчеркнуть, что я компилирую с флагом отсутствия оптимизации -O0.

1 Ответ

4 голосов
/ 24 марта 2019

Вы, вероятно, на машине Intel, которая хранит целые числа в порядке с прямым порядком байтов. Вам нужно будет найти 10111000 00001011 (записано в двоичном формате - байты в обратном порядке по сравнению с тем, что вы использовали ранее) или 0xB8 0x0B в шестнадцатеричных байтах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...