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)
由于以任何值运行此命令都会在编译时产生警告,并且在运行时出现分段错误,因此我不确定它的实际作用。
由内而外的工作:
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(可能在其原始上下文中如此),否则可能会导致程序行为异常。最好的情况是,行为是由实现定义的。最糟糕的是,它是不确定的。
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |