Skip to content

Commit

Permalink
Fixed signatures loading and applying.
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladimir Kononovich committed Apr 14, 2019
1 parent bf08049 commit 2766f29
Show file tree
Hide file tree
Showing 18 changed files with 224 additions and 341 deletions.
2 changes: 1 addition & 1 deletion .antProperties.xml
@@ -1,5 +1,5 @@
<!-- This file is generated on each "Link Ghidra" command. Do not modify. -->

<project>
<property name="ghidra.install.dir" value="D:\ghidra_9.0.1" />
<property name="ghidra.install.dir" value="D:\ghidra_9.0.2" />
</project>
330 changes: 170 additions & 160 deletions .classpath

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions .gitignore
Expand Up @@ -2,6 +2,6 @@
/build/
/bin/
/dist/
.antProperties.xml
.classpath
.project
/\.antProperties.xml
/\.classpath
/\.project
2 changes: 1 addition & 1 deletion .project
Expand Up @@ -18,7 +18,7 @@
<link>
<name>Ghidra</name>
<type>2</type>
<location>D:/ghidra_9.0.1</location>
<location>D:/ghidra_9.0.2</location>
</link>
</linkedResources>
</projectDescription>
1 change: 0 additions & 1 deletion bin/README.txt

This file was deleted.

57 changes: 0 additions & 57 deletions bin/help/TOC_Source.xml

This file was deleted.

58 changes: 0 additions & 58 deletions bin/help/shared/Frontpage.css

This file was deleted.

23 changes: 0 additions & 23 deletions bin/help/topics/psx/help.html

This file was deleted.

2 changes: 0 additions & 2 deletions bin/images/README.txt

This file was deleted.

2 changes: 1 addition & 1 deletion extension.properties
@@ -1,5 +1,5 @@
name=@extname@
description=Loader for PSX executables
author=DrMefistO
createdOn=30.03.2019
createdOn=
version=@extversion@
1 change: 0 additions & 1 deletion ghidra_scripts/README.txt

This file was deleted.

3 changes: 0 additions & 3 deletions lib/README.txt

This file was deleted.

3 changes: 0 additions & 3 deletions os/linux64/README.txt

This file was deleted.

3 changes: 0 additions & 3 deletions os/osx64/README.txt

This file was deleted.

3 changes: 0 additions & 3 deletions os/win64/README.txt

This file was deleted.

42 changes: 28 additions & 14 deletions src/main/java/pat/PatParser.java
Expand Up @@ -26,8 +26,8 @@
import ghidra.util.task.TaskMonitor;

public class PatParser {
private static final Pattern modulePat = Pattern.compile("([:\\^][0-9A-F]{4}@?) (\\w+) ");
private static final Pattern linePat = Pattern.compile("^((?:[0-9A-F\\.]{2})+) ([0-9A-F]{2}) ([0-9A-F]{4}) ([0-9A-F]{4}) ((?:[:\\^][0-9A-F]{4}@? \\w+ )+)((?:[0-9A-F\\.]{2})+)?$");
private static final Pattern modulePat = Pattern.compile("([:\\^][0-9A-F]{4}@?) ([\\.\\w]+) ");
private static final Pattern linePat = Pattern.compile("^((?:[0-9A-F\\.]{2})+) ([0-9A-F]{2}) ([0-9A-F]{4}) ([0-9A-F]{4}) ((?:[:\\^][0-9A-F]{4}@? [\\.\\w]+ )+)((?:[0-9A-F\\.]{2})+)?$");

private List<SignatureData> signatures = null;
private final TaskMonitor monitor;
Expand Down Expand Up @@ -72,9 +72,7 @@ public void applySignatures(ByteProvider provider, Program program, Address imag
MaskedBytes fullBytes = sig.getFullBytes();
MaskedBytes tmpl = sig.getTemplateBytes();

long progress = monitor.getProgress();
Address addr = program.getMemory().findBytes(startAddr, endAddr, fullBytes.getBytes(), fullBytes.getMasks(), true, monitor);
monitor.setProgress(progress);
Address addr = program.getMemory().findBytes(startAddr, endAddr, fullBytes.getBytes(), fullBytes.getMasks(), true, TaskMonitor.DUMMY);

if (addr == null) {
monitor.incrementProgress(sig.getModules().size());
Expand All @@ -96,11 +94,11 @@ public void applySignatures(ByteProvider provider, Program program, Address imag
for (ModuleData data : modules) {
Address _addr = addr.add(data.getOffset());

if (data.getType().isGlobal() || data.getType().isLocal()) {
if (data.getType().isGlobal()) {
setFunction(program, fpa, _addr, data.getName(), data.getType().isGlobal(), false, log);
}
else if (!skipRefs && data.getType().isReference()) {
setInstrRefName(program, fpa, ps, _addr, data.getName(), log, monitor);
setInstrRefName(program, fpa, ps, _addr, data.getName(), log);
}

if (!(skipRefs && data.getType().isReference())) {
Expand Down Expand Up @@ -180,13 +178,13 @@ public long getAllModulesCount() {
return modulesCount;
}

public static void setInstrRefName(Program program, FlatProgramAPI fpa, PseudoDisassembler ps, Address address, String name, MessageLog log, TaskMonitor monitor) {
public static void setInstrRefName(Program program, FlatProgramAPI fpa, PseudoDisassembler ps, Address address, String name, MessageLog log) {
ReferenceManager refsMgr = program.getReferenceManager();

Reference[] refs = refsMgr.getReferencesFrom(address);

if (refs.length == 0) {
disasmInstruction(program, address, monitor);
disasmInstruction(program, address);
refs = refsMgr.getReferencesFrom(address);

if (refs.length == 0) {
Expand All @@ -196,6 +194,16 @@ public static void setInstrRefName(Program program, FlatProgramAPI fpa, PseudoDi
refs = refsMgr.getFlowReferencesFrom(address.add(4));

Instruction instr = program.getListing().getInstructionAt(address.add(4));

if (instr == null) {
disasmInstruction(program, address.add(4));
instr = program.getListing().getInstructionAt(address.add(4));

if (instr == null) {
return;
}
}

FlowType flowType = instr.getFlowType();

if (refs.length == 0 && !(flowType.isJump() || flowType.isCall() || flowType.isTerminal())) {
Expand All @@ -218,21 +226,27 @@ public static void setInstrRefName(Program program, FlatProgramAPI fpa, PseudoDi
}
}

private static void disasmInstruction(Program program, Address address, TaskMonitor monitor) {
long progress = monitor.getProgress();
DisassembleCommand cmd = new DisassembleCommand(address, null, false);
cmd.applyTo(program, monitor);
monitor.setProgress(progress);
private static void disasmInstruction(Program program, Address address) {
DisassembleCommand cmd = new DisassembleCommand(address, null, true);
cmd.applyTo(program, TaskMonitor.DUMMY);
}

public static void setFunction(Program program, FlatProgramAPI fpa, Address address, String name, boolean isFunction, boolean isEntryPoint, MessageLog log) {
try {
if (fpa.getInstructionAt(address) == null)
disasmInstruction(program, address);

if (isFunction) {
fpa.createFunction(address, name);
}
if (isEntryPoint) {
fpa.addEntryPoint(address);
}

if (isFunction && program.getSymbolTable().hasSymbol(address)) {
return;
}

program.getSymbolTable().createLabel(address, name, SourceType.IMPORTED);
} catch (InvalidInputException e) {
log.appendException(e);
Expand Down
19 changes: 15 additions & 4 deletions src/main/java/psx/PsxAnalyzer.java
Expand Up @@ -21,17 +21,28 @@
import ghidra.util.task.TaskMonitor;
import pat.PatParser;

/**
* TODO: Provide class-level documentation that describes what this analyzer does.
*/

public class PsxAnalyzer extends AbstractAnalyzer {

private static final String OPTION_NAME = "PSYQ PAT-File Path";
private File file = null;

public static boolean isPsxLoader(Program program) {
return program.getExecutableFormat().equalsIgnoreCase(PsxLoader.PSX_LOADER);
}

public PsxAnalyzer() {
super("PSYQ Signatures", "PSX signatures applier", AnalyzerType.INSTRUCTION_ANALYZER);
setDefaultEnablement(false);
}

@Override
public boolean getDefaultEnablement(Program program) {
return isPsxLoader(program);
}

@Override
public boolean canAnalyze(Program program) {
return isPsxLoader(program);
}

@Override
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/psx/PsxLoader.java
Expand Up @@ -65,6 +65,8 @@ public class PsxLoader extends AbstractLibrarySupportLoader {
0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00
};

public static final String PSX_LOADER = "PSX Executables Loader";

private static final byte MAIN_SIGN_MASK[] = new byte[] {
0x00, 0x00, 0x00, (byte)0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
Expand All @@ -75,7 +77,7 @@ public class PsxLoader extends AbstractLibrarySupportLoader {

@Override
public String getName() {
return "PSX Executables Loader";
return PSX_LOADER;
}

@Override
Expand Down Expand Up @@ -131,10 +133,10 @@ protected void load(ByteProvider provider, LoadSpec loadSpec, List<Option> optio
}

private void findAndAppyMain(Program program, FlatProgramAPI fpa, MessageLog log, TaskMonitor monitor) {
Address mainAddr = program.getMemory().findBytes(fpa.toAddr(psxExe.getInitPc()), MAIN_SIGN, MAIN_SIGN_MASK, true, monitor);
Address mainAddr = program.getMemory().findBytes(fpa.toAddr(psxExe.getInitPc()), MAIN_SIGN, MAIN_SIGN_MASK, true, TaskMonitor.DUMMY);

if (mainAddr != null) {
PatParser.setInstrRefName(program, fpa, new PseudoDisassembler(program), mainAddr, "main", log, monitor);
PatParser.setInstrRefName(program, fpa, new PseudoDisassembler(program), mainAddr, "main", log);
}
}

Expand Down

0 comments on commit 2766f29

Please sign in to comment.