*(int32_t *)(a + 4)= b是什么意思?

Dor*_*ite 1 c arm decompiling reverse-engineering

我已经.so使用retdec反编译了一个文件(来自Android应用程序中的ARM库),并且在代码中可以找到类似的指令:

int32_t a = `some value`;
int32_t b = `another value`;
*(int32_t *)(a + 4) = b;
Run Code Online (Sandbox Code Playgroud)

由于以任何值运行此命令都会在编译时产生警告,并且在运行时出现分段错误,因此我不确定它的实际作用。

Tho*_*ger 6

由内而外的工作:

a + 4
Run Code Online (Sandbox Code Playgroud)

取的值a,并在适用的情况下进行通常的算术转换,然后加上4。此表达式的排名至少为int32_t

下一个:

(int32_t *)(a + 4)
Run Code Online (Sandbox Code Playgroud)

表示您采用了这个新的整数值,并将其解释为指向的指针int32_t。此表达式具有类型int32_t *

更进一步,您正在使用*运算符取消引用它:

*(int32_t *)(a + 4)
Run Code Online (Sandbox Code Playgroud)

int32_t在地址处给出了一个左值类型(类似于典型变量)a + 4(这种地址的有效性取决于实现)。

最后,您将值分配b到以下位置:

*(int32_t *)(a + 4) = b;
Run Code Online (Sandbox Code Playgroud)

总之,这意味着您将的值(int32_t b作为)存储到的值之后int32_t的存储位置4中a

除非a + 4碰巧指向一个有效的存储位置来存储一个int32_t(可能在其原始上下文中如此),否则可能会导致程序行为异常。最好的情况是,行为是由实现定义的。最糟糕的是,它是不确定的。