ghidra 反编译器中的 concat22

逆向工程 反编译 吉德拉
2021-07-09 05:36:04

我正在分析的部分代码在 ghidra 中被反编译如下:

if (((*puVar8 == CONCAT22(DAT_0040a37a,DAT_0040a378)) &&
     (*(uint *)((int)puVar9 + 6) ==
     (CONCAT22(DAT_0040a37e,DAT_0040a37c) | (int)DAT_0040a37a >> 0xf))) &&
     ((*(short *)((int)puVar9 + 10) == 0x20 || (*(short *)((int)puVar9 + 10) == 0)))) {
    local_2c8.PrivilegeCount = local_2c8.PrivilegeCount | 4;
  }

我想了解这CONCAT22什么这可以在同一个函数的多个地方找到。

1个回答

我想评论但它长大了所以回答

CONCAT 是串联

22是一个后缀,表示用两个字节连接两个字节

它从第一个位置取两个字节从第二个位置取两个字节并产生一个 4 字节的结果

在这里它可能正在制作一个宽字符串

您也可以看到地址中两个字节的差异 xxa37e,yya37c 等

如评论中所述,单击地址或宏以转到反汇编并查看构造

这是一个很大的concat

return CONCAT2325(extraout_var,CONCAT124(1,CONCAT816(local_48,CONCAT88(uVar3,local_58)))) &
       0xffffffffffffffff;

concat           88 = 8+8  say something RDX+rcx   
next is          816 which means 8 + 16      << 16 is from earlier concat   
next is          124 which means 1 + 24      << 24 is from earlier concat   
next is          2325 which means 23 + 25     << 25 is from earlier concat   

以及本次反编译的相关反汇编

00461277 48 89 84        MOV        qword ptr [Stack[0x18] + RSP],RAX
         24 80 00 
         00 00
00461284 48 89 84        MOV        qword ptr [Stack[0x20] + RSP],RAX
         24 88 00 
         00 00
0046128c c6 84 24        MOV        byte ptr [Stack[0x28] + RSP],0x1
         90 00 00 
         00 01
00461297 0f 11 84        MOVUPS     xmmword ptr [Stack[0x30] + RSP],XMM0
         24 98 00 
         00 00
004612a8 c3              RET
                     ********** bufio.(*Reader).ReadLine Exit **********