我试图弄清楚这段代码到底是做什么的:

  LODWORD(fMax) = *(_DWORD *)v12;
  HIDWORD(fMax) = v13;


我正在阅读IDA\Plugins\defs.h的定义,但我不明白到底是什么在Java上重做同样的事情。

如果有人能帮助我,我将非常高兴。

评论

LODWORD()从fMax中提取低DWORD,而HIDWORD()从高DWORD中提取。基本上,如果您有这样的__int64:x = 0xFFFFFFFFAAAAAAAA,则LODWORD(x)为0xAAAAAAAA和HIDWORD(x)为0xFFFFFFFF

因此,这两个变量基本上改变了fMax的值。例如,如您所说,如果我的fMax = 0xFFFFFFFFAAAAAAAA并且v12 = 0xFFCD0000 ... LODWORD(fMax)的最终值为0xFFFFFFFFFFCDCD0000。我说得对吗?

你是对的。但是,我假设您省略了&,并且第一个表达式应为... *(_ DWORD *)&v12,因为您希望从v12中选择低32位,而不是将v12视为指针。

#1 楼

此模式通常用于在32位系统上为变量分配64位值-您分别计算每个32位值,然后将它们压入64位值的高32位和低32位。

在Java中,您的第一个任务是

fMax=(fMax & 0xFFFFFFFF00000000) | (v12 & 0x00000000FFFFFFFF)


,第二个任务是

fMax=(fMax & 0x00000000FFFFFFFF) | (((long)v13<<32) & 0xFFFFFFFF00000000)


当然,这里的fMax是64位长。

您可以从第二个表达式中省略& 0xFFFFFFFF00000000,因为您知道这些位在左移后将为零。如果& 0x00000000FFFFFFFFv12,则可以从第一个表达式中省略int,因为高位在32位整数中始终为零。但是Java编译器无论如何都可能会优化它们,我想以某种方式编写语句,以明确表示从fMax提取了哪些位,从v12v13提取了哪些位。

评论


谢谢,我了解了,但现在我发现了这个SHIDWORD(v10),我认为这就像fMax =(fMax&0xFFFFFFFF00000000)| (v10 +1)我是对的吗?

–克里斯·莫雷拉(Criss Moreyra)
2015年2月22日,下午2:29

SHIDWORD是符号扩展的HIDWORD。负32位值的SHIDWORD为FFFFFFFF,正32位值的SHIDWORD为0。+1不适用于该值,因为在v10 + 1中,它适用于指针-一个DWORD在v10的地址之后。

–贡特拉姆·布洛姆(Guntram Blohm)
15年2月22日在6:40

如何将其转换为简单的C代码? IDA解释了此mov [rsp + 56],此LODWORD(v1)= v2;,v1用于未知/未记录的函数。

– Biswapriyo
18年8月4日在20:20