public void Connect() { StartProcess (); if (_file != null) { ManualResetEvent evt = new ManualResetEvent (false); bool success = false; QueueCommand (new FileCmd (_file, delegate(bool s) { success = s; evt.Set (); }, this)); evt.WaitOne (); if (!success) throw new ArgumentException ("Could not load file"); if(_maxInstructions != null) QueueCommand(new SetMaxInstructionsCmd(_maxInstructions.Value, this)); } if (_target == "run_local") { } else if (_target == "attach_local") { ManualResetEvent attachEvt = new ManualResetEvent (false); QueueCommand (new AttachCmd (this, int.Parse (_targetOptions), delegate(string file) { attachEvt.Set (); })); attachEvt.WaitOne (); } else { bool connected = false; ManualResetEvent connectedEvt = new ManualResetEvent (false); TargetCmd targetCmd = new TargetCmd (_target, (Action<bool>)delegate(bool connectionStatus) { connected = connectionStatus; connectedEvt.Set (); }, this); QueueCommand (targetCmd); connectedEvt.WaitOne (); if (!connected) throw new Exception ("Could not establish connection"); } ManualResetEvent evtMaintArchitecture = new ManualResetEvent (false); QueueCommand (new MaintArchitectureCmd (this, delegate(IDictionary<string, string> discoveredValues) { if (discoveredValues.ContainsKey ("bfd_arch_info")) { string archInfo = discoveredValues["bfd_arch_info"]; if(archInfo.Contains("x86-64")) _registerTypeResolver = new RegisterTypeResolverX86_64(); else if(archInfo.Contains("x86") || archInfo.Contains("i386")) _registerTypeResolver = new RegisterTypeResolverX86(); evtMaintArchitecture.Set(); } })); evtMaintArchitecture.WaitOne (); }
protected UInt64? FindProgramCounter(InstructionDescription insn, IRegisterTypeResolver registerTypeResolver, Registers regs) { string programCounterName = registerTypeResolver.GetRegisterName (RegisterTypeEnum.ProgramCounter); Register pcReg = regs.FindRegisterByName (programCounterName); foreach (RegisterChange regChange in insn.RegisterChanges) { if (regChange.Regnum == pcReg.Num) return ByteHelper.ByteArrayToUInt64 (regChange.Value, 0, regChange.Value.Length); } return null; }
public void Setup(string errorlog, string destination, Registers targetRegisters, IRegisterTypeResolver registerTypeResolver, params IDataAnalyzer[] analyzers) { _errorlog = errorlog; _destination = destination; _analyzers = analyzers; _targetRegisters = targetRegisters; _registerTypeResolver = registerTypeResolver; _doc = new XmlDocument (); _doc.AppendChild (_doc.CreateElement ("Errorlog")); foreach (IDataAnalyzer analyzer in analyzers) { analyzer.Path = _destination; analyzer.Setup (_doc.DocumentElement); } // It is supposed that there exists at least a single file for each prefix. // Find the highest prefix here foreach (string file in Directory.GetFiles (_destination)) { string[] splitted = Path.GetFileName(file).Split ('.'); if (splitted.Length > 0) { int prefix; if (int.TryParse (splitted[0], out prefix) && _highestPrefix < prefix) _highestPrefix = prefix; } } }
private void InitRegisterTypeResolver() { XmlElement registerTypeResolverNode = (XmlElement) _doc.DocumentElement.SelectSingleNode("RegisterTypeResolver"); if(registerTypeResolverNode == null) throw new ArgumentException("Missing RegisterTypeResolver-Node"); _registerTypeResolver = XmlFactoryHelpers.CreateInstance<IRegisterTypeResolver>( registerTypeResolverNode, "name", "Param"); }