我正在练习逆向工程软件。我正在使用Microsoft Visual Studio。我创建了一个空项目,然后创建了一个空文件,我称之为main.cpp
。然后我编写了以下代码,编译
int main()
{
char* str = "hello matthew";
int x = 15;
return 0;
}
当我把可执行文件的发布版本带到BinText和IdaPro时,我找不到字符串“hello matthew”,也找不到基数为10或十六进制的值15。
如果我在可执行文件中找不到对所需值的引用,我就无法开始理解逆向工程。
我的理论是,因为我的程序完全不做任何事情,编译器只是把它全部省略了,但我不确定。有人知道为什么我在反汇编可执行文件时找不到那个字符串或值15吗?
2条答案
按热度按时间xfyts7mz1#
我无法理解逆向工程...
第一步是实际了解程序是如何构建的。
在了解如何反转程序之前,需要了解它是如何编译和构建的;反转为Windows构建的二进制文件与反转为 *nix系统构建的二进制文件有很大不同。
由于您使用的是Visual Studio,因此您可以看到这个答案(选项2),它解释了如何启用代码的程序集输出。或者,如果您通过命令行进行编译,则可以传递
/FAs
and/Fa
以生成与源代码内联的程序集。您的程式码会产生下列组件:
虽然这有助于了解您的程式码是如何执行以及执行了什麽,但开始反转的最佳方式之一,就是在调试工具中掷回二进制档,例如将Visual Studio附加至可可执行,并在程式执行时检视组件。
它可以取决于你的追求,因为一个二进制文件可能潜在地被混淆;也就是说,在二进制码内可以有字符串,但是它们可以被加密或者仅仅被加扰,以便在由二进制码内的某个函数解密/解扰之前不可读。
因此,仅仅搜索字符串并不一定能给予任何结果,而在汇编代码中搜索特定的二进制值就像是在一堆针中寻找一根针。了解为什么要反转程序,然后攻击这个向量。
有人知道为什么我在反汇编可执行文件时找不到该字符串或值15吗?
如前所述,正如您所猜测的那样,您正在搜索的“release”二进制文件已经过优化,编译器只是删除了未使用的变量,因此程序集实际上返回0。
希望能有所帮助。
djp7away2#
主要的原因是你的代码对x和string没有做任何有用的事情,所以它们完全是多余的!2!3甚至不需要它们存在于你的代码中!4所以编译器会自动从编译的代码中删除它们**“优化”**!5!
如果你真的想在调试器下的编译代码中看到它们,你就需要使用它们,或者简单地告诉编译器不要优化这部分代码!
这是如何告诉编译器不要使用
volatile
限定符优化这些变量的位置this shows that your variables are included in the compiled code in IDA Pro
或者就像我说的,就用它们吧!