Строки отсутствуют в скомпилированном .exe в Visual Studio - PullRequest
0 голосов
/ 16 мая 2018

Я занимаюсь реверс-инжинирингом программного обеспечения. Я использую Microsoft Visual Studio. Я создал пустой проект, а затем создал пустой файл, который я назвал main.cpp. Затем я написал следующий код, скомпилированный

int main()
{
    char* str = "hello matthew";

    int x = 15;

    return 0;
}

Когда я перенес релизную версию исполняемого файла в BinText и IdaPro, строка «привет, Мэтью» не была найдена. Я также никогда не смогу найти значение 15 ни в базе 10, ни в шестнадцатеричном формате.

Я не могу понять реверс-инжиниринг, если не могу найти ссылки на значения, которые ищу в исполняемом файле.

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

1 Ответ

0 голосов
/ 16 мая 2018

Я не могу понять реверс-инжиниринг ...

Первый шаг - понять, как создана программа.

Прежде чем вы сможете понять, как отменить программу, вы должны понять, как она компилируется и собирается; обращение двоичного файла, созданного для Windows, сильно отличается от обращения двоичного файла для системы * nix.

К тому же, поскольку вы используете Visual Studio, вы можете увидеть этот ответ (вариант 2) , объясняющий, как включить вывод сборки в вашем коде. В качестве альтернативы, если вы компилируете через командную строку, вы можете передать /FAs и /Fa, чтобы сгенерировать сборку, встроенную в источник.

Ваш код производит следующую сборку:

; Listing generated by Microsoft (R) Optimizing Compiler Version 18.00.40629.0 

    TITLE   C:\Code\test\test.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

CONST   SEGMENT
$SG2548 DB  'hello matthew', 00H
CONST   ENDS
PUBLIC  _main
; Function compile flags: /Odtp
; File c:\code\test\test.cpp
_TEXT   SEGMENT
_x$ = -8                        ; size = 4
_str$ = -4                      ; size = 4
_main   PROC

; 2    : {

    push    ebp
    mov ebp, esp
    sub esp, 8

; 3    :     char* str = "hello matthew";

    mov DWORD PTR _str$[ebp], OFFSET $SG2548

; 4    : 
; 5    :     int x = 15;

    mov DWORD PTR _x$[ebp], 15          ; 0000000fH

; 6    : 
; 7    :     return 0;

    xor eax, eax

; 8    : }

    mov esp, ebp
    pop ebp
    ret 0
_main   ENDP
_TEXT   ENDS
END

Хотя это полезно для понимания того, как и что делает ваш код, один из лучших способов начать реверсирование - это сгенерировать двоичный файл в отладчике, например, присоединить Visual Studio к исполняемому файлу и просмотреть сборку как программу. работает.

Это может зависеть от того, что вы после, поскольку двоичный файл потенциально может быть запутан; это значит, что в двоичном файле могут быть строки, но они могут быть зашифрованы или просто зашифрованы так, чтобы их нельзя было прочитать, пока они не будут расшифрованы / расшифрованы какой-либо функцией в двоичном файле.

Так что простой поиск строк не обязательно даст вам что-либо, а попытка найти конкретное двоичное значение в собранном коде - это все равно, что найти иголку в стопке игл. Знайте, почему вы пытаетесь обратить программу назад, а затем атаковать этот вектор.

Кто-нибудь знает, почему я не могу найти эту строку или значение 15 в исполняемом файле, когда разбираю его?

Как уже упоминалось, и, как вы уже догадались, искомый двоичный файл, который вы просматриваете, был оптимизирован, и компилятор просто удалил неиспользуемые переменные, поэтому сборка по существу возвращала 0.

Надеюсь, это поможет.

...