【发布时间】:2015-12-25 00:23:38
【问题描述】:
在 IDA 生成的反编译代码中,我看到如下表达式:
malloc(20 * c | -(20 * (unsigned __int64)(unsigned int)c >> 32 != 0))
malloc(6 * n | -(3 * (unsigned __int64)(unsigned int)(2 * n) >> 32 != 0))
谁能解释这些计算的目的?
c 和 n 是 int(有符号整数)值。
更新。
原始 C++ 代码是用 MSVC 为 32 位平台编译的。
这是上面第二行反编译C代码的汇编代码(malloc(6 * ..)):
mov ecx, [ebp+pThis]
mov [ecx+4], eax
mov eax, [ebp+pThis]
mov eax, [eax]
shl eax, 1
xor ecx, ecx
mov edx, 3
mul edx
seto cl
neg ecx
or ecx, eax
mov esi, esp
push ecx ; Size
call dword ptr ds:__imp__malloc
【问题讨论】:
-
写这段代码的人应该被执行。此代码将运算符优先级的滥用提升到了一个新的水平。
-
这不只是经过编译器优化的伪
C代码吗? -
我怀疑这是对编译器生成的代码的某种误解。就像以优化形式对 32 -> 64 位数字进行符号扩展一样。 (c >> 32) 最有可能为零。
-
你能参考一下你在哪里找到这样的代码吗?
-
@user3528438 显然代码是由反编译器生成的——所以反编译器一定已经执行了!