public static void Disassemble(ManualLogSource logSource, IntPtr memoryPtr, int size) { var data = new byte[size]; Marshal.Copy(memoryPtr, data, 0, size); var formatter = new NasmFormatter(); var output = new StringOutput(); var codeReader = new ByteArrayCodeReader(data); var decoder = Decoder.Create(64, codeReader); decoder.IP = (ulong)memoryPtr.ToInt64(); while (codeReader.CanReadByte) { decoder.Decode(out var instr); formatter.Format(instr, output); logSource.LogDebug($"{instr.IP:X16} {output.ToStringAndReset()}"); if (instr.Code == Code.Jmp_rm64 && instr.Immediate32 == 0 ) // && instr.IsIPRelativeMemoryOperand && instr.IPRelativeMemoryAddress = 6 { var address = new byte[8]; for (var i = 0; i < 8; i++) { address[i] = (byte)codeReader.ReadByte(); } logSource.LogDebug($"{instr.IP + (ulong) instr.Length:X16} db 0x{BitConverter.ToUInt64(address, 0):X16}"); decoder.IP += 8; } } }
void Test_ByteArrayCodeReader_ctor(ByteArrayCodeReader reader, byte[] expectedData) { int i = 0; Assert.Equal(0, reader.Position); while (reader.CanReadByte) { Assert.Equal(i, reader.Position); Assert.True(i < expectedData.Length); Assert.Equal(expectedData[i], reader.ReadByte()); i++; } Assert.Equal(i, reader.Position); Assert.Equal(expectedData.Length, i); Assert.Equal(-1, reader.ReadByte()); Assert.Equal(i, reader.Position); reader.Position = 0; Assert.Equal(0, reader.Position); i = 0; while (reader.CanReadByte) { Assert.Equal(i, reader.Position); Assert.True(i < expectedData.Length); Assert.Equal(expectedData[i], reader.ReadByte()); i++; } Assert.Equal(i, reader.Position); Assert.Equal(expectedData.Length, i); Assert.Equal(-1, reader.ReadByte()); Assert.Equal(i, reader.Position); reader.Position = reader.Count; Assert.Equal(reader.Count, reader.Position); Assert.False(reader.CanReadByte); Assert.Equal(-1, reader.ReadByte()); for (i = expectedData.Length - 1; i >= 0; i--) { reader.Position = i; Assert.Equal(i, reader.Position); Assert.True(reader.CanReadByte); Assert.Equal(expectedData[i], reader.ReadByte()); Assert.Equal(i + 1, reader.Position); } Assert.Throws <ArgumentOutOfRangeException>(() => reader.Position = int.MinValue); Assert.Throws <ArgumentOutOfRangeException>(() => reader.Position = -1); Assert.Throws <ArgumentOutOfRangeException>(() => reader.Position = expectedData.Length + 1); Assert.Throws <ArgumentOutOfRangeException>(() => reader.Position = int.MaxValue); }