astrelsky / Ghidra-Cpp-Class-Analyzer

Ghidra C++ Class and Run Time Type Information Analyzer
MIT License
633 stars 46 forks source link

NullPointerException in VmiClassTypeInfoModel #16

Closed TheAifam5 closed 3 years ago

TheAifam5 commented 4 years ago
2020-04-12  16:52:29    ERROR   (MessageLog) Exception appended to MessageLog java.lang.NullPointerException
            at ghidra.app.cmd.data.rtti.gcc.typeinfo.VmiClassTypeInfoModel.getVirtualParents(VmiClassTypeInfoModel.java:174)
            at ghidra.app.cmd.data.rtti.gcc.typeinfo.AbstractSiClassTypeInfoModel.getVirtualParents(AbstractSiClassTypeInfoModel.java:88)
            at ghidra.app.cmd.data.rtti.gcc.typeinfo.SiClassTypeInfoModel.getVirtualParents(SiClassTypeInfoModel.java:14)
            at ghidra.app.cmd.data.rtti.gcc.VtableModel.setupVtablePrefixes(VtableModel.java:252)
            at ghidra.app.cmd.data.rtti.gcc.VtableModel.<init>(VtableModel.java:103)
            at ghidra.app.cmd.data.rtti.gcc.VtableModel.<init>(VtableModel.java:71)
            at ghidra.app.cmd.data.rtti.gcc.ClassTypeInfoUtils.getValidVtable(ClassTypeInfoUtils.java:142)
            at ghidra.app.cmd.data.rtti.gcc.ClassTypeInfoUtils.findVtable(ClassTypeInfoUtils.java:105)
            at ghidra.app.cmd.data.rtti.gcc.typeinfo.AbstractClassTypeInfoModel.getVtable(AbstractClassTypeInfoModel.java:77)
            at ghidra.app.cmd.data.rtti.gcc.typeinfo.SiClassTypeInfoModel.getVtable(SiClassTypeInfoModel.java:14)
            at ghidra.app.cmd.data.rtti.gcc.typeinfo.AbstractClassTypeInfoModel.getVtable(AbstractClassTypeInfoModel.java:31)
            at ghidra.app.cmd.data.rtti.ClassTypeInfo.getVtable(ClassTypeInfo.java:68)
            at ghidra.app.plugin.prototype.CppCodeAnalyzerPlugin.AbstractCppClassAnalyzer.setupVftables(AbstractCppClassAnalyzer.java:136)
            at ghidra.app.plugin.prototype.CppCodeAnalyzerPlugin.AbstractCppClassAnalyzer.added(AbstractCppClassAnalyzer.java:104)
            at ghidra.app.plugin.core.analysis.AnalysisScheduler.runAnalyzer(AnalysisScheduler.java:190)
            at ghidra.app.plugin.core.analysis.AnalysisTask.applyTo(AnalysisTask.java:39)
            at ghidra.app.plugin.core.analysis.AutoAnalysisManager$AnalysisTaskWrapper.run(AutoAnalysisManager.java:685)
            at ghidra.app.plugin.core.analysis.AutoAnalysisManager.startAnalysis(AutoAnalysisManager.java:785)
            at ghidra.app.plugin.core.analysis.AutoAnalysisManager.startAnalysis(AutoAnalysisManager.java:664)
            at ghidra.app.plugin.core.analysis.AutoAnalysisManager.startAnalysis(AutoAnalysisManager.java:629)
            at ghidra.app.plugin.core.analysis.AnalysisBackgroundCommand.applyTo(AnalysisBackgroundCommand.java:58)
            at ghidra.framework.plugintool.mgr.BackgroundCommandTask.run(BackgroundCommandTask.java:101)
            at ghidra.framework.plugintool.mgr.ToolTaskManager.run(ToolTaskManager.java:315)
            at java.base/java.lang.Thread.run(Thread.java:830)
astrelsky commented 4 years ago

I need more information for this one. May you apply the following patch and have the exception occur again please?

diff --git a/src/main/java/ghidra/app/cmd/data/rtti/gcc/typeinfo/BaseClassTypeInfoModel.java b/src/main/java/ghidra/app/cmd/data/rtti/gcc/typeinfo/BaseClassTypeInfoModel.java
index d12c688..a20c566 100644
--- a/src/main/java/ghidra/app/cmd/data/rtti/gcc/typeinfo/BaseClassTypeInfoModel.java
+++ b/src/main/java/ghidra/app/cmd/data/rtti/gcc/typeinfo/BaseClassTypeInfoModel.java
@@ -11,6 +11,7 @@ import ghidra.program.model.mem.MemBuffer;
 import ghidra.program.model.mem.MemoryBufferImpl;
 import ghidra.program.model.reloc.Relocation;
 import ghidra.util.Msg;
+import ghidra.util.exception.AssertException;
 import ghidra.program.model.data.StructureDataType;
 import ghidra.program.model.listing.Program;

@@ -128,7 +129,9 @@ public final class BaseClassTypeInfoModel {
         if (reloc != null && reloc.getSymbolName() != null) {
             return (ClassTypeInfo) TypeInfoUtils.getExternalTypeInfo(program, reloc);
         }
-        return null;
+        throw new AssertException(
+           String.format("Failed to retreive __class_type_info at %s in file %s",
+                         getAddress().toString(), program.getName()));
     }

    /**

After you receive the AssertException it would be appreciated if you go to the address in the program/library and show the following:

  1. The relocation and data at the specified address
  2. The relocation and data at the address of the pointer at the specified address.

You may find the relocation information under Window->Relocation Table You can use the address as the filter.

TheAifam5 commented 4 years ago

It doesn't even prints that error message anywhere

astrelsky commented 4 years ago

It doesn't even prints that error message anywhere

It should after applying 118a9c4

I'm currently going through everything to provide more information and throw an exception instead of returning null.