C 反编译汇编代码
我正试图从一些反编译的汇编代码中拼凑出C代码,我有一个问题。我看到以下情况:C 反编译汇编代码,c,assembly,decompiler,C,Assembly,Decompiler,我正试图从一些反编译的汇编代码中拼凑出C代码,我有一个问题。我看到以下情况: SUB_L10195A01: ... call SUB_L1019CB90 db CCh; 'Œ' SUB_L10026990: push FFFFFFFFh push L101EA0C5 问题是什么 db CCh; 'Œ' 为了什么?通常有一个 retn 以前 SUB_L10026990: 这是毫无意义的。编译器假定被调用的函数永远不会返回
SUB_L10195A01:
...
call SUB_L1019CB90
db CCh; 'Œ'
SUB_L10026990:
push FFFFFFFFh
push L101EA0C5
问题是什么
db CCh; 'Œ'
为了什么?通常有一个
retn
以前
SUB_L10026990:
这是毫无意义的。编译器假定被调用的函数永远不会返回 此外,您的反汇编程序也知道这一点。代码
0CCh
解码为int 3
,通常会停止程序并显示错误。由于之前的代码永远不会返回(或者假设是这样),操作码不是列表的一部分,因此它被写为db 0CCh
,而不是“指令int 3
”
代码本身与上面的例程无关。编译器插入此字节是为了确保(1)如果程序运行超出界限,它将遇到此命令,然后停止,以及(2)将下一个函数的第一个字节与(最有可能的)4的倍数对齐,因此执行速度有一个小的但实际的增益。Harold刚刚回答-CC是int3(调试中断)
<代码> Db</C>通常由汇编程序使用,以指定在“正则”程序集中添加的任意字节,而反汇编程序将它们作为一个“最后的工具”插入,当它们看到没有意义的序列时;在这里,我不知道您的反汇编程序为什么在
db
中插入cc
字节,因为cc
是常见的int 3
操作码(通常用于中断调试器)
编译器通常围绕“常规”函数发出它们,用于填充/对齐/调试目的
Int3
的优点是在查看反汇编和十六进制内存视图时很容易发现,如果意外执行了调试器,则会打断调试器。您在调用之后找到它的事实意味着调用意味着永远不会从中返回(想想退出(1)
或中止()
或类似的东西);或者(但不太可能),它可能是程序员故意添加的(例如,以Visual C++中固有的\uu debugbreak
形式添加)。CC是int3
(debug break)。顺便说一句,我检查了一下,以确保CCh不是ret或它的任何变体。。