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.
在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.有一个留言板,有大量有用的信息和人们可以回答你的问题.
| 归档时间: |
|
| 查看次数: |
10502 次 |
| 最近记录: |