Exemple #1
0
        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;
                }
            }
        }
Exemple #2
0
        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);
        }