示例#1
0
        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");
        }