private void ScanProgram(Program program) { try { eventListener.ShowStatus("Rewriting reachable machine code."); scanner = CreateScanner(program, eventListener); foreach (EntryPoint ep in program.EntryPoints) { scanner.EnqueueEntryPoint(ep); } foreach (Procedure_v1 up in program.UserProcedures.Values) { scanner.EnqueueUserProcedure(up); } foreach (var addr in program.FunctionHints) { scanner.EnqueueProcedure(addr); } scanner.ScanImage(); if (false || //$DEBUG program.Options.HeuristicScanning) { eventListener.ShowStatus("Finding machine code using heuristics."); scanner.ScanImageHeuristically(); } eventListener.ShowStatus("Finished rewriting reachable machine code."); } finally { host.WriteDisassembly(program, w => DumpAssembler(program, w)); host.WriteIntermediateCode(program, w => EmitProgram(program, null, w)); } }
private void ScanProgram(Program program) { try { eventListener.ShowStatus("Rewriting reachable machine code."); scanner = CreateScanner(program); foreach (var global in program.User.Globals) { var addr = global.Key; var tlDeser = program.CreateTypeLibraryDeserializer(); var dt = global.Value.DataType.Accept(tlDeser); scanner.EnqueueUserGlobalData(addr, dt); } foreach (EntryPoint ep in program.EntryPoints.Values) { scanner.EnqueueEntryPoint(ep); } foreach (Procedure_v1 up in program.User.Procedures.Values) { scanner.EnqueueUserProcedure(up); } foreach (var addr in program.FunctionHints) { scanner.EnqueueProcedure(addr); } scanner.ScanImage(); if (false || //$DEBUG program.User.Heuristics.Contains("HeuristicScanning")) { //eventListener.ShowStatus("Finding machine code using heuristics."); //scanner.ScanImageHeuristically(); } if (false || //$DEBUG program.User.Heuristics.Contains("Shingle heuristic")) { eventListener.ShowStatus("Shingle scanning"); var sh = new ShingledScanner(program, (IRewriterHost)scanner); var watch = new Stopwatch(); watch.Start(); var procs = sh.Scan(); var pprocs = procs.ToList(); watch.Stop(); Debug.Print( "Elapsed time: {0} msec for {1} procs", watch.ElapsedMilliseconds, pprocs.Count); foreach (var addr in procs) { scanner.ScanProcedure(addr, null, program.Architecture.CreateProcessorState()); } } eventListener.ShowStatus("Finished rewriting reachable machine code."); } finally { eventListener.ShowStatus("Writing .asm and .dis files."); host.WriteDisassembly(program, w => DumpAssembler(program, w)); host.WriteIntermediateCode(program, w => EmitProgram(program, null, w)); } }
private void ScanProgram(Program program) { try { eventListener.ShowStatus("Rewriting reachable machine code."); scanner = CreateScanner(program); foreach (EntryPoint ep in program.EntryPoints) { scanner.EnqueueEntryPoint(ep); } foreach (Procedure_v1 up in program.User.Procedures.Values) { scanner.EnqueueUserProcedure(up); } foreach (var addr in program.FunctionHints) { scanner.EnqueueProcedure(addr); } if (false || //$DEBUG program.User.Heuristics.Contains("shingle")) { eventListener.ShowStatus("Shingle scanning"); var sh = new ShingledScanner(program, (IRewriterHost) scanner); var procs = sh.Scan(); foreach (var addr in procs) { scanner.EnqueueProcedure(addr); } } scanner.ScanImage(); if (false || //$DEBUG program.User.Heuristics.Contains("HeuristicScanning")) { eventListener.ShowStatus("Finding machine code using heuristics."); scanner.ScanImageHeuristically(); } eventListener.ShowStatus("Finished rewriting reachable machine code."); } finally { host.WriteDisassembly(program, w => DumpAssembler(program, w)); host.WriteIntermediateCode(program, w => EmitProgram(program, null, w)); } }
private void ScanProgram(Program program) { try { eventListener.ShowStatus("Rewriting reachable machine code."); scanner = CreateScanner(program, eventListener); foreach (EntryPoint ep in program.EntryPoints) { scanner.EnqueueEntryPoint(ep); } foreach (Procedure_v1 up in program.UserProcedures.Values) { scanner.EnqueueUserProcedure(up); } scanner.ScanImage(); if (program.Options.HeuristicScanning) { eventListener.ShowStatus("Finding machine code using heuristics."); scanner.ScanImageHeuristically(); } eventListener.ShowStatus("Finished rewriting reachable machine code."); } finally { host.WriteDisassembly(program, w => DumpAssembler(program, w)); host.WriteIntermediateCode(program, w => EmitProgram(program, null, w)); } }