Example #1
0
        public static void WriteProcessMemory <T>(UInt64 addr, T value)
        {
            if (typeof(T) == typeof(String))
            {
                var bytes = Encoding.UTF8.GetBytes((String)(Object)value);
                var l     = bytes.ToList();
                l.AddRange(Enumerable.Range(0, 16).Select(a => (Byte)0).ToList());
                bytes = l.ToArray();
                for (var i = 0u; i < bytes.Length - 8; i += 8)
                {
                    WriteProcessMemory(addr + i, BitConverter.ToUInt64(bytes, (Int32)i));
                }
                return;
            }
            var size   = Marshal.SizeOf <T>();
            var objPtr = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(value, objPtr, false);
            var input = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = addr;
            input.Size      = size;
            input.Buffer    = objPtr;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_WPM, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf <IoctlMemoryStruct>(), ref io, 0);

            Marshal.FreeHGlobal(objPtr);
        }
Example #2
0
        public static T ReadProcessMemory <T>(UInt64 addr)
        {
            if (typeof(T) == typeof(String))
            {
                List <Byte> bytes = new List <Byte>();
                for (UInt64 i = 0; i < 16; i++)
                {
                    var letters8  = ReadProcessMemory <UInt64>(addr + i * 8);
                    var tempBytes = BitConverter.GetBytes(letters8);
                    for (int j = 0; j < 8; j++)
                    {
                        if (tempBytes[j] == 0)
                        {
                            return((T)(Object)Encoding.UTF8.GetString(bytes.ToArray()));
                        }
                        bytes.Add(tempBytes[j]);
                    }
                }
                return((T)(Object)Encoding.UTF8.GetString(bytes.ToArray()));
            }
            var    size   = Marshal.SizeOf <T>();
            IntPtr intPtr = Marshal.AllocHGlobal(size);
            var    input  = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = addr;
            input.Size      = size;
            input.Buffer    = intPtr;

            var   output  = new IoctlMemoryStruct();
            ulong io      = 0;
            var   status  = DeviceIoControl(DeviceHandle, IOCTL_RPM, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf(typeof(IoctlMemoryStruct)), ref io, 0);
            var   obj     = Marshal.PtrToStructure <T>(intPtr);
            var   members = obj.GetType().GetFields();

            foreach (var member in members)
            {
                if (member.FieldType != typeof(String))
                {
                    continue;
                }
                var t = member.GetValue(obj);

                var str23       = ReadProcessMemory <UInt32>(addr + 0x60 + 16);
                var offset      = Marshal.OffsetOf <T>(member.Name).ToInt32();
                var qq          = (Int64)Marshal.ReadIntPtr(intPtr, offset + 16);
                var smartString = (Int64)Marshal.ReadIntPtr(intPtr, offset + 16) >> 32 == 0x1f;
                if (!smartString)
                {
                    continue;
                }
                var strPtr = (Int32)(Int64)Marshal.ReadIntPtr(intPtr, offset);
                var str    = ReadProcessMemory <String>((UInt64)strPtr);
                member.SetValueDirect(__makeref(obj), str);
            }
            Marshal.FreeHGlobal(intPtr);
            return(obj);
        }
Example #3
0
        public static void CreateThread(UInt64 addr, UInt64 param)
        {
            var input = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = addr;
            input.Size      = 0;
            input.Buffer    = (IntPtr)param;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_CREATE_THREAD, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf <IoctlMemoryStruct>(), ref io, 0);
        }
Example #4
0
        public static void WriteBytes(IntPtr addr, Byte[] bytes)
        {
            var objPtr = Marshal.AllocHGlobal(bytes.Length);

            Marshal.Copy(bytes, 0, objPtr, bytes.Length);
            var input = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = (UInt64)addr;
            input.Size      = bytes.Length;
            input.Buffer    = objPtr;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_WPM, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf <IoctlMemoryStruct>(), ref io, 0);

            Marshal.FreeHGlobal(objPtr);
        }
Example #5
0
        public static void FreeProcessMem(UInt64 address)
        {
            var input  = new IoctlMemoryStruct();
            var objPtr = Marshal.AllocHGlobal(64);

            WriteProcessMemory((UInt64)(objPtr + 8), Allocs[address].Item1);
            WriteProcessMemory((UInt64)(objPtr + 16), Allocs[address].Item2);
            input.ProcessId = ProcessId;
            input.Address   = address;
            input.Size      = 0;
            input.Buffer    = objPtr;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_DEALLOC, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf <IoctlMemoryStruct>(), ref io, 0);

            Marshal.FreeHGlobal(objPtr);
        }
Example #6
0
        public static void WriteProcessMemory <T>(UInt64 addr, T value)
        {
            var objPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));

            Marshal.StructureToPtr(value, objPtr, false);
            var size  = Marshal.SizeOf(typeof(T));
            var input = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = addr;
            input.Size      = size;
            input.Buffer    = objPtr;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_WPM, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf <IoctlMemoryStruct>(), ref io, 0);

            Marshal.FreeHGlobal(objPtr);
        }
Example #7
0
        public static Byte[] ReadBytes(IntPtr addr, Int32 size)
        {
            IntPtr intPtr = Marshal.AllocHGlobal(size);
            var    input  = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = (UInt64)addr;
            input.Size      = size;
            input.Buffer    = intPtr;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_RPM, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf(typeof(IoctlMemoryStruct)), ref io, 0);
            var   bytes  = new Byte[size];

            Marshal.Copy(intPtr, bytes, 0, size);
            Marshal.FreeHGlobal(intPtr);
            return(bytes);
        }
Example #8
0
        public static UInt64 AllocProcessMem(Int32 size)
        {
            IntPtr intPtr = Marshal.AllocHGlobal(64);
            var    input  = new IoctlMemoryStruct();

            input.ProcessId = ProcessId;
            input.Address   = 0;
            input.Size      = size;
            input.Buffer    = intPtr;
            var   output = new IoctlMemoryStruct();
            ulong io     = 0;
            var   status = DeviceIoControl(DeviceHandle, IOCTL_ALLOC, input, Marshal.SizeOf <IoctlMemoryStruct>(), output, Marshal.SizeOf <IoctlMemoryStruct>(), ref io, 0);
            var   obj    = (UInt64)Marshal.ReadInt64(intPtr);
            var   obj2   = (UInt64)Marshal.ReadInt64(intPtr + 8);
            var   obj3   = (UInt64)Marshal.ReadInt64(intPtr + 16);

            Allocs.Add(obj, Tuple.Create(obj2, obj3));
            Marshal.FreeHGlobal(intPtr);
            return(obj);
        }