从 IDA PRO Pseudo Decompiler 理解 __PAIR__ 宏看起来更好

逆向工程 艾达 反编译 反编译器
2021-06-30 07:19:17

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

理解__PAIR__宏。

宏本身。

// 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 )

变成

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

现在我发现了一个非常相似的模式,看起来像上面,但不是== 0i64!= 0i64

所以我想如果我的模式是正确的,那么下面的代码

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

应该是这样的

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

再说一次,这只是一个猜测,我想知道这是否正确。

我无法发布!= 0i64示例的程序集,因为我找不到它,程序集代码非常大..但是== 0i64看起来像这样的

.text:004049F0                 mov     edx, [esp+a3]
.text:004049F4                 test    edx, edx
.text:004049F6                 jl      short locret_404A3E
.text:004049F8                 mov     eax, [esp+a4]
.text:004049FC                 test    eax, eax
.text:004049FE                 jl      short locret_404A3E
1个回答
 if( (__PAIR__(a4, a3) & 0x8000000000000000ui64) == 0i64 )

变成

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

不,那是不正确的。正确的简化是:

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

应该是这样的

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

不,它应该是这样的:

if ((int)v17 < 0) {

您可能希望就如何读了最显著位(MSB)用作符号位二进制补码