2015-09-23 257 views
-1

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

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

SUB_L10026990: 
    push FFFFFFFFh 
    push L101EA0C5 

什么是

db CCh; 'Œ' 

呢?通常有一个前

SUB_L10026990: 
+2

CC是'int3'(调试中断) – harold

+0

顺便说一下,我检查确保CCh不是ret或它的任何变体.. – TomJeffries

回答

3

retn

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

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

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

0

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

4

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

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