了解
__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