我正在练习逆向工程软件。我正在使用Microsoft Visual Studio。我创建了一个空项目,然后创建了一个名为main.cpp
的空文件。然后我编写了以下代码,编译
int main()
{
char* str = "hello matthew";
int x = 15;
return 0;
}
当我将可执行文件的发布版本带到BinText和IdaPro时,字符串“hello matthew”无处可寻。我也永远也找不到基数10或十六进制的值15。
如果我找不到可执行文件中我要查找的值的引用,我就无法开始理解逆向工程。
我的理论是因为我的程序绝对没有任何东西,编译器只是省略了它,但我不确定。有没有人知道为什么我在反汇编时找不到该字符串或可执行文件中的值15?
答案 0 :(得分:1)
我无法理解逆向工程......
第一步是真正了解 程序的构建方式。
在了解如何撤销程序之前,您需要了解它是如何编译和构建的;反转为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附加到可执行文件,并将程序集作为程序查看正在运行。
它可能取决于你的二进制文件可能被混淆后的内容;也就是说二进制文件中可能有字符串,但它们可能被加密或只是加扰,以便在二进制文件中的某些函数解密/解密之前是不可读的。
因此,只搜索字符串并不一定会给你任何东西,并且尝试在汇编代码中搜索特定的二进制值就像试图在一堆针中找到针。知道为什么你试图逆转一个程序,然后攻击那个向量。
当我反汇编时,有谁知道为什么我找不到该字符串或可执行文件中的值15?
如前所述,正如您所猜测的那样,"发布"您正在搜索的二进制文件已经过优化,编译器只删除了未使用的变量,因此程序集基本上返回0。
我希望可以提供帮助。