我想知道是否总是有可能以某种方式在反转应用程序时获取函数和类名。 (在本例中为游戏)我已经尝试了大约1个月来使游戏(刺客信条Unity(砧引擎))反转,但是仍然无法获得函数名称。我找到了一种获取类名的方法,但对函数名没有任何了解。 所以我的问题是,是否有可能在没有文档的情况下实际获得函数名称,并创建层次结构。 (我这样做是为了更好地逆向学习新事物(asm x64))
任何与反转类/构造器有关的技巧都将受到赞赏。
答案 0 :(得分:3)
否,函数和类名对于编译后的代码来说不是必需的,并且通常不属于其符号表已删除的可执行文件的一部分。
例外情况是跨越DLL边界的调用,您可能会得到一些包含函数和类名的C ++名称,或者如果发行版本中存在任何错误检查/断言消息,则某些名称可能会显示在字符串中
具有RTTI(运行时类型信息)的 C ++可能在某处具有类型名称,可能将vtable指针映射到字符串,或者对于没有虚拟成员的类,可能只有在实际使用typeid
的情况下。 (或者在禁用RTTI的情况下完全编译。activate RTTI in c++)
即使是异常处理,我认为也不需要二进制文件中的类名。
除此之外,在编译的二进制文件中不需要类名或函数名。绝对不在机器代码本身中;这当然是所有指针/相对偏移,即使对于具有虚函数的类也是如此。 How do objects work in x86 at the assembly level?。
与Java不同,C ++通常不支持自省,因此默认情况下不需要将所需的任何信息存储在可执行文件中。