GP-2752: Remove TargetObject.addListener() and related

This commit is contained in:
Dan
2022-11-10 13:46:23 -05:00
parent c301dd2c89
commit 50c7217635
78 changed files with 384 additions and 1261 deletions

View File

@@ -22,11 +22,9 @@ import java.util.concurrent.CompletableFuture;
import agent.frida.manager.impl.FridaManagerImpl;
import agent.frida.model.AbstractFridaModel;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerModelListener;
import ghidra.dbg.agent.SpiTargetObject;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.util.CollectionUtils.Delta;
import ghidra.util.datastruct.ListenerSet;
public interface FridaModelTargetObject extends SpiTargetObject {
@@ -59,8 +57,6 @@ public interface FridaModelTargetObject extends SpiTargetObject {
public CompletableFuture<List<TargetObject>> requestNativeElements();
public ListenerSet<DebuggerModelListener> getListeners();
public FridaModelTargetSession getParentSession();
public FridaModelTargetProcess getParentProcess();

View File

@@ -50,7 +50,7 @@ public interface FridaModelTargetSession extends //
== DebugOutputFlags.DEBUG_OUTPUT_WARNING.getValue())) {
chan = TargetConsole.Channel.STDERR;
}
getListeners().fire.consoleOutput(getProxy(), chan, output);
broadcast().consoleOutput(getProxy(), chan, output);
}
@Override

View File

@@ -80,7 +80,7 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
listeners.fire.invalidateCacheRequested(this);
broadcast().invalidateCacheRequested(this);
}
return getManager().listKernelMemory();
}
@@ -104,12 +104,12 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
if (range == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address);
}
listeners.fire.memoryUpdated(getProxy(), address, buf.array());
broadcast().memoryUpdated(getProxy(), address, buf.array());
return Arrays.copyOf(buf.array(), (int) range.getLength());
}
private void writeAssist(Address address, byte[] data) {
listeners.fire.memoryUpdated(getProxy(), address, data);
broadcast().memoryUpdated(getProxy(), address, data);
}
@Override

View File

@@ -72,12 +72,13 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
TargetThread eventThread =
(TargetThread) getModel().getModelObject(thread);
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
getListeners().fire.event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
}
@Override
public void moduleReplaced(FridaProcess proc, FridaModuleInfo info, int index, FridaCause cause) {
public void moduleReplaced(FridaProcess proc, FridaModuleInfo info, int index,
FridaCause cause) {
FridaModule module = info.getModule(index);
changeElements(List.of(), List.of(getTargetModule(module)), Map.of(), "Replaced");
FridaModelTargetModule targetModule = getTargetModule(module);
@@ -85,14 +86,15 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
}
@Override
public void moduleUnloaded(FridaProcess proc, FridaModuleInfo info, int index, FridaCause cause) {
public void moduleUnloaded(FridaProcess proc, FridaModuleInfo info, int index,
FridaCause cause) {
FridaModelTargetModule targetModule = getTargetModule(info.getModule(index));
if (targetModule != null) {
FridaThread thread = getManager().getCurrentThread();
TargetThread eventThread =
(TargetThread) getModel().getModelObject(thread);
getListeners().fire.event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
FridaModelImpl impl = (FridaModelImpl) model;
impl.deleteModelObject(targetModule.getModule());
}
@@ -112,7 +114,7 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
listeners.fire.invalidateCacheRequested(this);
broadcast().invalidateCacheRequested(this);
}
return getManager().listKernelModules();
}
@@ -121,7 +123,8 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
public FridaModelTargetKernelModuleImpl getTargetModule(FridaModule module) {
TargetObject targetObject = getMapObject(module);
if (targetObject != null) {
FridaModelTargetKernelModuleImpl targetModule = (FridaModelTargetKernelModuleImpl) targetObject;
FridaModelTargetKernelModuleImpl targetModule =
(FridaModelTargetKernelModuleImpl) targetObject;
targetModule.setModelObject(module);
return targetModule;
}

View File

@@ -102,7 +102,7 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
listeners.fire.invalidateCacheRequested(this);
broadcast().invalidateCacheRequested(this);
}
return getManager().listMemory(process.getProcess());
}
@@ -126,12 +126,12 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
if (range == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address);
}
listeners.fire.memoryUpdated(getProxy(), address, buf.array());
broadcast().memoryUpdated(getProxy(), address, buf.array());
return Arrays.copyOf(buf.array(), (int) range.getLength());
}
private void writeAssist(Address address, byte[] data) {
listeners.fire.memoryUpdated(getProxy(), address, data);
broadcast().memoryUpdated(getProxy(), address, data);
}
@Override

View File

@@ -20,25 +20,12 @@ import java.util.Map;
import java.util.concurrent.CompletableFuture;
import agent.frida.frida.FridaModuleInfo;
import agent.frida.manager.FridaCause;
import agent.frida.manager.FridaModule;
import agent.frida.manager.FridaProcess;
import agent.frida.manager.FridaSession;
import agent.frida.manager.FridaThread;
import agent.frida.model.iface2.FridaModelTargetModule;
import agent.frida.model.iface2.FridaModelTargetModuleContainer;
import agent.frida.model.iface2.FridaModelTargetSession;
import agent.frida.model.methods.FridaModelTargetModuleInitImpl;
import agent.frida.model.methods.FridaModelTargetModuleInterceptorImpl;
import agent.frida.model.methods.FridaModelTargetModuleLoadImpl;
import agent.frida.model.methods.FridaModelTargetUnloadScriptImpl;
import ghidra.dbg.target.TargetModule;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetThread;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
import agent.frida.manager.*;
import agent.frida.model.iface2.*;
import agent.frida.model.methods.*;
import ghidra.dbg.target.*;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.util.Msg;
@TargetObjectSchemaInfo(
@@ -77,7 +64,7 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
unload //
), Map.of( //
), "Initialized");
getManager().addEventsListener(this);
requestElements(true);
}
@@ -103,12 +90,13 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
TargetThread eventThread =
(TargetThread) getModel().getModelObject(thread);
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
getListeners().fire.event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
}
@Override
public void moduleReplaced(FridaProcess proc, FridaModuleInfo info, int index, FridaCause cause) {
public void moduleReplaced(FridaProcess proc, FridaModuleInfo info, int index,
FridaCause cause) {
FridaModule module = info.getModule(index);
changeElements(List.of(), List.of(getTargetModule(module)), Map.of(), "Replaced");
FridaModelTargetModule targetModule = getTargetModule(module);
@@ -116,14 +104,15 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
}
@Override
public void moduleUnloaded(FridaProcess proc, FridaModuleInfo info, int index, FridaCause cause) {
public void moduleUnloaded(FridaProcess proc, FridaModuleInfo info, int index,
FridaCause cause) {
FridaModelTargetModule targetModule = getTargetModule(info.getModule(index));
if (targetModule != null) {
FridaThread thread = getManager().getCurrentThread();
TargetThread eventThread =
(TargetThread) getModel().getModelObject(thread);
getListeners().fire.event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
FridaModelImpl impl = (FridaModelImpl) model;
impl.deleteModelObject(targetModule.getModule());
}
@@ -143,7 +132,7 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
listeners.fire.invalidateCacheRequested(this);
broadcast().invalidateCacheRequested(this);
}
return getManager().listModules(session.getProcess());
}

View File

@@ -64,7 +64,7 @@ public class FridaModelTargetProcessContainerImpl extends FridaModelTargetObject
FridaModelTargetProcess process = getTargetProcess(proc);
changeElements(List.of(), List.of(process), Map.of(), "Added");
process.processStarted(proc);
getListeners().fire.event(getProxy(), null, TargetEventType.PROCESS_CREATED,
broadcast().event(getProxy(), null, TargetEventType.PROCESS_CREATED,
"Process " + FridaClient.getId(proc) + " started " + process.getName(),
List.of(process));
}

View File

@@ -236,7 +236,7 @@ public class FridaModelTargetProcessImpl extends FridaModelTargetObjectImpl
STATE_ATTRIBUTE_NAME, TargetExecutionState.TERMINATED, //
EXIT_CODE_ATTRIBUTE_NAME, exitDesc //
), "Exited");
getListeners().fire.event(getProxy(), null, TargetEventType.PROCESS_EXITED,
broadcast().event(getProxy(), null, TargetEventType.PROCESS_EXITED,
"Process " + FridaClient.getId(getProcess()) + " exited code=" + exitDesc,
List.of(getProxy()));
}

View File

@@ -16,42 +16,31 @@
package agent.frida.model.impl;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import agent.frida.manager.FridaReason;
import agent.frida.manager.FridaState;
import agent.frida.manager.FridaValue;
import agent.frida.model.iface2.FridaModelTargetRegister;
import agent.frida.model.iface2.FridaModelTargetRegisterBank;
import agent.frida.model.iface2.FridaModelTargetRegisterContainerAndBank;
import agent.frida.manager.*;
import agent.frida.model.iface2.*;
import ghidra.async.AsyncUtils;
import ghidra.dbg.DebuggerModelListener;
import ghidra.dbg.error.DebuggerRegisterAccessException;
import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetRegisterBank;
import ghidra.dbg.target.schema.TargetAttributeType;
import ghidra.dbg.target.schema.TargetElementType;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
import ghidra.util.datastruct.ListenerSet;
@TargetObjectSchemaInfo(
name = "RegisterContainer",
attributeResync = ResyncMode.ALWAYS,
elements = { //
@TargetElementType(type = FridaModelTargetRegisterImpl.class) //
@TargetElementType(type = FridaModelTargetRegisterImpl.class) //
},
attributes = {
@TargetAttributeType(
name = TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME,
type = FridaModelTargetRegisterContainerImpl.class),
@TargetAttributeType(type = Void.class)
@TargetAttributeType(
name = TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME,
type = FridaModelTargetRegisterContainerImpl.class),
@TargetAttributeType(type = Void.class)
},
canonicalContainer = true)
public class FridaModelTargetRegisterContainerImpl
@@ -64,10 +53,10 @@ public class FridaModelTargetRegisterContainerImpl
public FridaModelTargetRegisterContainerImpl(FridaModelTargetThreadImpl thread) {
super(thread.getModel(), thread, NAME, "RegisterContainer");
this.thread = thread;
changeAttributes(List.of(), List.of(), Map.of(
DISPLAY_ATTRIBUTE_NAME, getName(),
DESCRIPTIONS_ATTRIBUTE_NAME, this), "Initialized");
DISPLAY_ATTRIBUTE_NAME, getName(),
DESCRIPTIONS_ATTRIBUTE_NAME, this), "Initialized");
requestElements(false);
}
@@ -78,7 +67,7 @@ public class FridaModelTargetRegisterContainerImpl
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
listeners.fire.invalidateCacheRequested(this);
broadcast().invalidateCacheRequested(this);
}
return getManager().listRegisters(thread.getThread()).thenAccept(registers -> {
List<TargetObject> targetRegisters;
@@ -114,7 +103,8 @@ public class FridaModelTargetRegisterContainerImpl
requestAttributes(false).thenAccept(__ -> {
for (Object attribute : getCachedAttributes().values()) {
if (attribute instanceof FridaModelTargetRegisterBank) {
FridaModelTargetRegisterBank bank = (FridaModelTargetRegisterBank) attribute;
FridaModelTargetRegisterBank bank =
(FridaModelTargetRegisterBank) attribute;
bank.threadStateChangedSpecific(state, reason);
}
}
@@ -136,12 +126,9 @@ public class FridaModelTargetRegisterContainerImpl
byte[] bytes = register.getBytes();
result.put(regname, bytes);
}
ListenerSet<DebuggerModelListener> ls = getListeners();
if (ls != null) {
//if (getName().contains("General")) {
ls.fire.registersUpdated(this, result);
//}
}
//if (getName().contains("General")) {
broadcast().registersUpdated(this, result);
//}
return CompletableFuture.completedFuture(result);
}
@@ -158,7 +145,7 @@ public class FridaModelTargetRegisterContainerImpl
BigInteger val = new BigInteger(1, ent.getValue());
reg.getRegister().setValue(val.toString());
}
getListeners().fire.registersUpdated(getProxy(), values);
broadcast().registersUpdated(getProxy(), values);
return AsyncUtils.NIL;
}

View File

@@ -76,7 +76,7 @@ public class FridaModelTargetThreadContainerImpl extends FridaModelTargetObjectI
changeElements(List.of(), List.of(targetThread), Map.of(), "Created");
targetThread.threadStateChangedSpecific(FridaState.FRIDA_THREAD_UNINTERRUPTIBLE,
FridaReason.getReason(null));
getListeners().fire.event(getProxy(), targetThread, TargetEventType.THREAD_CREATED,
broadcast().event(getProxy(), targetThread, TargetEventType.THREAD_CREATED,
"Thread " + FridaClient.getId(thread) + " started", List.of(targetThread));
}
@@ -95,7 +95,7 @@ public class FridaModelTargetThreadContainerImpl extends FridaModelTargetObjectI
String threadId = FridaModelTargetThreadImpl.indexThread(thread);
FridaModelTargetThread targetThread = (FridaModelTargetThread) getMapObject(thread);
if (targetThread != null) {
getListeners().fire.event(getProxy(), targetThread, TargetEventType.THREAD_EXITED,
broadcast().event(getProxy(), targetThread, TargetEventType.THREAD_EXITED,
"Thread " + threadId + " exited", List.of(targetThread));
}
changeElements(List.of( //
@@ -108,7 +108,7 @@ public class FridaModelTargetThreadContainerImpl extends FridaModelTargetObjectI
FridaReason reason) {
FridaModelTargetThread targetThread = getTargetThread(thread);
TargetEventType eventType = getEventType(state, cause, reason);
getListeners().fire.event(getProxy(), targetThread, eventType,
broadcast().event(getProxy(), targetThread, eventType,
"Thread " + FridaClient.getId(thread) + " state changed", List.of(targetThread));
targetThread.threadStateChangedSpecific(state, reason);
}
@@ -133,7 +133,7 @@ public class FridaModelTargetThreadContainerImpl extends FridaModelTargetObjectI
@Override
public CompletableFuture<Void> requestElements(boolean refresh) {
if (refresh) {
listeners.fire.invalidateCacheRequested(this);
broadcast().invalidateCacheRequested(this);
}
return getManager().listThreads(process);
}