示例#1
0
        public void Cmasp_Do()
        {
            var addr     = Address.SegPtr(0x0C20, 0);
            var proc     = new Procedure("foo", null);
            var progaddr = new ProgramAddress(program, addr);
            var dc       = mr.Stub <IDecompiler>();
            var dcSvc    = mr.Stub <IDecompilerService>();
            var brSvc    = mr.Stub <IProjectBrowserService>();

            dcSvc.Decompiler = dc;
            sc.AddService <IDecompilerService>(dcSvc);
            sc.AddService <IProjectBrowserService>(brSvc);
            sc.AddService <IDecompilerShellUiService>(new FakeShellUiService());
            dc.Expect(d => d.ScanProcedure(progaddr)).IgnoreArguments().Return(proc);
            brSvc.Expect(b => b.Reload());
            mr.ReplayAll();

            var locations = new[] { new ProgramAddress(program, addr) };
            var cmd       = new Cmd_MarkProcedures(sc, locations);

            cmd.DoIt();

            mr.VerifyAll();
            Assert.AreEqual(1, program.User.Procedures.Count);
            var uproc = program.User.Procedures.Values[0];

            Assert.AreEqual("0C20:0000", uproc.Address);
        }
示例#2
0
        public void Cmasp_Do()
        {
            var addr     = Address.SegPtr(0x0C20, 0);
            var proc     = new Procedure(new FakeArchitecture(), "foo", addr, null);
            var progaddr = new ProgramAddress(program, addr);
            var dc       = new Mock <IDecompiler>();
            var dcSvc    = new Mock <IDecompilerService>();
            var brSvc    = new Mock <IProjectBrowserService>();

            dcSvc.Setup(d => d.Decompiler).Returns(dc.Object);
            sc.AddService <IDecompilerService>(dcSvc.Object);
            sc.AddService <IProjectBrowserService>(brSvc.Object);
            sc.AddService <IDecompilerShellUiService>(new FakeShellUiService());
            dc.Setup(d => d.ScanProcedure(It.IsAny <ProgramAddress>())).Returns(proc).Verifiable();
            brSvc.Setup(b => b.Reload()).Verifiable();
            brSvc.Setup(b => b.CurrentProgram).Returns(program);

            var locations = new[] { new ProgramAddress(program, addr) };
            var cmd       = new Cmd_MarkProcedures(sc, locations);

            cmd.DoIt();

            dc.VerifyAll();
            brSvc.Verify();
            Assert.AreEqual(1, program.User.Procedures.Count);
            var uproc = program.User.Procedures.Values[0];

            Assert.AreEqual("0C20:0000", uproc.Address);
        }
示例#3
0
        public void MarkAndScanProcedure()
        {
            if (!TryGetSelectedAddressRange(out var addrRange))
            {
                return;
            }
            var address = new ProgramAddress(program, addrRange.Begin);

            services.RequireService <ICommandFactory>().MarkProcedure(address).Do();
        }
示例#4
0
        private void ModifyDeclaration()
        {
            var       declText = declarationForm.TextBox.Text.Trim();
            Procedure proc;

            if (!program.Procedures.TryGetValue(address, out proc))
            {
                proc = null;
            }
            ProcedureBase_v1  sProc;
            GlobalDataItem_v2 parsedGlobal;
            string            procName   = null;
            string            CSignature = null;

            if (TryParseSignature(declText, out sProc))
            {
                procName   = sProc.Name;
                CSignature = declText;
            }
            else if (UserSignatureBuilder.IsValidCIdentifier(declText) &&
                     (proc == null || proc.Name != declText))
            {
                procName = declText;
            }
            else if (!editProcedure && TryParseGlobal(declText, out parsedGlobal))
            {
                program.User.Procedures.Remove(address);
                program.ModifyUserGlobal(
                    program.Architecture,
                    address,
                    parsedGlobal.DataType,
                    parsedGlobal.Name
                    );
            }

            if (procName != null)
            {
                program.RemoveUserGlobal(address);
                var up = program.EnsureUserProcedure(address, procName);
                if (CSignature != null)
                {
                    up.CSignature = CSignature;
                }
                if (proc != null)
                {
                    proc.Name = procName;
                }
                else
                {
                    var pAddr = new ProgramAddress(program, address);
                    services.RequireService <ICommandFactory>().MarkProcedure(pAddr).Do();
                }
            }
        }
示例#5
0
 public string RenderCode(ProgramAddress hit)
 {
     try
     {
         var dasm = hit.Program.CreateDisassembler(hit.Address);
         return(string.Join("; ", dasm.Take(4).Select(inst => inst.ToString().Replace('\t', ' '))));
     }
     catch
     {
         return("<invalid>");
     }
 }
示例#6
0
        /// <summary>
        /// Starts a scan at address <paramref name="addr"/> on the user's request.
        /// </summary>
        /// <param name="addr"></param>
        /// <returns>a ProcedureBase, because the target procedure may have been a thunk or
        /// an linked procedure the user has decreed not decompileable.</returns>
        public ProcedureBase ScanProcedure(ProgramAddress paddr)
        {
            if (scanner == null)        //$TODO: it's unfortunate that we depend on the scanner of the Decompiler class.
            {
                scanner = CreateScanner(paddr.Program);
            }
            Procedure_v1 sProc;
            var          procName = paddr.Program.User.Procedures.TryGetValue(
                paddr.Address, out sProc) ? sProc.Name : null;

            return(scanner.ScanProcedure(paddr.Address, procName, paddr.Program.Architecture.CreateProcessorState()));
        }
示例#7
0
        private ProcedureBase DoScanProcedure(ProgramAddress paddr, string sArch)
        {
            //$TODO: do this in a worker procedure.
            if (sArch == null)
            {
                return(null);
            }
            if (!paddr.Program.Architectures.TryGetValue(sArch, out var arch))
            {
                return(null);
            }
            var proc = decSvc.Decompiler.ScanProcedure(paddr, arch);

            return(proc);
        }
示例#8
0
        public string RenderData(ProgramAddress hit)
        {
            var rdr = hit.Program.CreateImageReader(hit.Address);
            var sb  = new StringBuilder();
            int cb  = 0;

            while (rdr.IsValid)
            {
                var ch = rdr.ReadByte();
                if (ch == 0 || cb >= 16)
                {
                    break;
                }
                sb.AppendFormat("{0:X2} ", (uint)ch);
                ++cb;
            }
            return(sb.ToString());
        }
示例#9
0
        public string RenderString(ProgramAddress hit)
        {
            var rdr = hit.Program.CreateImageReader(hit.Address);
            var sb  = new StringBuilder();

            while (rdr.IsValid)
            {
                var ch = rdr.ReadByte();
                if (ch == 0 || sb.Length > 80)
                {
                    break;
                }
                sb.Append(0x20 <= ch && ch < 0x7F
                    ? (char)ch
                    : '.');
            }
            return(sb.ToString());
        }
        private ProgramAddress GetLatAndLng(Address address, string description)
        {
            string         houseNumber = address.HouseNumber;
            string         street      = address.Street;
            string         city        = address.City;
            string         state       = address.State;
            int            zip         = address.ZipCode;
            string         country     = "United States";
            string         fullAddress = houseNumber.ToString() + " " + street + " " + city + ", " + country + " " + state + " " + zip;
            ProgramAddress mapAddress  = new ProgramAddress();

            mapAddress.description = description;
            var locationService = new GoogleLocationService();
            var point           = locationService.GetLatLongFromAddress(fullAddress);

            mapAddress.lat = point.Latitude;
            mapAddress.lng = point.Longitude;

            return(mapAddress);
        }
        // GET: Addresses
        public ActionResult Index(int?id)
        {
            var             job         = (from a in db.Jobs where a.JobId == id select a).FirstOrDefault();
            ApplicationUser currentUser = System.Web.HttpContext.Current.GetOwinContext().GetUserManager <ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
            ProgramAddress  userLoc     = new ProgramAddress();
            ProgramAddress  businessLoc = new ProgramAddress();

            userLoc                 = GetLatAndLng(currentUser.Address, "You Are Here!");
            businessLoc.lat         = job.Latitude;
            businessLoc.lng         = job.Longitude;
            businessLoc.description = job.CompanyName;

            List <ProgramAddress> myAddresses = new List <ProgramAddress>();

            myAddresses.Add(userLoc);
            myAddresses.Add(businessLoc);

            var model = new IndexViewModel
            {
                programmed = myAddresses
            };

            return(View(model));
        }
示例#12
0
 public ICommand MarkProcedure(ProgramAddress address)
 {
     return(new Cmd_MarkProcedures(services, new ProgramAddress[] { address }));
 }