我刚刚使用IDA对二进制文件进行了逆向工程,并加载了Hex Ray以检查特定功能。生成的C源代码包含以下if语句:

LP_ret_GlobalLock_1 = GlobalLock(hMem);
LP_ret_GlobalLock_2 = LP_ret_GlobalLock_1;
...
if ( !LP_ret_GlobalLock_1 || (v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0) )


我不确定是否完全理解以下部分:

(v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0)


v9初始化为v6 + 4;但是随后将v6修改为指针LP_ret_GlobalLock_2,最后检查v9是否小于0。对吗?计算v9时,v6使用什么值? LP_ret_GlobalLock_2还是先前的值?

最佳答案

如果用C编译,则从左到右对表达式求值。因此,在计算v9时,将使用v6的初始值。

最终,v9被检查为0,所以您是正确的。

简而言之,执行等效于:

v9 = *(_DWORD *)(v6 + 4);
*(_DWORD *)v6 = LP_ret_GlobalLock_2;
return v9 < 0;


但是,我不建议您使用那种复杂的代码,这种代码很难阅读和理解,并且在维护时容易出错。将语句扩展为独立语句会更好。

09-08 04:15