C++ 获取Win32二进制文件中的类偏移量

C++ 获取Win32二进制文件中的类偏移量,c++,winapi,C++,Winapi,用于Win32可移植可执行文件(PE) 如何获取已使用的类的列表 如何获得给定类的偏移量 类没有偏移量-它的方法有偏移量。如果PE文件是DLL,并且导出了类,则可以从导出的函数表中获取其方法的偏移量。但是名字会被弄乱的。损坏方案是特定于编译器和版本的 您可以使用DUMPBIN工具(Visual Studio或平台SDK中提供)查看导出表。IIRC,它甚至可以帮你解开名字。如果希望以编程方式执行此操作,请使用ImageHlp API中的函数-ImageLoad()等等 没有好的方法可以获得非导出

用于Win32可移植可执行文件(PE)

  • 如何获取已使用的类的列表
  • 如何获得给定类的偏移量

    • 类没有偏移量-它的方法有偏移量。如果PE文件是DLL,并且导出了类,则可以从导出的函数表中获取其方法的偏移量。但是名字会被弄乱的。损坏方案是特定于编译器和版本的

      您可以使用DUMPBIN工具(Visual Studio或平台SDK中提供)查看导出表。IIRC,它甚至可以帮你解开名字。如果希望以编程方式执行此操作,请使用ImageHlp API中的函数-
      ImageLoad()
      等等

      没有好的方法可以获得非导出类方法的偏移量

      此外,偏移可以在映射文件、调试符号或PDB文件中找到。如果是第三方产品,很可能您无法使用这些产品


      编辑re:Microsoft DLL。Microsoft通过Microsoft Symbol服务器为其许多文件(Win32和.NET)提供调试符号。Visual Studio自v。2005可以在加载DLL时自动提取这些符号。

      当你说没有好方法时,有一种方法,但并不容易,对吗?我已经完成了EXE和DLL的导出函数,没有坏的方法:除非明确地保存(例如在调试符号或MAP文件),C++类名在编译和链接之后丢失。即使您反汇编该文件,您也可以看到函数的开始和结束位置,但您永远不知道该函数的编译时名称是什么。C++不是一种反射语言。BTW,我得到了一个答案,从这里得到的答案是:从你说的意思是,这个问题的建议解决方案是错误的。这通常是不可能的。在进行实际的逆向工程时,通常会维护一组地址/用途猜测——“好的,地址0xa0006667处的4个字节被初始化为CreateWindow()的输出,因此它必须是HWND,我们称之为HWND_1”等等。有些反汇编程序,如IDA Pro,甚至在单独的文件中为您维护该映射。