public override Program LoadProgram(Address?addrLoad) { addrLoad ??= PreferredBaseAddress; var cfgSvc = Services.RequireService <IConfigurationService>(); arch = (M68kArchitecture)cfgSvc.GetArchitecture("m68k") !; var imgReader = new BeImageReader(RawImage, 0); var parse = new HunkFileParser(imgReader, false); this.hunkFile = parse.Parse(); BuildSegments(); this.firstCodeHunk = parse.FindFirstCodeHunk(); var platform = cfgSvc.GetEnvironment("amigaOS").Load(Services, arch); var imageMap = platform.CreateAbsoluteMemoryMap(); var mem = new ByteMemoryArea(addrLoad, RelocateBytes(addrLoad)); var program = new Program( new SegmentMap( mem.BaseAddress, new ImageSegment( "code", mem, AccessMode.ReadWriteExecute)), arch, platform); var sym = ImageSymbol.Procedure(program.Architecture, addrLoad, state: arch.CreateProcessorState()); program.ImageSymbols[sym.Address] = sym; program.EntryPoints[sym.Address] = sym; return(program); }
/* * bin = args.bin * bin_args = args.args * print "vamos: %s %s" % (bin, bin_args) * # --- load binary --- # hunk_file = HunkReader.HunkReader() # fobj = file(bin,"rb") # result = hunk_file.read_file_obj(bin,fobj,None) # if result != Hunk.RESULT_OK: # print "Error loading '%s'" % (bin) # sys.exit(1) # build segments # ok = hunk_file.build_segments() # if not ok: # print "Error building segments for '%s'" % (bin) # sys.exit(2) # make sure its a loadseg() # if hunk_file.type != Hunk.TYPE_LOADSEG: # print "File not loadSeg()able: '%s'" % (bin) # sys.exit(3) # # --- create memory layout --- # print "setting up memory layout" # layout = MemoryLayout.MemoryLayout(verbose=True) # context = MachineContext.MachineContext(MusashiCPU(),layout) # # place prog segments # prog_base = 0x010000 # prog_start = prog_base # off = prog_base # relocator = HunkRelocate.HunkRelocate(hunk_file) # prog_data = relocator.relocate_one_block(prog_base, padding=8) # prog_size = len(prog_data) # prog_mem = MemoryBlock.MemoryBlock("prog", prog_base, prog_size) # prog_mem.write_data(prog_base, prog_data) # layout.add_range(prog_mem) # print prog_mem # # some segment info # seg_sizes = relocator.get_sizes() # seg_addrs = relocator.get_seq_addrs(prog_base, padding=8) # for i in xrange(len(seg_sizes)): # print " seg: @%06x +%06x" % (seg_addrs[i], seg_sizes[i]) # # setup stack # magic_end = 0xff0000 # stack_base = 0x080000 # stack_size = 0x001000 # stack_end = stack_base + stack_size # stack_mem = MemoryBlock.MemoryBlock("stack", stack_base, stack_size) # stack_initial = stack_end - 4 # stack_mem.w32(stack_initial, magic_end) # layout.add_range(stack_mem) # # setup argument # arg_base = 0x1000 # arg_text = " ".join(bin_args) # arg_len = len(arg_text) # arg_size = arg_len + 1 # arg_mem = MemoryBlock.MemoryBlock("args", arg_base, arg_size) # arg_mem.write_data(arg_base, arg_text) # arg_mem.write_mem(0, arg_base + arg_len, 0) # layout.add_range(arg_mem) # print "args: %s (%d)" % (arg_text, arg_len) # print arg_mem */ public override RelocationResults Relocate(Program program, Address addrLoad) { var entries = new List <EntryPoint> { //$TODO: what are the registers on entry? new EntryPoint(addrLoad, arch.CreateProcessorState()) }; return(new RelocationResults(entries, new List <Address>())); }
private void RunTest(Address addrBase) { var project = new Project { Programs = { program } }; scanner = new Scanner( program, new ImportResolver(project, program, new FakeDecompilerEventListener()), sc); scanner.EnqueueEntryPoint(new EntryPoint(addrBase, arch.CreateProcessorState())); scanner.ScanImage(); }
public void AOS_LookupA6Call() { Given_Func("#1 512 0x200 Allocate( heap/a1, size/d0)\n"); When_Create_Platform(); m.Call(m.IAdd(binder.EnsureRegister(Registers.a6), -512), 4); var state = arch.CreateProcessorState(); var svc = platform.FindService(rtls.Last(), state); Assert.AreEqual("Allocate", svc.Name); Assert.AreEqual(2, svc.Signature.Parameters.Length); Assert.AreEqual("a1", svc.Signature.Parameters[0].Storage.ToString()); Assert.AreEqual("d0", svc.Signature.Parameters[1].Storage.ToString()); }
private void RunTest(Address addrBase) { var project = new Project { Programs = { program } }; scanner = new Scanner( program, new Dictionary <Address, ProcedureSignature>(), new ImportResolver(project), listener); scanner.EnqueueEntryPoint(new EntryPoint(addrBase, arch.CreateProcessorState())); scanner.ScanImage(); }
/* * bin = args.bin * bin_args = args.args * print "vamos: %s %s" % (bin, bin_args) * # --- load binary --- # hunk_file = HunkReader.HunkReader() # fobj = file(bin,"rb") # result = hunk_file.read_file_obj(bin,fobj,None) # if result != Hunk.RESULT_OK: # print "Error loading '%s'" % (bin) # sys.exit(1) # build segments # ok = hunk_file.build_segments() # if not ok: # print "Error building segments for '%s'" % (bin) # sys.exit(2) # make sure its a loadseg() # if hunk_file.type != Hunk.TYPE_LOADSEG: # print "File not loadSeg()able: '%s'" % (bin) # sys.exit(3) # # --- create memory layout --- # print "setting up memory layout" # layout = MemoryLayout.MemoryLayout(verbose=True) # context = MachineContext.MachineContext(MusashiCPU(),layout) # # place prog segments # prog_base = 0x010000 # prog_start = prog_base # off = prog_base # relocator = HunkRelocate.HunkRelocate(hunk_file) # prog_data = relocator.relocate_one_block(prog_base, padding=8) # prog_size = len(prog_data) # prog_mem = MemoryBlock.MemoryBlock("prog", prog_base, prog_size) # prog_mem.write_data(prog_base, prog_data) # layout.add_range(prog_mem) # print prog_mem # # some segment info # seg_sizes = relocator.get_sizes() # seg_addrs = relocator.get_seq_addrs(prog_base, padding=8) # for i in xrange(len(seg_sizes)): # print " seg: @%06x +%06x" % (seg_addrs[i], seg_sizes[i]) # # setup stack # magic_end = 0xff0000 # stack_base = 0x080000 # stack_size = 0x001000 # stack_end = stack_base + stack_size # stack_mem = MemoryBlock.MemoryBlock("stack", stack_base, stack_size) # stack_initial = stack_end - 4 # stack_mem.w32(stack_initial, magic_end) # layout.add_range(stack_mem) # # setup argument # arg_base = 0x1000 # arg_text = " ".join(bin_args) # arg_len = len(arg_text) # arg_size = arg_len + 1 # arg_mem = MemoryBlock.MemoryBlock("args", arg_base, arg_size) # arg_mem.write_data(arg_base, arg_text) # arg_mem.write_mem(0, arg_base + arg_len, 0) # layout.add_range(arg_mem) # print "args: %s (%d)" % (arg_text, arg_len) # print arg_mem */ public override RelocationResults Relocate(Program program, Address addrLoad) { var sym = new ImageSymbol(addrLoad) { Type = SymbolType.Procedure, ProcessorState = arch.CreateProcessorState() }; var entries = new List <ImageSymbol> { //$TODO: what are the registers on entry? }; return(new RelocationResults( new List <ImageSymbol> { sym }, new SortedList <Address, ImageSymbol> { { sym.Address, sym } })); }
protected override IEnumerable <RtlInstructionCluster> GetInstructionStream(Frame frame, IRewriterHost host) { return(arch.CreateRewriter(mem.CreateLeReader(0), arch.CreateProcessorState(), arch.CreateFrame(), host)); }
/* * bin = args.bin * bin_args = args.args * print "vamos: %s %s" % (bin, bin_args) * # --- load binary --- # hunk_file = HunkReader.HunkReader() # fobj = file(bin,"rb") # result = hunk_file.read_file_obj(bin,fobj,None) # if result != Hunk.RESULT_OK: # print "Error loading '%s'" % (bin) # sys.exit(1) # build segments # ok = hunk_file.build_segments() # if not ok: # print "Error building segments for '%s'" % (bin) # sys.exit(2) # make sure its a loadseg() # if hunk_file.type != Hunk.TYPE_LOADSEG: # print "File not loadSeg()able: '%s'" % (bin) # sys.exit(3) # # --- create memory layout --- # print "setting up memory layout" # layout = MemoryLayout.MemoryLayout(verbose=True) # context = MachineContext.MachineContext(MusashiCPU(),layout) # # place prog segments # prog_base = 0x010000 # prog_start = prog_base # off = prog_base # relocator = HunkRelocate.HunkRelocate(hunk_file) # prog_data = relocator.relocate_one_block(prog_base, padding=8) # prog_size = len(prog_data) # prog_mem = MemoryBlock.MemoryBlock("prog", prog_base, prog_size) # prog_mem.write_data(prog_base, prog_data) # layout.add_range(prog_mem) # print prog_mem # # some segment info # seg_sizes = relocator.get_sizes() # seg_addrs = relocator.get_seq_addrs(prog_base, padding=8) # for i in xrange(len(seg_sizes)): # print " seg: @%06x +%06x" % (seg_addrs[i], seg_sizes[i]) # # setup stack # magic_end = 0xff0000 # stack_base = 0x080000 # stack_size = 0x001000 # stack_end = stack_base + stack_size # stack_mem = MemoryBlock.MemoryBlock("stack", stack_base, stack_size) # stack_initial = stack_end - 4 # stack_mem.w32(stack_initial, magic_end) # layout.add_range(stack_mem) # # setup argument # arg_base = 0x1000 # arg_text = " ".join(bin_args) # arg_len = len(arg_text) # arg_size = arg_len + 1 # arg_mem = MemoryBlock.MemoryBlock("args", arg_base, arg_size) # arg_mem.write_data(arg_base, arg_text) # arg_mem.write_mem(0, arg_base + arg_len, 0) # layout.add_range(arg_mem) # print "args: %s (%d)" % (arg_text, arg_len) # print arg_mem */ public override RelocationResults Relocate(Program program, Address addrLoad) { var sym = ImageSymbol.Procedure(program.Architecture, addrLoad, state: arch.CreateProcessorState()); var entries = new List <ImageSymbol> { //$TODO: what are the registers on entry? }; return(new RelocationResults( new List <ImageSymbol> { sym }, new SortedList <Address, ImageSymbol> { { sym.Address, sym } })); }