十六进制射线是否以任何方式支持 VLA?

逆向工程 艾达 C 六线谱 大批
2021-06-17 13:57:15

我正在用 VLA 测试一些“C”代码。Hex-Rays 无法识别 VLA 并不奇怪。与结构一样,有一些方法可以让它理解(简单地使你认为它是结构的变量类型) - VLA 有类似的东西吗?

1个回答

看起来 Hexrays 不支持这个。

按照可变长度数组的说明(https://www.hex-rays.com/products/ida/support/tutorials/varstr/index.shtml)表明它确实适用于 IDA 反汇编和设置类型(热键 Y) ,但不在反编译器输出(Hexrays)中。

示例来源:

typedef struct {
  int a;
  int b;
  char c[0];
} foo;

int main() {
  foo* f = malloc(512);
  f->c[123] = 0;
}

IDA 中定义的结构:

00000000 struc_1         struc ; (sizeof=0x8, mappedto_1, variable size)
00000000 a               dd ?
00000004 b               dd ?
00000008 c               db 0 dup(?)             ; XREF: main+1D/w
00000008 struc_1         ends

注释后反汇编示例:

push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h
sub     esp, 20h
mov     dword ptr [esp], 200h ; size
call    _malloc
mov     [esp+1Ch], eax
mov     eax, [esp+1Ch]
mov     [eax+(struc_1.c+7Bh)], 0
leave
retn

反编译输出示例:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  struc_1 *result; // eax@1

  result = (struc_1 *)malloc(0x200u);
  BYTE3(result[0x10].a) = 0;
  return (int)&result->a;
}