ARM64库IDA伪代码解读求助:某返回语句的正确理解
ARM64 IDA伪代码解读
先贴出你遇到的原伪代码:
return (*(_int64(**)(void))(**(_QWORD **)(v1 + 0x3C8) + 0x68LL ))();
逐段拆解逻辑
这行代码是调用某个虚表中的函数并返回其执行结果,拆解步骤如下:
v1 + 0x3C8:计算v1地址偏移0x3C8的内存位置,这个位置存储的是一个二级指针(_QWORD **)——即该位置存了一个指针,这个指针又指向另一个指针。**(_QWORD **)(v1 + 0x3C8):连续两次解引用,最终拿到的是某个类/结构体的虚表指针(ARM64中虚表是函数指针的数组)。**(...) + 0x68LL:在虚表指针的基础上偏移0x68字节,定位到虚表中某个函数指针的地址(每个函数指针占8字节,0x68对应第13个函数,从0开始索引的话是第10位)。(_int64(**)(void))(...):IDA的冗余写法,本质是把这个偏移后的地址强制转换成无参数、返回_int64类型的函数指针。(*(...))():解引用函数指针并调用该函数,最终返回函数的执行结果(类型为_int64)。
你的改写错误点
你写的代码:
return (unsigned long) ((unsigned long)(v1 + 0x3C8) + 0x68) ;
完全误解了原逻辑:你直接对v1+0x3C8这个地址做了0x68的偏移,这是内存地址的直接加法;但原代码是先解引用拿到虚表,再在虚表内部偏移找函数指针,最后调用函数返回值,两者逻辑天差地别。
关于数值超出范围的问题
你得到的19985131375820901转成十六进制是0x12C00000000005,这不是ARM64用户态的合法地址(用户态地址一般只使用低48位),因为你的逻辑错误,直接计算无效的地址偏移,自然会得到超出合理范围的数值。
内容的提问来源于stack exchange,提问作者Akram Raza
相关产品推荐
相关产品推荐

