提问者:小点点

解释Ghidra指针(ELI不知道C/C++)


给定param_1是输入文件字节,有人能解释一下uvar4=*(uint*)(param_1+3)是做什么的吗? 是否将param_1转换为uint然后uvar4=param_1[3]? 此外,任何关于指针的澄清也是很好的bc我的经验与C/CPP接近于零(甚至没有提到指针)

uchar * DecryptLZ4(uchar *param_1,ulong param_2,ulong *param_3) //param_1: file bytes, param_2: file size

{
  uchar uVar1;
  uchar *puVar2;
  int iVar3;
  uint uVar4;
  bool bVar5;
  ulong local_28;
  int local_24;
  
  local_24 = __stack_chk_guard;
  local_28 = param_2;
  if (((param_1 != (uchar *)0x0) && (6 < param_2)) && (*param_1 == -8)) { //if param_1[0] == 0xf8..
    uVar1 = param_1[1];
    bVar5 = uVar1 == -0x75; // ..and param_1[1] == 0x8b:
    if (bVar5) { 
      uVar1 = param_1[2];
    } // if param_1[0] = 
    if (((bVar5 && uVar1 == '+') && (param_2 != 7)) && //if param_1[2] == 0x2b and param_2 != 7
       (uVar4 = *(uint *)(param_1 + 3), uVar4 < 0x2000001)) { // THIS LINE
      puVar2 = (uchar *)Allocate((int)GlobalAllocator,(char *)(uVar4 + 1),
                                 (int)
                                 "XANA"
                                 ,&DAT_00000085);
      if (puVar2 != (uchar *)0x0) {
        iVar3 = FUN_00298230(param_1 + 7,puVar2,param_2 - 7,uVar4);
        if (iVar3 < 1) {
          Free((BlockAllocator *)GlobalAllocator,puVar2,(int)(char *)(uVar4 + 1));
          goto LAB_00346faa;
        }
        puVar2[iVar3] = '\0';
        Free((BlockAllocator *)GlobalAllocator,param_1,local_28 + 1);
        param_2 = uVar4;
        param_1 = puVar2;
        local_28 = uVar4;
      }
      if ((0 < (int)uVar4) && (2 < param_2)) {
        while (*param_1 == -8) {
          uVar1 = param_1[1];
          bVar5 = uVar1 != -0x75;
          if (!bVar5) {
            uVar1 = param_1[2];
          }
          if ((bVar5 || uVar1 != '+') ||
             (param_1 = (uchar *)DecryptLZ4(param_1,param_2,&local_28), param_2 = local_28,
             local_28 < 3)) break;
        }
      }
    }
  }
LAB_00346faa:
  if (param_3 != (ulong *)0x0) {
    *param_3 = param_2;
  }
  if (__stack_chk_guard == local_24) {
    return param_1;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}

共1个答案

匿名用户

你得看括号。

uvar4=*(uint*)(param_1+3)中,添加发生在转换为指向uint的指针之前。 param_1具有uchar*类型。

因此,它不像uvar4=param_1[3],因为表达式param_1[3]的类型为uchar。 这个版本只加载一个字节,扩展到(大概)4个字节,存储在uvar4中。 原始文件将从地址param_1+3复制(大概)4个字节到uvar4

我的答案

是否将param_1转换为uint,然后uVar4=param_1[3]

可能是否定的,原因有两个:

  • param_1具有固定类型(uchar*),强制转换不会更改其类型。
  • 如果执行类似uint*param_2_ui=(uint*)param_1的操作,则uvar4=param_2_ui[3],结果将不同。

在C(和C++,尽管它是一种完全不同的语言)中,向指针添加将按指向类型的大小向地址添加。

在实践中,假设sizeof(int)==4,并给定:

int tmp[2];
int *ptr1 = tmp;

表达式PTR1+1将表示大于PTR1的地址4。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(解释|ghidra|指针|eli|不知道|c|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?