5

我试图通过在Visual Studio 2012 Express中创建小型 C 程序,然后在Immunity Debugger中反汇编它们来自学一些汇编。但我显然遇到了一些我不明白的事情:

012A13F0   68 58582A01      PUSH OFFSET Hello_Wo.??_C@_0M@KPLPPDAC@H>; ASCII "Hello World"
012A13F5   FF15 BC922A01    CALL DWORD PTR DS:[<&MSVCR110D.printf>]  ; MSVCR110.printf

我对这两个指示感到困惑。事实上,操作码对我来说比调试器描述的实际指令更有意义。

显然,第一条指令将地址压入堆栈。当我跟随转储中的地址时,它会显示一个区域,其中包含一些组成字符串的十六进制Hello World。我相信这是.data segment. 我对么?

并且; 我想Hello_Wo.??_C@_0M@... 这只是调试器提供给我的视觉帮助,所以我可以更好地理解这是……某事……

但是这个 push 指令中的OFFSET是什么意思呢?我在谷歌上找不到任何东西。

我也想问一下其他指令...

据我了解,它试图通过使用位于 address 的 4 字节值作为调用的地址来DS:[102A92BC] (&MSVCR110D...)调用例程

调试器告诉我DS:[102A92BC] = 5C0A93A0。并且该内存范围是为 MSVCR110 保留的.text segment

我很抱歉,但我很难提出这个问题,因为我什至不确定我应该怎么问。我希望你明白。谢谢你。

题外话:我最后一个问题有点愚蠢,题外话,但我希望你不介意:你不应该将数据段作为反汇编代码读取,是吗?进口数据段让我在搜索5C0A93A0.

4

1 回答 1

8

在 x86 架构中,每个地址都有两部分 - 段和偏移量。所以,OFFSET 的意思就是将某个变量“Hello_Wo.??_C@_0M@KPLPPDAC@H”的地址的偏移量压入堆栈。该指令来自 MASM 语法,其中“push variable”表示推动变量的值,“push offset variable”表示推动变量的偏移量。

提到的“.data”和“.text”不是段,而是段。这是完全不同的。该部分只是可执行文件的一部分,具有单独的内存保护。C/C++ 编译器通常使用“.text”作为程序代码。不要问我为什么。

在现代保护模式操作系统中,使用平面内存模型。这意味着所有代码和数据都放在一个大段中,因此您无需使用 DS、ES 等段寄存器。它们的值由操作系统管理。

PS 用逆向 HLL 程序开始学习汇编语言并不是最好的策略。

最好尝试阅读和编写一些本机汇编代码。互联网上有很多地方可以下载此类示例 - 非常简单和非常复杂,具体取决于您的进度。我建议使用FASM。有一个留言板,有大量有用的信息和可以回答您问题的人。

于 2013-07-13T23:03:19.143 回答