【问题标题】:Decompiled assembly code反编译的汇编代码
【发布时间】:2015-12-21 06:47:27
【问题描述】:

我正在尝试将一些反编译的汇编代码中的 C 代码放在一起并有一个问题。我看到以下内容:

SUB_L10195A01:
    ...
    call    SUB_L1019CB90
    db  CCh;   'Œ'

SUB_L10026990:
    push    FFFFFFFFh
    push    L101EA0C5

什么是

db  CCh;   'Œ'

为了?通常有一个

retn

之前

SUB_L10026990:

【问题讨论】:

  • CC 是 int3(调试中断)
  • 顺便说一句,我检查以确保 CCh 不是 ret 或其任何变体..

标签: c assembly decompiler


【解决方案1】:

它是'为了'什么。编译器假定被调用的函数永远不会返回。

此外,您的反汇编程序也知道这一点。代码0CCh 解码为int 3,这通常会停止您的程序并显示错误。由于它之前的代码永远不会返回(或者假设是这样),操作码不是列表的一部分,因此它写为db 0CCh,而不是“指令int 3”。

代码本身与上面的例程无关。编译器插入此字节以确保 (1) 如果 程序运行超出范围,它将遇到此命令然后停止,以及 (2) 对齐下一个函数的第一个字节到(最有可能)4 的倍数,因此执行速度有一个小但实实在在的增益。

【讨论】:

    【解决方案2】:

    Harold 刚刚回答 - CC 是 int3(调试中断)。

    【讨论】:

      【解决方案3】:

      db 常被汇编器用来指定在“常规”汇编中间添加的任意字节,当反汇编器开始看到根本没有意义的序列时,将其作为“最后手段”插入;这里我不知道为什么你的反汇编程序在db 中插入了cc 字节,因为cc 是通常的int 3 操作码(通常用于闯入调试器)。

      编译器经常围绕“常规”函数发出它们以用于填充/对齐/调试目的; int 3 的优点是在查看反汇编和十六进制内存视图时很容易发现,如果不小心执行了会闯入调试器。在call 之后找到它的事实意味着call 永远不会被返回(想想exit(1)abort() 或类似的东西);或者(但不太可能),它可能是程序员故意添加的(例如,以 Visual C++ 中 __debugbreak 内在函数的形式)。

      【讨论】:

        猜你喜欢
        • 2017-08-18
        • 2014-05-29
        • 2012-12-27
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2019-09-09
        相关资源
        最近更新 更多