问题描述
LOWORD(v9) = *(BYTE *)v6);
其中 v9,v6
是 32 位整数。
LOWORD
是 windef.h
中定义的宏,如下所示:
#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
显然这是一个宏,所以我不能给它分配东西。我对一个有效的 C 实现感兴趣,但我不确定这里反编译器的意图。根据我的猜测,目的是取消引用 LOWORD
的 v9
,并分配 v6
指向的字节值,但我想确定一下。
如果有必要,这里是伪代码的上下文。所有类型都是 32 位整数:
if (*(BYTE *)v6) {
LOWORD(v9) = *(BYTE *)v6);
do {
v7 = v7 & 0xFFFF0000 | (unsigned __int16)(v7 + v9);
v9 = *++v8;
if (*v8) {
v7 = (unsigned __int16)v7 | ((*v8++ + (v7 >> 16)) << 16);
v9 = *v8;
}
} while (v9);
}
解决方法
您显示的 windef.h
宏不是 IDA 使用的宏,因为正如您所注意到的,您不能将此类宏的结果用作左值。
根据我的猜测,目的是取消引用 LOWORD
的 v9
,并分配 v6
指向的字节值
不完全是。目的是用右侧替换变量 v9
(即 int
)的低位字(即低 2 个字节)。
所以在 IDA 中,这个:
LOWORD(a) = b;
可以这样看:
a = (a & 0xffff0000) | b;
在 C 中编写这样的宏的方法类似于:
#define LOWORD(x) (*((uint16_t*)&(x)))
这可能是一种更复杂但更通用的方法来做同样的事情,并且可以用作左值和右值。