assembly Visual Studio中已编译的.exe缺少字符串

dz6r00yl  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(129)

我正在练习逆向工程软件。我正在使用Microsoft Visual Studio。我创建了一个空项目,然后创建了一个空文件,我称之为main.cpp。然后我编写了以下代码,编译

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

    int x = 15;

    return 0;
}

当我把可执行文件的发布版本带到BinText和IdaPro时,我找不到字符串“hello matthew”,也找不到基数为10或十六进制的值15。
如果我在可执行文件中找不到对所需值的引用,我就无法开始理解逆向工程。
我的理论是,因为我的程序完全不做任何事情,编译器只是把它全部省略了,但我不确定。有人知道为什么我在反汇编可执行文件时找不到那个字符串或值15吗?

xfyts7mz

xfyts7mz1#

我无法理解逆向工程...
第一步是实际了解程序是如何构建的。
在了解如何反转程序之前,需要了解它是如何编译和构建的;反转为Windows构建的二进制文件与反转为 *nix系统构建的二进制文件有很大不同。
由于您使用的是Visual Studio,因此您可以看到这个答案(选项2),它解释了如何启用代码的程序集输出。或者,如果您通过命令行进行编译,则可以传递/FAs and /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吗?
如前所述,正如您所猜测的那样,您正在搜索的“release”二进制文件已经过优化,编译器只是删除了未使用的变量,因此程序集实际上返回0。
希望能有所帮助。

djp7away

djp7away2#

主要的原因是你的代码对x和string没有做任何有用的事情,所以它们完全是多余的!2!3甚至不需要它们存在于你的代码中!4所以编译器会自动从编译的代码中删除它们**“优化”**!5!
如果你真的想在调试器下的编译代码中看到它们,你就需要使用它们,或者简单地告诉编译器不要优化这部分代码!
这是如何告诉编译器不要使用volatile限定符优化这些变量的位置

#include <iostream>

int main(int argc, char** argv) {
    const char* volatile str = "hello matthew";
    volatile int x = 15;
    return 0;
}

this shows that your variables are included in the compiled code in IDA Pro
或者就像我说的,就用它们吧!

#include <iostream>

int main(int argc, char** argv) {
    const char* str = "hello matthew";
    int x = 15;
    std::cout << str << x;
    return 0;
}

相关问题