当我使用IDA PRO反编译时,我得到的代码看起来像都是这两个

了解__PAIR__宏。

宏本身。 br />



// The following definition is not quite correct because it always returns
// uint64. The above C++ functions are good, though.
#define __PAIR__(high, low) (((unsigned long)(high)<<sizeof(high)*8) | low)


我也有类似这样的代码

if ( (__PAIR__(a4, a3) & 0x8000000000000000ui64) == 0i64 ) {
  //condition code.
}


我实际上找到了一个人来帮助我修复此不良代码,据我所知,可以像这样简单地替换它们。

  if ( (__PAIR__(v17, v12) & 0x8000000000000000ui64) != 0i64 ) {
    //condition code.
  }


变成

   if( (__PAIR__(a4, a3) & 0x8000000000000000ui64) == 0i64 )


现在我发现了一个非常相似的模式,如上图所示,但是它不是== 0i64而是!= 0i64

所以我弄清楚了我的模式是正确的,然后下面的代码

   if(a4 >= 0 && a3 >= 0)


应该看起来像这样

  if ( (__PAIR__(v17, v12) & 0x8000000000000000ui64) != 0i64 ) {


然后再次

我无法发布!= 0i64示例的程序集,因为我找不到它,所以程序集代码很大。看起来像这样

  if( v17 < 0 || v12 < 0 ) {


#1 楼


 if( (__PAIR__(a4, a3) & 0x8000000000000000ui64) == 0i64 )


 if(a4 >= 0 && a3 >= 0)



不,这是不正确的。正确的简化为: />

不,它应该看起来像这样:

if ((int)a4 >= 0)


您可能想了解最高有效位(MSB)的方式用作二进制补码表示法的符号位。

评论


但这似乎是两个变量的对,为什么在那里只使用一个?我知道由于汇编的工作方式,可能会凭空创建变量。但是我确实认为这应该仍然同时检查我是否错了?还因为它检查一个64位掩码我猜那是每个变量32位吗?这是针对x86 exe而非64位exe的。

–user3435580
2014年5月6日19:47

它在反汇编中显示为两个变量,因为原始代码使用了64位变量,该变量在反汇编中分解为两个32位变量。由于仅检查了64位值的MSB(因为代码正在检查值的符号),因此64位值的较低DWORD部分无关紧要,这就是我上面的简化代码忽略a3和v12的原因。

–詹森·格夫纳(Jason Geffner)
2014年5月6日21:44

据我了解,IDA PRO对汇编进行了错误的分析,以为它实际上是2个变量DWORDS时认为是64位。为什么我上面发布的程序集具有a3和a4,我认为ollydebugger中对asm的解释也相同,即程序集== 0 064

–user3435580
2014年5月6日23:53

“ IDA PRO对汇编进行了错误的分析,以为它实际上是2个变量DWORDS时认为它是64位” –不,它实际上是64位值;据我所知,IDA在这里没有犯错。

–詹森·格夫纳(Jason Geffner)
2014年5月7日,3:18