static ExecutionResult Execute(ILoaderResult loaded) { // Loader Stage 2 - setup file var image = loaded.Image.ToArray(); IKernel kernel; Agent agent; if (loaded.GetType() == typeof(LoaderResult32)) { Console.Out.WriteLine("Emulating Linux 32-bit kernel syscall interface"); kernel = new Linux32Kernel(); agent = new Agent(kernel, image, ((LoaderResult32)loaded).EntryPoint); } else if (loaded.GetType() == typeof(LoaderResult64)) { Console.Out.WriteLine("Emulating Linux 64-bit kernel syscall interface"); kernel = new Linux64Kernel(); agent = new Agent64(kernel, image, ((LoaderResult64)loaded).EntryPoint); } else { throw new InvalidOperationException(); } int?ret; do { ret = agent.Tick(); //agent.Dump(); } while (ret == null); switch (ret) { case -666: throw new Exception($"ERROR: Unknown bytecode!"); case 0: Console.WriteLine("\r\n\r\nProgram terminated."); return(new ExecutionResult(0)); default: Console.WriteLine("\r\n\r\nProgram errored out."); return(new ExecutionResult(ret ?? int.MinValue)); } }
public void MOV_Bonanza64() { var programText = new string[] { "section .text", "global _start", "_start:", "mov rax, 0x1111222233334444 ; rax = 0x1111222233334444", "mov eax, 0x55556666 ; actual: rax = 0x0000000055556666", "mov rax, 0x1111222233334444 ; rax = 0x1111222233334444", "mov ax, 0x7777 ; rax = 0x1111222233337777 (works!)", "mov rax, 0x1111222233334444 ; rax = 0x1111222233334444", "xor eax, eax ; actual: rax = 0x0000000000000000", " ; again, it wiped whole register" }; var compiler = new BytecodeCompiler <UInt64>(); var compiled = compiler.Compile(programText, "UNIT_TEST"); var agent = new Agent64(kernel, compiled.TextSegment, 0); var ret = agent.Tick(); Xunit.Assert.Null(ret); Xunit.Assert.Equal((ulong)0x1111222233334444, agent.ReadR64Register(Register.RAX)); ret = agent.Tick(); Xunit.Assert.Null(ret); Xunit.Assert.Equal((ulong)0x0000000055556666, agent.ReadR64Register(Register.RAX)); ret = agent.Tick(); Xunit.Assert.Null(ret); Xunit.Assert.Equal((ulong)0x1111222233334444, agent.ReadR64Register(Register.RAX)); ret = agent.Tick(); Xunit.Assert.Null(ret); Xunit.Assert.Equal((ulong)0x1111222233337777, agent.ReadR64Register(Register.RAX)); ret = agent.Tick(); Xunit.Assert.Null(ret); Xunit.Assert.Equal((ulong)0x1111222233334444, agent.ReadR64Register(Register.RAX)); ret = agent.Tick(); Xunit.Assert.Null(ret); Xunit.Assert.Equal((ulong)0x0000000000000000, agent.ReadR64Register(Register.RAX)); }