我是倒车新手。我偶然发现了一行我无法理解的代码。
return (*(_int64(**)(void))(**(_QWORD **)(v1 + 0x3C8) + 0x68LL ))();
代码用于arm64库。所以,我所理解的是,它以无符号int64数据类型的形式返回一个指针。但是,当我尝试将其用作时
return (unsigned long) ((unsigned long)(v1 + 0x3C8) + 0x68) ;
,结果超出了无符号长范围,例如一个结果是19985131375820901
。此外,_int64和_QWORD都有8个字节的大小,unsigned long也是如此。所以我有点困惑这是怎么发生的。有人能帮我正确解释一下吗?
v1 + 0x3C8
是的。这将0x3C8
添加到v1
。但您似乎忽略了在0x68
添加到它之前发生的其他事情
(_QWORD **)
该相加的结果被投射到指向_QWORD
的指针的指针。这就是它在C++中的含义。
**
并取消引用。两次这会从某个地方产生_QWORD
。无论这些指针指向哪里。
+0x68LL
只有到那时,0x68
才会被添加到你现在拥有的任何东西中。
但你还没有完成。还有更多的C++代码需要破解。
(_int64(**)(void))
现在,它被投射到一个指针,该指针指向一个不带参数并返回_int64
的函数。
*
指针被取消引用。
()
最后进行函数调用,返回一个_int64
值。