我正在练习逆向工程软件。我正在使用 Microsoft Visual Studio。我创建了一个空项目,然后创建了一个名为 main.cpp
的空文件。然后我写了下面的代码,编译
int main()
{
char* str = "hello matthew";
int x = 15;
return 0;
}
当我将可执行文件的发布版本带到 BinText 和 IdaPro 时,找不到字符串“hello matthew”。我也永远找不到以 10 为基数或十六进制的值 15。
如果我无法在可执行文件中找到对我正在寻找的值的引用,我就无法开始理解逆向工程。
我的理论是,因为我的程序完全没有做任何事情,所以编译器将其全部省略,但我不确定。有谁知道为什么我在反汇编时无法在可执行文件中找到该字符串或值 15?
最佳答案
I cannot begin to understand reverse engineering ...
第一步是真正了解程序是如何构建的。
在了解如何逆向程序之前,您需要了解它是如何编译和构建的;反转为 Windows 构建的二进制文件与为 *nix 系统反转二进制文件有很大不同。
为此,由于您使用的是 Visual Studio,您可以看到 this answer (option 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 附加到可执行文件,并将程序集视为程序正在运行。
这可能取决于您的追求,因为二进制文件可能会被混淆;也就是说,二进制文件中可能有字符串,但它们可以被加密或只是加扰,以便在二进制文件中的某些函数解密/解密之前不可读。
所以仅仅搜索字符串不一定会给你任何东西,并且试图在汇编代码中搜索特定的二进制值就像试图在一堆针中找到一根针。了解为什么要尝试逆向程序,然后攻击该 vector 。
Does anyone know why I cannot locate that string or the value 15 in the executable when I disassemble it?
如前所述,正如您所猜测的,您正在搜索的“发布”二进制文件已经过优化,编译器只是删除了未使用的变量,因此程序集实际上返回了 0。
希望对您有所帮助。
关于c++ - Visual Studio 中已编译的 .exe 中缺少的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359899/