SetMemory() 공개 메소드

Writes object(s) to a specified xbox memory location.
public SetMemory ( uint address ) : void
address uint Xbox memory location.
리턴 void
예제 #1
0
        /// <summary>
        /// Initializes the history page.
        /// </summary>
        public XboxHistory(Xbox xbox)
        {
            Xbox = xbox;
            Xbox.SetMemory(0xB00292D0, ScriptBufferAddress); // set up the script buffer

            if (IsPresent())
            {
                // restore our current allocations
                Xbox.ReloadAllocationTable();

                // check other settings like controller hook etc...
                XInputGetStateAddress = Xbox.GetUInt32(Gamepad.XInputGetState);
                OriginalGamepadCode   = Xbox.GetMemory(Gamepad.OriginalCodeBuffer, 10);
            }
            else
            {
                // allocate memory for our history pages
                AllocateHistoryPages(kSize);
                Xbox.SetMemory(kBaseAddress, 0x6F6C6559);   // "Yelo"
            }
        }
예제 #2
0
        public static bool RunModule(Xbox xbox, string module_path, ref uint base_address,
                                     out uint entry_point, out uint exit_address, out string error_details)
        {
            entry_point   = exit_address = uint.MaxValue;
            error_details = null;
            LowLevel.HResult result;

            if (!File.Exists(module_path))
            {
                error_details = "File does not exist!";
                return(false);
            }

            byte[] rebased_module;
            result = RebasedModuleBufferAllocate(module_path, out rebased_module, out error_details);

            if (result == LowLevel.HResult.Success)
            {
                try { base_address = xbox.AllocateMemory((uint)rebased_module.Length); }
                catch (Exception ex)
                {
                    result        = LowLevel.HResult.Unexpected;
                    error_details = ex.ToString();
                }

                entry_point = base_address;
                try { result = RebaseModule(xbox, module_path, rebased_module, ref entry_point); }
                catch (Exception ex)
                {
                    result        = LowLevel.HResult.Unexpected;
                    error_details = ex.ToString();
                }
                entry_point += base_address;

                if (result == LowLevel.HResult.Success)
                {
                    xbox.Pause();
                    xbox.SetMemory(base_address, rebased_module);
                    exit_address = xbox.CallAddress(entry_point, true);
                    xbox.Continue();
                }
            }

            if (error_details == null)
            {
                error_details = GetResultString(result);
            }

            return(result == LowLevel.HResult.Success);
        }
예제 #3
0
        /// <summary>
        /// Use in beginning when setting up our history page, since calladdressex will depend on that memory
        /// </summary>
        /// <param name="size"></param>
        /// <returns>Allocated address.</returns>
        uint AllocateHistoryPages(uint size)
        {
            // calculate actual size of allocation
            size = Util.GetAlignedPageBoundary(size);

            // checks if theres enough memory for allocation to take place
            Xbox.IsEnoughMemory(size);

            #region Reserve the memory
            // store address to call
            Xbox.SetMemory(0x10000, size);
            Xbox.SetMemory(0x10004, 0x40000000);

            // inject script
            //push	4	;protect
            //push	2000h	;type
            //push	10000h	;pSize
            //push	0
            //push	10004h	;pAddress
            //mov	eax, 012345678h	;export address
            //call	eax
            //mov	eax, 02DB0000h	;fake success
            //retn	010h
            Xbox.MemoryStream.Position = ScriptBufferAddress;
            byte[] pt1 = { 0x6A, 0x04, 0x68, 0x00, 0x20, 0x00, 0x00, 0x68, 0x00, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x68, 0x04, 0x00, 0x01, 0x00, 0xB8 };
            Xbox.MemoryWriter.Write(pt1);
            Xbox.MemoryWriter.Write(Xbox.Kernel.NtAllocateVirtualMemory);
            byte[] pt2 = { 0xFF, 0xD0, 0xB8, 0x00, 0x00, 0xDB, 0x02, 0xC2, 0x10, 0x00 };
            Xbox.MemoryWriter.Write(pt2);

            // execute script via hijacked crashdump function
            Xbox.SendCommand("crashdump");

            // return the value of eax after the call
            uint ptr = Xbox.GetUInt32(0x10004);

            #endregion

            #region Commit the memory
            // store address to call
            Xbox.SetMemory(0x10000, size);
            Xbox.SetMemory(0x10004, 0x40000000);

            // inject script
            //push	4	;protect
            //push	1000h	;type
            //push	10000h	;pSize
            //push	0
            //push	10004h	;pAddress
            //mov	eax, 012345678h	;export address
            //call	eax
            //mov	eax, 02DB0000h	;fake success
            //retn	010h
            Xbox.MemoryStream.Position = ScriptBufferAddress;
            byte[] pt3 = { 0x6A, 0x04, 0x68, 0x00, 0x10, 0x00, 0x00, 0x68, 0x00, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x68, 0x04, 0x00, 0x01, 0x00, 0xB8 };
            Xbox.MemoryWriter.Write(pt3);
            Xbox.MemoryWriter.Write(Xbox.Kernel.NtAllocateVirtualMemory);
            byte[] pt4 = { 0xFF, 0xD0, 0xB8, 0x00, 0x00, 0xDB, 0x02, 0xC2, 0x10, 0x00 };
            Xbox.MemoryWriter.Write(pt4);

            // execute script via hijacked crashdump function
            Xbox.SendCommand("crashdump");

            // return the value of eax after the call
            ptr = Xbox.GetUInt32(0x10004);
            #endregion

            // check for success, but DONT add to our allocation table...
            if (ptr == 0)
            {
                throw new Exception("Failed to initialize YeloDebug in xbox memory.");
            }

            return(ptr);
        }
예제 #4
0
		public static bool RunModule(Xbox xbox, string module_path, ref uint base_address, 
			out uint entry_point, out uint exit_address, out string error_details)
		{
			entry_point = exit_address = uint.MaxValue;
			error_details = null;
			LowLevel.HResult result;

			if (!File.Exists(module_path))
			{
				error_details = "File does not exist!";
				return false;
			}

			byte[] rebased_module;
			result = RebasedModuleBufferAllocate(module_path, out rebased_module, out error_details);

			if (result == LowLevel.HResult.Success)
			{
				try { base_address = xbox.AllocateMemory((uint)rebased_module.Length); }
				catch (Exception ex)
				{
					result = LowLevel.HResult.Unexpected;
					error_details = ex.ToString();
				}

				entry_point = base_address;
				try { result = RebaseModule(xbox, module_path, rebased_module, ref entry_point); }
				catch (Exception ex)
				{
					result = LowLevel.HResult.Unexpected;
					error_details = ex.ToString();
				}
				entry_point += base_address;

				if (result == LowLevel.HResult.Success)
				{
					xbox.Pause();
					xbox.SetMemory(base_address, rebased_module);
					exit_address = xbox.CallAddress(entry_point, true);
					xbox.Continue();
				}
			}

			if(error_details == null)
				error_details = GetResultString(result);

			return result == LowLevel.HResult.Success;
		}
예제 #5
0
        /// <summary>
        /// Initializes the history page.
        /// </summary>
        public XboxHistory(Xbox xbox)
        {
            Xbox = xbox;
            Xbox.SetMemory(0xB00292D0, ScriptBufferAddress); // set up the script buffer

            if (IsPresent())
            {
                // restore our current allocations
                Xbox.ReloadAllocationTable();

                // check other settings like controller hook etc...
                XInputGetStateAddress = Xbox.GetUInt32(Gamepad.XInputGetState);
                OriginalGamepadCode = Xbox.GetMemory(Gamepad.OriginalCodeBuffer, 10);
            }
            else
            {
                // allocate memory for our history pages
                AllocateHistoryPages(kSize);
                Xbox.SetMemory(kBaseAddress, 0x6F6C6559);   // "Yelo"
            }
        }
        /// <summary>
        /// Hooks into the XInputGetState procedure on your xbox, and hijacks controller input.
        /// </summary>
        public void InitializeControllerHook()
        {
            // dont hook again if we are already hooked
            if (IsGamepadHooked())
            {
                return;
            }

            // get hook address
            Xbox.History.XInputGetStateAddress = GetXInputGetStateAddress();
            Xbox.SetMemory(XboxHistory.Gamepad.XInputGetState, Xbox.History.XInputGetStateAddress);

            // get first part of original code
            byte[] origCode = Xbox.GetMemory(Xbox.History.XInputGetStateAddress, 10);
            Xbox.SetMemory(XboxHistory.Gamepad.OriginalCodeBuffer, origCode);

            #region Build Script
            // store our script in memory that reads from our buffers instead...
            byte[] scriptData = new byte[71];
            using (var script = new BinaryWriter(new System.IO.MemoryStream(scriptData)))
            {
                //cmp	dword ptr ds:[EnabledAddress], 1	;IsEnabled
                //je	Intercept
                //db	10	dup (0)	;replace with orig code
                //push	XInputGetState + 10
                //ret
                //Intercept:
                script.Write((ushort)0x3D83);
                script.Write(XboxHistory.Gamepad.EnabledAddress);
                script.Write((ushort)0x7401);
                script.Write((byte)0x10);
                script.Write(origCode);
                script.Write((byte)0x68);
                script.Write(Xbox.History.XInputGetStateAddress + 10);
                script.Write((byte)0xC3);

                //pushad					; esp -= 32
                //mov	eax, [esp + 36]			; get port from handle
                //mov	eax, [eax]
                //mov	eax, [eax]
                //mov	eax, [eax + 14h]
                //add	dword ptr ds:[012345678h + eax * 4], 1	; controller in that port is plugged in
                //shl	eax, 5				; get buffer index
                //lea	esi, [012345678h + eax]		; buffer address
                //mov	edi, [esp + 40]	;pInputState	; their buffer address
                //mov	ecx, 22	;XINPUT_STATE size	; replace their data with ours
                //rep	movsb
                //popad
                //xor	eax, eax	;ERROR_SUCCESS
                //retn    8
                byte[] pt1 = { 0x60, 0x8B, 0x44, 0x24, 0x24, 0x8B, 0x00, 0x8B, 0x00, 0x8B, 0x40, 0x14, 0x83, 0x04, 0x85 };
                script.Write(pt1);
                script.Write(XboxHistory.Gamepad.PortStatusAddress);
                byte[] pt2 = { 0x01, 0xC1, 0xE0, 0x05, 0x8D, 0xB0 };
                script.Write(pt2);
                script.Write(XboxHistory.Gamepad.StateBufferAddress);
                byte[] pt3 = { 0x8B, 0x7C, 0x24, 0x28, 0xB9, 0x16, 0x00, 0x00, 0x00, 0xF3, 0xA4, 0x61, 0x33, 0xC0, 0xC2, 0x08, 0x00 };
                script.Write(pt3);
            }
            Xbox.SetMemory(XboxHistory.Gamepad.ScriptAddress, scriptData);
            #endregion

            // now inject our hook which jumps to our script we have just created...
            byte[] hookData = new byte[10];
            using (var hook = new BinaryWriter(new System.IO.MemoryStream(hookData)))
            {
                hook.Write((byte)0x68);
                hook.Write(XboxHistory.Gamepad.ScriptAddress);
                hook.Write((byte)0xC3);
            }
            Xbox.SetMemory(Xbox.History.XInputGetStateAddress, hookData);
        }