当我使用 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