-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement symbol detection using the ".XTLID" section
- Loading branch information
1 parent
741fc5a
commit 49e2071
Showing
6 changed files
with
148 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,3 +5,4 @@ dist/ | |
.classpath | ||
.project | ||
XbSymbolDatabaseTool* | ||
src/main/java/XbeLoader/XbeXtlidDb.java |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
package xbeloader; | ||
|
||
import ghidra.app.util.importer.MessageLog; | ||
import ghidra.app.services.AbstractAnalyzer; | ||
import ghidra.app.services.AnalyzerType; | ||
import ghidra.framework.options.Options; | ||
import ghidra.program.model.address.*; | ||
import ghidra.program.model.data.*; | ||
import ghidra.program.model.listing.Data; | ||
import ghidra.program.model.listing.Listing; | ||
import ghidra.program.model.listing.Program; | ||
import ghidra.program.model.mem.*; | ||
import ghidra.program.model.symbol.Namespace; | ||
import ghidra.program.model.symbol.SourceType; | ||
import ghidra.util.exception.CancelledException; | ||
import ghidra.util.exception.InvalidInputException; | ||
import ghidra.util.task.TaskMonitor; | ||
|
||
public class XbeXtlidAnalyzer extends AbstractAnalyzer { | ||
public XbeXtlidAnalyzer() { | ||
super("Xbox XTLID Symbol ID Analyzer", "Scan XBE for known library functions", AnalyzerType.BYTE_ANALYZER); | ||
} | ||
|
||
@Override | ||
public boolean getDefaultEnablement(Program program) { | ||
return program.getExecutableFormat().equals(XbeLoader.XBE_NAME); | ||
} | ||
|
||
@Override | ||
public boolean canAnalyze(Program program) { | ||
return program.getExecutableFormat().equals(XbeLoader.XBE_NAME); | ||
} | ||
|
||
@Override | ||
public void registerOptions(Options options, Program program) { | ||
// options.registerOption("Option name goes here", false, null, | ||
// "Option description goes here"); | ||
} | ||
|
||
@Override | ||
public boolean added(Program program, AddressSetView set, TaskMonitor monitor, MessageLog log) | ||
throws CancelledException { | ||
AddressFactory af = program.getAddressFactory(); | ||
AddressSpace space = af.getDefaultAddressSpace(); | ||
Listing listing = program.getListing(); | ||
MemoryBlock section = program.getMemory().getBlock(".XTLID"); | ||
|
||
if (section != null) { | ||
for (Address cur_addr = section.getStart(); cur_addr.compareTo(section.getEnd()) <= 0; cur_addr = cur_addr.add(8)) { | ||
try { | ||
Data data = listing.getDataAt(cur_addr); | ||
long id = data.getUnsignedInt(0); | ||
if (id == 0) { | ||
continue; | ||
} | ||
|
||
data = listing.getDataAt(cur_addr.add(4)); | ||
Address address = space.getAddress(data.getUnsignedInt(0)); | ||
|
||
String[] name_namespace = XbeXtlidDb.xtlids.get(id); | ||
if (name_namespace == null) { | ||
log.appendMsg("Unknown XTLID id 0x" + Long.toHexString(id) + " @ 0x" + address.toString()); | ||
continue; | ||
} | ||
program.getSymbolTable().createLabel(address, name_namespace[1], getNamespace(program, name_namespace[0]), SourceType.ANALYSIS); | ||
} catch (MemoryAccessException e) { | ||
log.appendMsg("Failed to read memory: " + e.getMessage()); | ||
break; | ||
} catch (InvalidInputException e) { | ||
log.appendMsg("Failed to set label: " + e.getMessage()); | ||
} | ||
} | ||
} | ||
|
||
return true; | ||
} | ||
|
||
private Namespace getNamespace(Program program, String namespace) { | ||
Namespace space = program.getSymbolTable().getNamespace(namespace, null); | ||
if (space != null) { | ||
return space; | ||
} | ||
try { | ||
return program.getSymbolTable().createNameSpace(null, namespace, SourceType.IMPORTED); | ||
} | ||
catch (Exception e) { | ||
return null; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||
<xsl:output method="text" /> | ||
|
||
<xsl:template match="/"> | ||
<xsl:text>package xbeloader;
</xsl:text> | ||
<xsl:text>
</xsl:text> | ||
<xsl:text>import java.util.HashMap;
</xsl:text> | ||
<xsl:text>import java.util.Map;
</xsl:text> | ||
<xsl:text>
</xsl:text> | ||
<xsl:text>public class XbeXtlidDb {
</xsl:text> | ||
<xsl:text> public static final Map<Long, String[]> xtlids;
</xsl:text> | ||
<xsl:text>
</xsl:text> | ||
<xsl:text> static {
</xsl:text> | ||
<xsl:text> xtlids = new HashMap<>();
</xsl:text> | ||
|
||
<xsl:apply-templates select="//lib"/> | ||
|
||
<xsl:text> }
</xsl:text> | ||
<xsl:text>}
</xsl:text> | ||
</xsl:template> | ||
|
||
<xsl:template match="lib"> | ||
<xsl:apply-templates select="func"/> | ||
</xsl:template> | ||
|
||
<xsl:template match="func"> | ||
<xsl:text> xtlids.put(</xsl:text> | ||
<xsl:value-of select="@id"/> | ||
<xsl:text>L, new String[]{"</xsl:text> | ||
<xsl:value-of select="../@name"/> | ||
<xsl:text>", "</xsl:text> | ||
<xsl:value-of select="@name"/> | ||
<xsl:text>"});
</xsl:text> | ||
</xsl:template> | ||
</xsl:stylesheet> |