mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-19 16:40:38 -09:00
GP-2752: Remove TargetObject.addListener() and related
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user