LODWORD(fMax) = *(_DWORD *)v12;
HIDWORD(fMax) = v13;
我正在阅读
IDA\Plugins\defs.h
的定义,但我不明白到底是什么在Java上重做同样的事情。如果有人能帮助我,我将非常高兴。
#1 楼
此模式通常用于在32位系统上为变量分配64位值-您分别计算每个32位值,然后将它们压入64位值的高32位和低32位。在Java中,您的第一个任务是
fMax=(fMax & 0xFFFFFFFF00000000) | (v12 & 0x00000000FFFFFFFF)
,第二个任务是
fMax=(fMax & 0x00000000FFFFFFFF) | (((long)v13<<32) & 0xFFFFFFFF00000000)
当然,这里的
fMax
是64位长。您可以从第二个表达式中省略
& 0xFFFFFFFF00000000
,因为您知道这些位在左移后将为零。如果& 0x00000000FFFFFFFF
是v12
,则可以从第一个表达式中省略int
,因为高位在32位整数中始终为零。但是Java编译器无论如何都可能会优化它们,我想以某种方式编写语句,以明确表示从fMax
提取了哪些位,从v12
和v13
提取了哪些位。评论
谢谢,我了解了,但现在我发现了这个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
评论
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视为指针。