Exemplo n.º 1
0
        static void Main(string[] args)
        {
            try
            {
                string           processName   = "DarkSoulsRemastered";
                Process[]        results       = Process.GetProcessesByName(processName);
                Process          process       = results[0];
                SafeMemoryHandle processHandle = Native.OpenProcess(process.Id);

                Func <IntPtr, IntPtr> resolveAddress64 = delegate(IntPtr address)
                {
                    return(IntPtr.Add(address, MemoryLiterate.Read <IntPtr>(processHandle, address).ToInt32() + 4));
                };

                Signature dropItemLuaAob  = new Signature(processHandle, "48 ?? ?? ?? ?? 48 ?? ?? ?? ?? 57 48 ?? ?? ?? ?? ?? ?? 0F B6 ?? 48 ?? ?? E8");
                Signature dropItemBaseAob = new Signature(processHandle, "?? ?? ?? ?? 33 ?? E8 ?? ?? ?? ?? 80 ?? ?? ?? 44 ?? ?? 48 ?? ?? ?? ?? ?? ?? 8B");
                Signature dtemDbgBaseAob  = new Signature(processHandle, "?? ?? ?? ?? 89 ?? 3C 08 00 00 8B ?? ?? 89 ?? 40 08 00 00 8B ?? ?? 89 ?? 44 08 00 00 8B ?? ?? 89 ?? 48 08 00 00 C3");
                dropItemLuaAob.ScanModule(process.MainModule);
                dropItemBaseAob.ScanModule(process.MainModule);
                dtemDbgBaseAob.ScanModule(process.MainModule);
                IntPtr  dropItemLua       = dropItemLuaAob.Address;
                IntPtr  dropItemBase      = dropItemBaseAob.ResolveAddressFromBytes();
                IntPtr  itemDbgBase       = dtemDbgBaseAob.ResolveAddressFromBytes();
                Pointer itemCategoryPtr   = new Pointer(processHandle, itemDbgBase, 0x83C);
                Pointer itemIdPtr         = new Pointer(processHandle, itemDbgBase, 0x840);
                Pointer itemDurabilityPtr = new Pointer(processHandle, itemDbgBase, 0x844);
                Pointer itemQuantityPtr   = new Pointer(processHandle, itemDbgBase, 0x848);
                itemCategoryPtr.TryWrite(0x40000000);
                itemIdPtr.TryWrite(0x15E);
                itemDurabilityPtr.TryWrite(-1);
                itemQuantityPtr.TryWrite(1);
                string[] asm = new string[]
                {
                    $"mov rax,0x{dropItemBase.ToString("X")}",
                    "mov rcx,[rax]",
                    $"mov rax, 0x{dropItemLua.ToString("X")}",
                    "sub rsp,0x38",
                    "call rax",
                    "add rsp,0x38",
                    "ret"
                };
                byte[] byteCode = Assembler.Assemble64(asm);
                using (var memory = new RemoteAlloc(processHandle, byteCode.Length))
                {
                    memory.Write(byteCode);
                    SafeMemoryHandle threadHandle = Native.CreateThread(processHandle, memory.AllocationBase, IntPtr.Zero);
                    Native.WaitForSingleObject(threadHandle);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
        }