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); }
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(); }
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(); }
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>"; } }
/// <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); return scanner.ScanProcedure(paddr.Address, null, paddr.Program.Architecture.CreateProcessorState()); }
public ICommand MarkProcedure(ProgramAddress address) { return new Cmd_MarkProcedures(services, new ProgramAddress[] { address }); }
/// <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()); }
public void MarkAndScanProcedure() { AddressRange addrRange; if (!TryGetSelectedAddressRange(out addrRange)) return; var address = new ProgramAddress(program, addrRange.Begin); services.RequireService<ICommandFactory>().MarkProcedure(address).Do(); }
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( 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(); } } }