我刚开始倒车。我无意中发现了一行我无法理解的代码。
return (*(_int64(**)(void))(**(_QWORD **)(v1 + 0x3C8) + 0x68LL ))();
代码用于arm64库。因此,我所理解的是,它正在以无符号int64数据类型返回一个指针。但是,当我试图用它作为,
return (unsigned long) ((unsigned long)(v1 + 0x3C8) + 0x68) ;
,结果超出了无符号的长范围,例如,一个结果是19985131375820901
。而且,_int64和_QWORD都有8个字节的大小,所以没有签名的long也是如此。所以我有点搞不懂这是怎么回事。有谁能帮我正确解释一下这个问题吗?
发布于 2022-08-17 01:37:54
v1 + 0x3C8
是。这将0x3C8
添加到v1
中。但是,您似乎忽略了添加0x68
之前发生的其他事情。
(_QWORD **)
此添加的结果被抛到指向指向_QWORD
指针的指针。这就是在C++中的含义。
**
并取消了引用。两次。从某个地方产生一个_QWORD
。无论这些指示指向哪里。
+0x68LL
只有到那时,0x68
才会被添加到您现在拥有的任何东西中。
但你还没说完呢。还有更多的C++代码需要解开。
(_int64(**)(void))
它现在被转换到指向不接受参数并返回_int64
的函数的指针。
*
指针被取消引用。
()
最后进行函数调用,返回一个_int64
值。
https://stackoverflow.com/questions/73381803
复制相似问题