我试图通过在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
.