x86程序集"推送OFFSET ......"和助记符?

Vol*_*ile 4 assembly disassembly visual-studio-2012

我试图通过在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
Run Code Online (Sandbox Code Playgroud)

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

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

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

OFFSET在这个推送指令中意味着什么?我无法在谷歌上找到任何东西.

我还想问一下另一条指令......

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

调试器告诉我DS:[102A92BC] = 5C0A93A0.并且该存储器范围保留给MSVCR110 .text segment.

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

偏离主题:我有一个最后一个有点愚蠢和偏离主题的问题,但我希望你不要介意:你不应该把数据段作为反汇编代码读取,不是吗?导入数据段让我在搜索时感到困惑5C0A93A0.

joh*_*und 7

在x86架构中,每个地址都有两个部分 - 段和偏移.因此,OFFSET简单地表示某个变量"Hello_Wo.??C@_0M@KPLPPDAC@H"的地址偏移量被推入堆栈中.该指令来自MASM语法,其中"push variable"表示推送变量的值,"push offset variable"表示推送变量的偏移量.

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

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

PS开始学习汇编语言与逆转HLL课程并不是最好的策略.

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

  • @Volatile对于阅读由Windows生成的反汇编,请查看1998年为MSJ撰写的"Matt's Just Enough Assembly Language to Get By"两部分指南.第1部分位于http://www.microsoft.com/msj/0298/hood0298.aspx,第2部分位于http://www.microsoft.com/msj/0698/hood0698.aspx (2认同)