反汇编汇编代码

时间:2015-09-23 19:46:09

标签: c assembly decompiler

我正在尝试从一些反编译的汇编代码中汇总C代码并提出问题。我看到以下内容:

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

SUB_L10026990:
    push    FFFFFFFFh
    push    L101EA0C5

什么是

db  CCh;   'Œ'

有关?通常有一个

retn

之前

SUB_L10026990:

3 个答案:

答案 0 :(得分:4)

汇编程序通常使用

db来指定在“常规”程序集中间添加的任意字节,并且当反汇编程序开始查看完全没有意义的序列时,它们将其作为“最后的工具”插入;这里我不知道为什么你的反汇编程序在cc中插入db字节,因为cc是通常的int 3操作码(通常用于打入调试器) )。

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

答案 1 :(得分:3)

这是'没有'。编译器假定被调用的函数永远不会返回。

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

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

答案 2 :(得分:0)

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