解释吉德拉指针(ELI 不知道 C/C++)



假设param_1是输入文件字节,有人能解释一下uVar4 = *(uint *)(param_1 + 3)的作用吗?它是从param_1uint再到uVar4 = param_1[3]吗?此外,任何关于指针的澄清也很好,因为我对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] = '';
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();
}

您必须查看括号。

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;

表达式CCD_ 21将表示比CCD_ 22大的地址4。