Example #1
0
        private void InstallHook()
        {
            #region Inject New Method

            ManagedFasm fasm = new ManagedFasm(d3.ProcessHandle);
            fasm.SetMemorySize(0x4096); // Allocate 16KB of memory

            string[] endSceneHookASM = new string[]
            {
                // Original EndScene instructions
                "mov edi, edi",
                "push ebp",
                "mov ebp, esp",

                // Save the state of the FPU and general purpose registers
                "pushfd",
                "pushad",

                "call " + InstallUsePower(),
                "call " + InstallPressButton(),

                // Restore FPU and general purpose registers
                "@out:",
                "popad",
                "popfd",
                // Return to right after where we detoured
                "jmp " + (oEndScene + 5),
            };

            foreach (string line in RandomizeAsm(endSceneHookASM))
            {
                fasm.AddLine(line);
            }

            byte[] compiled = fasm.Assemble();
            uint   hookCode = AllocateMemory("EndSceneHook", compiled.Length);
            fasm.Inject(hookCode);
            fasm.Clear();

            #endregion Inject New Method

            #region Detour EndScene

            origEndSceneBytes = d3.ReadBytes(oEndScene, 5);

            fasm.AddLine("jmp 0x{0:X08}", hookCode);
            fasm.Inject(oEndScene);
            fasm.Clear();

            #endregion Detour EndScene
        }
Example #2
0
        public uint InjectAndExecute(string[] asm, bool allowOffline = false)
        {
            lock (Locker)
            {
                if (!allowOffline && (!Helpers.Usefuls.InGame || Helpers.Usefuls.IsLoading))
                {
                    return(0);
                }

                /*List<string> asmCode = new List<string>();
                 * foreach (string s in asm)
                 * {
                 *  asmCode.Add(s);
                 *  if (Others.Random(0, 100) > 50)
                 *  {
                 *      int nR = Others.Random(1, 3);
                 *      for (int i = nR; i >= 1; i--)
                 *      {
                 *          asmCode.Add(ProtectHook());
                 *      }
                 *  }
                 * }
                 * return (uint) Wow.Memory.WowProcess.Executor.Call(asmCode.ToArray());*/
                if (!ThreadHooked)
                {
                    return(0);
                }
                var fasm = new ManagedFasm(Memory.ProcessHandle);

                fasm.SetMemorySize(0x1000);
                fasm.SetPassLimit(100);

                foreach (string s in asm)
                {
                    fasm.AddLine(s);
                }

                fasm.Inject(_mInjectionCode);

                Memory.WriteByte(_mExecuteRequested, 1);
                Timer injectTimer = new Timer(2000);
                injectTimer.Reset();
                while (Memory.ReadByte(_mExecuteRequested) == 1 && !injectTimer.IsReady)
                {
                    Thread.Sleep(1);
                }

                if (injectTimer.IsReady)
                {
                    Logging.WriteError("Injection have been aborted, execution too long from " + CurrentCallStack);
                    return(0);
                }
                Memory.WriteBytes(_mInjectionCode, _mZeroBytesInjectionCodes);

                uint returnValue = Memory.ReadUInt(_mResult);
                return(returnValue);
            }
        }
Example #3
0
        internal static void smethod_3(this ManagedFasm managedFasm_0, string string_0)
        {
            int num  = random_0.Next(2, 5);
            int num2 = num / 2;

            smethod_2(managedFasm_0, num2);
            managedFasm_0.AddLine(string_0);
            smethod_2(managedFasm_0, num % 2 + num2);
        }
Example #4
0
        public void ApplyDX()
        {
            var fasm = new ManagedFasm(Memory.ProcessHandle);

            fasm.SetMemorySize(0x1000);
            fasm.SetPassLimit(100);

            fasm.AddLine("jmp " + _mTrampolineDX);
            if (D3D.OriginalBytesDX.Length > 5)
            {
                fasm.AddLine("nop");
            }
            if (D3D.OriginalBytesDX.Length > 6)
            {
                fasm.AddLine("nop");
            }

            fasm.Inject(JumpAddressDX);
        }
Example #5
0
        public void Apply()
        {
            var fasm = new ManagedFasm(Memory.ProcessHandle);

            fasm.SetMemorySize(0x1000);
            fasm.SetPassLimit(100);

            fasm.AddLine("jmp " + _mTrampoline);

            fasm.Inject(JumpAddress);
        }
Example #6
0
 /// <summary>
 /// Call the specifics asm mnemonics in the message handler thread
 /// </summary>
 /// <param name="p_Mnemonics"></param>
 /// <param name="p_BufferSize"></param>
 /// <returns></returns>
 public uint Call(string[] p_Mnemonics, int p_BufferSize = 0x1000)
 {
     using (var fasm = new ManagedFasm(Memory.WowProcess.ProcessHandle))
     {
         fasm.SetMemorySize(0x500);
         fasm.SetPassLimit(100);
         foreach (var s in p_Mnemonics)
         {
             fasm.AddLine(s);
         }
         uint ptrInject = Memory.WowMemory.Memory.AllocateMemory(p_BufferSize);
         fasm.Inject(ptrInject);
         return(Call(ptrInject));
     }
 }
Example #7
0
        private uint InstallUsePower()
        {
            ManagedFasm fasm = new ManagedFasm(d3.ProcessHandle);

            fasm.SetMemorySize(0x4096); // Allocate 16KB of memory

            AllocateMemory("UsePower_PowerInfo", 40);
            AllocateMemory("UsePower_ActorPtr", 4);
            AllocateMemory("UsePower_AcdPtr", 4);
            AllocateMemory("UsePower_Flag", 4);

            string[] asm = new string[]
            {
                "mov edx, [" + GetAddress("UsePower_Flag") + "]",
                "cmp edx, 1",
                "jne @out",

                "push " + GetAddress("UsePower_AcdPtr"),
                "push 1",
                "push 1",
                "mov esi, " + GetAddress("UsePower_PowerInfo"),
                "mov eax, [" + GetAddress("UsePower_ActorPtr") + "]",
                "call " + Offsets.METHOD_USEPOWER,
                "add esp, 12",

                "@reset:",
                "mov ebp, " + GetAddress("UsePower_Flag"),
                "mov edx, 0",
                "mov [ebp], edx",

                "@out:",
                "retn"
            };

            foreach (string line in RandomizeAsm(asm))
            {
                fasm.AddLine(line);
            }

            byte[] compiled = fasm.Assemble();
            uint   address  = AllocateMemory("UsePower", compiled.Length);

            fasm.Inject(address);
            fasm.Clear();

            return(address);
        }
Example #8
0
        private uint InstallPressButton()
        {
            ManagedFasm fasm = new ManagedFasm(d3.ProcessHandle);

            fasm.SetMemorySize(0x4096); // Allocate 16KB of memory

            AllocateMemory("PressButton_Ptr", 4);
            AllocateMemory("PressButton_Flag", 4);

            string[] asm = new string[]
            {
                "mov edx, [" + GetAddress("PressButton_Flag") + "]",
                "cmp edx, 1",
                "jne @out",

                "push 25h",
                "mov ecx, [" + GetAddress("PressButton_Ptr") + "]",
                "call " + Offsets.METHOD_PRESSBUTTON,

                "@reset:",
                "mov ebp, " + GetAddress("PressButton_Flag"),
                "mov edx, 0",
                "mov [ebp], edx",

                "@out:",
                "retn"
            };

            foreach (string line in RandomizeAsm(asm))
            {
                fasm.AddLine(line);
            }

            byte[] compiled = fasm.Assemble();
            uint   address  = AllocateMemory("PressButton", compiled.Length);

            fasm.Inject(address);
            fasm.Clear();

            return(address);
        }
Example #9
0
        private static void smethod_2(ManagedFasm managedFasm_0, int int_0)
        {
            if (int_0 > 0)
            {
                do
                {
                    int_0--;
                    string text  = smethod_1();
                    string text2 = smethod_0();
                    switch (random_0.Next(1, 6))
                    {
                    case 1:
                        for (int i = random_0.Next(1, 4); i > 0; i--)
                        {
                            managedFasm_0.AddLine("nop");
                        }
                        break;

                    case 2:
                        managedFasm_0.AddLine("mov {0}, {0}", text);
                        break;

                    case 3:
                        managedFasm_0.AddLine("mov {0}, {0}", text2);
                        break;

                    case 4:
                        managedFasm_0.AddLine("push {0}", text2);
                        managedFasm_0.AddLine("pop {0}", text2);
                        break;

                    case 5:
                        managedFasm_0.AddLine("push {0}", text);
                        managedFasm_0.AddLine("pop {0}", text);
                        break;
                    }
                }while (int_0 > 0);
            }
        }
Example #10
0
        public void Dispose()
        {
            IntPtr l_User32         = GetModuleHandle("user32.dll");
            IntPtr l_SetWindowLongW = GetProcAddress(l_User32, "SetWindowLongW");

            // Restore the original WndProc callback
            var fasm2 = new ManagedFasm(Memory.WowProcess.ProcessHandle);

            fasm2.SetMemorySize(0x500);
            fasm2.SetPassLimit(100);
            fasm2.AddLine("mov eax, [" + m_OriginalWndProc + "]");
            fasm2.AddLine("push eax");
            fasm2.AddLine("push " + GWL_WNDPROC + "");
            fasm2.AddLine("push " + m_WindowHandle + "");
            fasm2.AddLine("call " + l_SetWindowLongW + "");
            fasm2.AddLine("retn");
            var ptrInject = Memory.WowMemory.Memory.AllocateMemory(0x500);

            fasm2.InjectAndExecute(ptrInject);

            Memory.WowMemory.Memory.FreeMemory(m_WndProcFunction);
            Memory.WowMemory.Memory.FreeMemory(m_OriginalWndProc);
        }
Example #11
0
        public WndProcExecutor(BlackMagic memory)
        {
            try
            {
                m_WindowHandle      = Memory.WowProcess.MainWindowHandle;
                m_Random            = new Random();
                m_CustomMessageCode = m_Random.Next(0x8000, 0xBFFF); // From MSDN : WM_APP (0x8000) through 0xBFFF
                m_WndProcFunction   = memory.AllocateMemory(0x500);  // WndProc
                m_OriginalWndProc   = memory.AllocateMemory(0x4);    // WndProcOriginalWndProc

                IntPtr l_User32          = GetModuleHandle("user32.dll");
                IntPtr l_CallWindowProcW = GetProcAddress(l_User32, "CallWindowProcW");
                IntPtr l_SetWindowLongW  = GetProcAddress(l_User32, "SetWindowLongW");


                var fasm = new ManagedFasm(Memory.WowProcess.ProcessHandle);

                fasm.SetMemorySize(0x1000);
                fasm.SetPassLimit(100);
                fasm.AddLine("mov eax, [esp+0x8]");              // Get the message code from the stack);
                fasm.AddLine("cmp eax, " + m_CustomMessageCode); // Check if the message code is our custom one
                fasm.AddLine("jne @call_original");              // Otherwise simply call the original WndProc
                fasm.AddLine("mov eax, [esp+0xC]");              // Function pointer
                fasm.AddLine("mov edx, [esp+0x10]");             // Result pointer
                fasm.AddLine("push edx");                        // Save result pointer
                fasm.AddLine("call eax");                        // Call the user function
                fasm.AddLine("pop edx");                         // Restore the result pointer
                fasm.AddLine("mov [edx], eax");                  // Save user function result
                fasm.AddLine("xor eax, eax");                    // We handled the message
                fasm.AddLine("retn");

                fasm.AddLine("@call_original:");
                fasm.AddLine("mov ecx, [esp+0x4]");  // Hwnd
                fasm.AddLine("mov edx, [esp+0x8]");  // Msg
                fasm.AddLine("mov esi, [esp+0xC]");  // WParam
                fasm.AddLine("mov edi, [esp+0x10]"); // LParam


                fasm.AddLine("mov eax, [" + m_OriginalWndProc + "]");
                fasm.AddLine("push edi"); // LParam
                fasm.AddLine("push esi"); // WParam
                fasm.AddLine("push edx"); // Msg
                fasm.AddLine("push ecx"); // Hwnd
                fasm.AddLine("push eax"); // WndProc original

                //fasm.AddLine("call " + l_CallWindowProcW); // Call the original WndProc
                fasm.AddLine("retn 0x14");


                // Setup our WndProc callback
                //memory.WriteBytes(m_WndProcFunction, D3D.OriginalBytesDX);

                fasm.Inject(m_WndProcFunction);

                // Register our WndProc callback
                var fasm2 = new ManagedFasm(Memory.WowProcess.ProcessHandle);
                fasm2.SetMemorySize(0x500);
                fasm2.SetPassLimit(100);
                fasm2.AddLine("push " + m_WndProcFunction);
                fasm2.AddLine("push " + GWL_WNDPROC);
                fasm2.AddLine("push " + m_WindowHandle);
                fasm2.AddLine("call " + l_SetWindowLongW);
                fasm2.AddLine("mov [" + m_OriginalWndProc + "], eax");
                fasm2.AddLine("retn");

                var ptrInject = memory.AllocateMemory(0x500);
                fasm2.InjectAndExecute(ptrInject);

                /*var l_Process = System.Diagnostics.Process.GetProcessesByName("Wow").First();
                 * Console.WriteLine("Using process : " + l_Process.Id + ", window " + l_Process.MainWindowHandle + "");
                 *
                 * using (RemoteProcess l_RemoteProcess = new RemoteProcess((uint)l_Process.Id))
                 * using (var l_WndProcExecutor = new WndProcExecutor2(l_RemoteProcess, l_Process.MainWindowHandle))
                 * {
                 *
                 *  LuaTest(l_RemoteProcess, l_WndProcExecutor, "print(\"Hello world motha !\")");
                 *
                 * }*/
                /*var t = new MyMemory.RemoteProcess((uint)Memory.WowProcess.ProcessId);
                 * var remoteM = t.MemoryManager.AllocateMemory(0x1000);
                 * var ptrInject = (uint)remoteM.Pointer; //memory.AllocateMemory(0x500);
                 *
                 * fasm2.Inject(ptrInject);
                 * var prot = new RemoteMemoryProtection(t, remoteM.Pointer, remoteM.Size, Enumerations.MemoryProtectionFlags.Execute);
                 *
                 * var th = t.ThreadsManager.CreateRemoteThread((IntPtr) ptrInject, IntPtr.Zero, Enumerations.ThreadCreationFlags.Run);
                 */
            }
            catch (Exception e)
            {
                Logging.WriteError(e.ToString());
            }
        }
Example #12
0
        public T Call <T>(IntPtr Address, MagicConvention CallingConvention, params object[] Arguments) where T : struct
        {
            using (var asm = new ManagedFasm())
            {
                asm.Clear();

                switch (CallingConvention)
                {
                case MagicConvention.Cdecl:
                {
                    asm.AddLine("push ebp");
                    for (var i = Arguments.Length - 1; i >= 0; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    for (var i = 0; i < Arguments.Length; ++i)
                    {
                        asm.AddLine("pop ebp");
                    }
                    asm.AddLine("pop ebp");

                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.StdCall:
                {
                    for (var i = Arguments.Length - 1; i >= 0; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.FastCall:
                {
                    if (Arguments.Length > 0)
                    {
                        asm.AddLine("mov ecx, {0}", Arguments[0]);
                    }
                    if (Arguments.Length > 1)
                    {
                        asm.AddLine("mov edx, {0}", Arguments[1]);
                    }
                    for (var i = Arguments.Length - 1; i >= 2; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.Register:
                {
                    if (Arguments.Length > 0)
                    {
                        asm.AddLine("mov eax, {0}", Arguments[0]);
                    }
                    if (Arguments.Length > 1)
                    {
                        asm.AddLine("mov edx, {0}", Arguments[1]);
                    }
                    if (Arguments.Length > 2)
                    {
                        asm.AddLine("mov ecx, {0}", Arguments[2]);
                    }
                    for (var i = 3; i < Arguments.Length; ++i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov ebx, {0}", Address);
                    asm.AddLine("call ebx");
                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.ThisCall:
                {
                    if (Arguments.Length > 0)
                    {
                        asm.AddLine("mov ecx, {0}", Arguments[0]);
                    }
                    for (var i = Arguments.Length - 1; i >= 1; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    asm.AddLine("retn");
                    break;
                }

                default:
                {
                    throw new MemoryException("Unhandled calling convention '{0}'", CallingConvention.ToString());
                }
                }

                return(ExecuteRemoteCode <T>(asm.Assemble()));
            }
        }
Example #13
0
        /// <summary>
        /// Injects a dll into a process by hijacking the given thread and redirecting it to LoadLibrary.
        /// </summary>
        /// <param name="hProcess">Handle to process into which dll will be injected.</param>
        /// <param name="hThread">Handle to thread that will be hijacked.</param>
        /// <param name="szDllPath">Full path to the dll to be injected.</param>
        /// <returns>Returns the base address of the injected dll on success, zero on failure.</returns>
        public static uint InjectDllRedirectThread(IntPtr hProcess, IntPtr hThread, string szDllPath)
        {
            const uint INITIAL_EXIT_CODE = 0xFFFFFFFF;

            if (hProcess == IntPtr.Zero)
            {
                throw new ArgumentNullException("hProcess");
            }

            if (hThread == IntPtr.Zero)
            {
                throw new ArgumentNullException("hThread");
            }

            if (szDllPath.Length == 0)
            {
                throw new ArgumentNullException("szDllPath");
            }

            if (!szDllPath.Contains("\\"))
            {
                szDllPath = System.IO.Path.GetFullPath(szDllPath);
            }

            if (!System.IO.File.Exists(szDllPath))
            {
                throw new ArgumentException("DLL not found.", "szDllPath");
            }

            uint          dwBaseAddress = RETURN_ERROR;
            uint          lpLoadLibrary, lpAsmStub;
            CONTEXT       ctx;
            StringBuilder AssemblyStub = new StringBuilder();
            ManagedFasm   fasm         = new ManagedFasm(hProcess);

            lpLoadLibrary = (uint)Imports.GetProcAddress(Imports.GetModuleHandle("kernel32.dll"), "LoadLibraryA");
            if (lpLoadLibrary == 0)
            {
                return(RETURN_ERROR);
            }

            lpAsmStub = SMemory.AllocateMemory(hProcess);
            if (lpAsmStub == 0)
            {
                return(RETURN_ERROR);
            }

            if (SThread.SuspendThread(hThread) != uint.MaxValue)
            {
                ctx = SThread.GetThreadContext(hThread, CONTEXT_FLAGS.CONTEXT_CONTROL);
                if (ctx.Eip > 0)
                {
                    try
                    {
                        //located at lpAsmStub+0, where we can monitor LoadLibrary's exit code.
                        fasm.AddLine("lpExitCode dd 0x{0:X}", INITIAL_EXIT_CODE);

                        //lpAsmStub+4, where the actual code part starts
                        fasm.AddLine("push 0x{0:X}", ctx.Eip);
                        fasm.AddLine("pushad");
                        fasm.AddLine("push szDllPath");
                        fasm.AddLine("call 0x{0:X}", lpLoadLibrary);
                        fasm.AddLine("mov [lpExitCode], eax");
                        fasm.AddLine("popad");
                        fasm.AddLine("retn");

                        //dll path
                        fasm.AddLine("szDllPath db \'{0}\',0", szDllPath);

                        fasm.Inject(lpAsmStub);
                    }
                    catch
                    {
                        SMemory.FreeMemory(hProcess, lpAsmStub);
                        SThread.ResumeThread(hThread);
                        return(RETURN_ERROR);
                    }

                    ctx.ContextFlags = CONTEXT_FLAGS.CONTEXT_CONTROL;
                    ctx.Eip          = lpAsmStub + 4; //skip over lpExitCode data

                    if (SThread.SetThreadContext(hThread, ctx))
                    {
                        if (SThread.ResumeThread(hThread) != uint.MaxValue)
                        {
                            for (int i = 0; i < 400; i++)
                            {
                                System.Threading.Thread.Sleep(5);
                                if ((dwBaseAddress = SMemory.ReadUInt(hProcess, lpAsmStub)) != INITIAL_EXIT_CODE)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (fasm != null)
            {
                fasm.Dispose();
                fasm = null;
            }

            SMemory.FreeMemory(hProcess, lpAsmStub);

            return(dwBaseAddress);
        }
Example #14
0
		/// <summary>
		/// Injects a dll into a process by hijacking the given thread and redirecting it to LoadLibrary.
		/// </summary>
		/// <param name="hProcess">Handle to process into which dll will be injected.</param>
		/// <param name="hThread">Handle to thread that will be hijacked.</param>
		/// <param name="szDllPath">Full path to the dll to be injected.</param>
		/// <returns>Returns the base address of the injected dll on success, zero on failure.</returns>
		public static uint InjectDllRedirectThread(IntPtr hProcess, IntPtr hThread, string szDllPath) {
			const uint INITIAL_EXIT_CODE = 0xFFFFFFFF;

			if (hProcess == IntPtr.Zero)
				throw new ArgumentNullException("hProcess");

			if (hThread == IntPtr.Zero)
				throw new ArgumentNullException("hThread");

			if (szDllPath.Length == 0)
				throw new ArgumentNullException("szDllPath");

			if (!szDllPath.Contains("\\"))
				szDllPath = System.IO.Path.GetFullPath(szDllPath);

			if (!System.IO.File.Exists(szDllPath))
				throw new ArgumentException("DLL not found.", "szDllPath");

			uint dwBaseAddress = RETURN_ERROR;
			uint lpLoadLibrary, lpAsmStub;
			CONTEXT ctx;
			StringBuilder AssemblyStub = new StringBuilder();
			ManagedFasm fasm = new ManagedFasm(hProcess);

			lpLoadLibrary = (uint)Imports.GetProcAddress(Imports.GetModuleHandle("kernel32.dll"), "LoadLibraryA");
			if (lpLoadLibrary == 0)
				throw new Exception("Failed to get address of LoadLibraryA in kernel32.dll");

			lpAsmStub = MemoryHelper.AllocateMemory(hProcess);
			if (lpAsmStub == 0)
				throw new Exception("Failed to allocate Memory in the Process!");

			if (ThreadHelper.SuspendThread(hThread) != uint.MaxValue) {
				ctx = ThreadHelper.GetThreadContext(hThread, CONTEXT_FLAGS.CONTEXT_CONTROL);
				if (ctx.Eip > 0) {
					try {
						//located at lpAsmStub+0, where we can monitor LoadLibrary's exit code.
						fasm.AddLine("lpExitCode dd 0x{0:X}", INITIAL_EXIT_CODE);

						//lpAsmStub+4, where the actual code part starts
						fasm.AddLine("push 0x{0:X}", ctx.Eip);
						fasm.AddLine("pushad");
						fasm.AddLine("push szDllPath");
						fasm.AddLine("call 0x{0:X}", lpLoadLibrary);
						fasm.AddLine("mov [lpExitCode], eax");
						fasm.AddLine("popad");
						fasm.AddLine("retn");

						//dll path
						fasm.AddLine("szDllPath db \'{0}\',0", szDllPath);

						fasm.Inject(lpAsmStub);
					} catch {
						MemoryHelper.FreeMemory(hProcess, lpAsmStub);
						ThreadHelper.ResumeThread(hThread);
						return RETURN_ERROR;
					}

					ctx.ContextFlags = CONTEXT_FLAGS.CONTEXT_CONTROL;
					ctx.Eip = lpAsmStub + 4; //skip over lpExitCode data

					if (ThreadHelper.SetThreadContext(hThread, ctx)) {
						if (ThreadHelper.ResumeThread(hThread) != uint.MaxValue) {
							for (int i = 0; i < 400; i++) {
								System.Threading.Thread.Sleep(5);
								if ((dwBaseAddress = MemoryHelper.ReadUInt(hProcess, lpAsmStub)) != INITIAL_EXIT_CODE)
									break;
							}
						}
					}
				}
			}

			if (fasm != null) {
				fasm.Dispose();
				fasm = null;
			}

			MemoryHelper.FreeMemory(hProcess, lpAsmStub);

			return dwBaseAddress;
		}
        internal static void smethod_3()
        {
            State = StateEnum.None;
            string[] strArray = string_0;
            int      index    = 0;

            while (true)
            {
                if (index >= strArray.Length)
                {
                    break;
                }
                string path = strArray[index];
                try
                {
                    File.Delete(path);
                }
                catch
                {
                }
                index++;
            }
            ExternalProcessMemory memory = ExternalProcessMemory_0;

            intptr_1 = memory.GetProcAddress("user32.dll", "GetActiveWindow");
            if (intptr_1 == IntPtr.Zero)
            {
                throw new Exception("The function 'GetActiveWindow' was not found.");
            }
            intptr_0 = memory.GetProcAddress("user32.dll", "GetForegroundWindow");
            if (intptr_0 == IntPtr.Zero)
            {
                throw new Exception("The function 'GetForegroundWindow' was not found.");
            }
            intptr_2 = memory.GetProcAddress("user32.dll", "GetKeyState");
            if (intptr_2 == IntPtr.Zero)
            {
                throw new Exception("The function 'GetKeyState' was not found.");
            }
            intptr_3 = memory.GetProcAddress("user32.dll", "GetCursorPos");
            if (intptr_3 == IntPtr.Zero)
            {
                throw new Exception("The function 'GetCursorPos' was not found.");
            }
            intptr_4 = memory.GetProcAddress("user32.dll", "ScreenToClient");
            if (intptr_4 == IntPtr.Zero)
            {
                throw new Exception("The function 'ScreenToClient' was not found.");
            }
            allocatedMemory_0 = memory.CreateAllocatedMemory(0x1000);
            List <byte[]> list = smethod_1();

            if (list != null)
            {
                using (TritonHs.AcquireFrame())
                {
                    ExternalProcessMemory_0.WriteBytes(intptr_0, list[0]);
                    ExternalProcessMemory_0.WriteBytes(intptr_1, list[1]);
                    ExternalProcessMemory_0.WriteBytes(intptr_2, list[2]);
                    ExternalProcessMemory_0.WriteBytes(intptr_3, list[3]);
                    ExternalProcessMemory_0.WriteBytes(intptr_4, list[4]);
                }
            }
            bool flag = false;

            try
            {
                int         offsetInBytes = 0;
                IntPtr      ptr           = IntPtr_0;
                ManagedFasm asm           = memory.Asm;
                asm.Clear();
                asm.AddLine("mov eax, " + ptr.ToString());
                asm.AddLine("retn");
                byte[] bytes = asm.Assemble();
                asm.Clear();
                allocatedMemory_0.WriteBytes(0, bytes);
                IntPtr ptr2 = allocatedMemory_0.Address + IntPtr.Zero;
                ptr2 = allocatedMemory_0.Address + IntPtr.Zero;
                int num3 = (ptr2.ToInt32() - intptr_1.ToInt32()) - 5;
                offsetInBytes = 0 + bytes.Length;
                byte_0        = new byte[5];
                byte_0[0]     = 0xe9;
                byte[] buffer2 = BitConverter.GetBytes((int)((ptr2.ToInt32() - intptr_0.ToInt32()) - 5));
                for (int i = 0; i < buffer2.Length; i++)
                {
                    byte_0[i + 1] = buffer2[i];
                }
                byte_1    = new byte[5];
                byte_1[0] = 0xe9;
                byte[] buffer3 = BitConverter.GetBytes(num3);
                for (int j = 0; j < buffer3.Length; j++)
                {
                    byte_1[j + 1] = buffer3[j];
                }
                memory.Patches.Create(intptr_0, byte_0, "ProcessHookManager_GetForegroundWindow");
                memory.Patches.Create(intptr_1, byte_1, "ProcessHookManager_GetActiveWindow");
                byte[] buffer4 = new byte[0x400];
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer4);
                IntPtr ptr3 = allocatedMemory_0.Address + offsetInBytes;
                int_0          = offsetInBytes;
                offsetInBytes += 0x400;
                byte[] buffer5 = new byte[8];
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer5);
                IntPtr ptr4 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                IntPtr ptr5 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                ManagedFasm fasm = memory.Asm;
                fasm.Clear();
                fasm.AddLine("pop eax");
                object[] args = new object[] { ptr4 };
                fasm.AddLine("mov [{0}], eax", args);
                fasm.AddLine("pop eax");
                object[] objArray2 = new object[] { ptr5 };
                fasm.AddLine("mov [{0}], eax", objArray2);
                fasm.AddLine("imul eax, 4");
                object[] objArray3 = new object[] { ptr3 };
                fasm.AddLine("add eax, {0}", objArray3);
                fasm.AddLine("mov eax, [eax]");
                object[] objArray4 = new object[] { ptr4 };
                fasm.AddLine("pushd [{0}]", objArray4);
                fasm.AddLine("retn");
                byte[] buffer6 = fasm.Assemble();
                fasm.Clear();
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer6);
                ptr2           = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += buffer6.Length;
                byte_2         = new byte[5];
                byte_2[0]      = 0xe9;
                byte[] buffer7 = BitConverter.GetBytes((int)((ptr2.ToInt32() - intptr_2.ToInt32()) - 5));
                for (int k = 0; k < buffer7.Length; k++)
                {
                    byte_2[k + 1] = buffer7[k];
                }
                memory.Patches.Create(intptr_2, byte_2, "ProcessHookManager_GetKeyState");
                byte[] buffer8 = new byte[12];
                buffer8[8] = 1;
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer8);
                IntPtr ptr6 = allocatedMemory_0.Address + offsetInBytes;
                int_1          = offsetInBytes;
                offsetInBytes += 4;
                int_2          = offsetInBytes;
                offsetInBytes += 4;
                int_3          = offsetInBytes;
                offsetInBytes += 4;
                byte[] buffer9 = new byte[8];
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer9);
                IntPtr ptr7 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                IntPtr ptr8 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                ManagedFasm fasm2 = memory.Asm;
                fasm2.Clear();
                fasm2.AddLine("pop eax");
                object[] objArray5 = new object[] { ptr7 };
                fasm2.AddLine("mov [{0}], eax", objArray5);
                fasm2.AddLine("pop eax");
                object[] objArray6 = new object[] { ptr8 };
                fasm2.AddLine("mov [{0}], eax", objArray6);
                fasm2.AddLine("push ecx");
                object[] objArray7 = new object[] { ptr6 };
                fasm2.AddLine("mov ecx, {0}", objArray7);
                fasm2.AddLine("mov ecx, [ecx]");
                fasm2.AddLine("mov [eax], ecx");
                fasm2.AddLine("add eax, 4");
                object[] objArray8 = new object[] { ptr6 };
                fasm2.AddLine("mov ecx, {0}", objArray8);
                fasm2.AddLine("add ecx, 4");
                fasm2.AddLine("mov ecx, [ecx]");
                fasm2.AddLine("mov [eax], ecx");
                object[] objArray9 = new object[] { ptr6 };
                fasm2.AddLine("mov ecx, {0}", objArray9);
                fasm2.AddLine("add ecx, 8");
                fasm2.AddLine("mov eax, [ecx]");
                fasm2.AddLine("pop ecx");
                object[] objArray10 = new object[] { ptr7 };
                fasm2.AddLine("pushd [{0}]", objArray10);
                fasm2.AddLine("retn");
                byte[] buffer10 = fasm2.Assemble();
                fasm2.Clear();
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer10);
                ptr2           = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += buffer10.Length;
                byte_3         = new byte[5];
                byte_3[0]      = 0xe9;
                byte[] buffer11 = BitConverter.GetBytes((int)((ptr2.ToInt32() - intptr_3.ToInt32()) - 5));
                for (int m = 0; m < buffer11.Length; m++)
                {
                    byte_3[m + 1] = buffer11[m];
                }
                memory.Patches.Create(intptr_3, byte_3, "ProcessHookManager_GetCursorPos");
                byte[] buffer12 = new byte[12];
                buffer12[8] = 1;
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer12);
                IntPtr ptr9 = allocatedMemory_0.Address + offsetInBytes;
                int_4          = offsetInBytes;
                offsetInBytes += 4;
                int_5          = offsetInBytes;
                offsetInBytes += 4;
                int_6          = offsetInBytes;
                offsetInBytes += 4;
                byte[] buffer13 = new byte[12];
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer13);
                IntPtr ptr10 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                IntPtr ptr11 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                IntPtr ptr12 = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += 4;
                ManagedFasm fasm3 = memory.Asm;
                fasm3.Clear();
                fasm3.AddLine("pop eax");
                object[] objArray11 = new object[] { ptr10 };
                fasm3.AddLine("mov [{0}], eax", objArray11);
                fasm3.AddLine("pop eax");
                object[] objArray12 = new object[] { ptr11 };
                fasm3.AddLine("mov [{0}], eax", objArray12);
                fasm3.AddLine("pop eax");
                object[] objArray13 = new object[] { ptr12 };
                fasm3.AddLine("mov [{0}], eax", objArray13);
                fasm3.AddLine("push ecx");
                object[] objArray14 = new object[] { ptr9 };
                fasm3.AddLine("mov ecx, {0}", objArray14);
                fasm3.AddLine("mov ecx, [ecx]");
                fasm3.AddLine("mov [eax], ecx");
                fasm3.AddLine("add eax, 4");
                object[] objArray15 = new object[] { ptr9 };
                fasm3.AddLine("mov ecx, {0}", objArray15);
                fasm3.AddLine("add ecx, 4");
                fasm3.AddLine("mov ecx, [ecx]");
                fasm3.AddLine("mov [eax], ecx");
                object[] objArray16 = new object[] { ptr9 };
                fasm3.AddLine("mov ecx, {0}", objArray16);
                fasm3.AddLine("add ecx, 8");
                fasm3.AddLine("mov eax, [ecx]");
                fasm3.AddLine("pop ecx");
                object[] objArray17 = new object[] { ptr10 };
                fasm3.AddLine("pushd [{0}]", objArray17);
                fasm3.AddLine("retn");
                byte[] buffer14 = fasm3.Assemble();
                fasm3.Clear();
                allocatedMemory_0.WriteBytes(offsetInBytes, buffer14);
                ptr2           = allocatedMemory_0.Address + offsetInBytes;
                offsetInBytes += buffer14.Length;
                byte_4         = new byte[5];
                byte_4[0]      = 0xe9;
                byte[] buffer15 = BitConverter.GetBytes((int)((ptr2.ToInt32() - intptr_4.ToInt32()) - 5));
                for (int n = 0; n < buffer15.Length; n++)
                {
                    byte_4[n + 1] = buffer15[n];
                }
                memory.Patches.Create(intptr_4, byte_4, "ProcessHookManager_ScreenToClient");
                smethod_2();
            }
            catch (Exception)
            {
                flag = true;
                throw;
            }
            finally
            {
                if (flag && (allocatedMemory_0 != null))
                {
                    allocatedMemory_0.Dispose();
                    allocatedMemory_0 = null;
                }
            }
        }
Example #16
0
        private void CreateTrampoline()
        {
            _mTrampoline = Memory.AllocateMemory(0x1000);

            Console.WriteLine("m_trampoline : " + _mTrampoline.ToString("X"));

            var fasm = new ManagedFasm(Memory.ProcessHandle);

            fasm.SetMemorySize(0x1000);
            fasm.SetPassLimit(100);
            fasm.AddLine("call {0}", Wow.Memory.WowProcess.WowModule + (uint)Addresses.FunctionWow.ReturnFunc);
            fasm.AddLine("pushad");
            fasm.AddLine("pushfd");

            fasm.AddLine("mov eax, [{0}]", _mLocked);
            fasm.AddLine("@execution:");

            fasm.AddLine("mov eax, [{0}]", _mExecuteRequested);
            fasm.AddLine("test eax, eax");
            fasm.AddLine("je @lockcheck");

            fasm.AddLine("call {0}", _mInjectionCode);
            fasm.AddLine("mov [" + _mResult + "], eax");
            fasm.AddLine("xor eax, eax");
            fasm.AddLine("mov [" + _mExecuteRequested + "], eax");

            fasm.AddLine("@lockcheck:");

            fasm.AddLine("mov eax, [{0}]", _mLocked);
            fasm.AddLine("test eax, eax");
            fasm.AddLine("jne @execution");

            fasm.AddLine("popfd");
            fasm.AddLine("popad");

            fasm.AddLine("jmp " + (JumpAddress + D3D.OriginalBytes.Length));
            fasm.Inject(_mTrampoline);
        }
Example #17
0
        private void CreateTrampolineDX()
        {
            _mTrampolineDX = Memory.AllocateMemory(0x1000);

            Console.WriteLine("m_trampoline : " + _mTrampolineDX.ToString("X"));

            var fasm = new ManagedFasm(Memory.ProcessHandle);

            fasm.SetMemorySize(0x1000);
            fasm.SetPassLimit(100);
            fasm.AddLine("pushad");
            fasm.AddLine("pushfd");
            fasm.AddLine("mov eax, [{0}]", _mLocked); // _mLockedDX
            fasm.AddLine("@execution:");

            fasm.AddLine("mov eax, [{0}]", _mExecuteRequested); // DX
            fasm.AddLine("test eax, eax");
            fasm.AddLine("je @lockcheck");

            /*fasm.AddLine("mov ebx, [{0}]", (Wow.Memory.WowProcess.WowModule + (uint) Addresses.FunctionWow.SpellChecker));
             * fasm.AddLine("mov eax, [ebx+" + (uint) Addresses.FunctionWow.SpellCheckerOff1 + "]");
             * fasm.AddLine("mov esi, [ebx+" + (uint) Addresses.FunctionWow.SpellCheckerOff2 + "]");
             * fasm.AddLine("mov [" + _mSavedAntiban + "], esi");
             * fasm.AddLine("mov [ebx+" + (uint) Addresses.FunctionWow.SpellCheckerOff2 + "], eax");*/
            fasm.AddLine("call {0}", _mInjectionCode);
            fasm.AddLine("mov [" + _mResult + "], eax");

            /*fasm.AddLine("mov edx, {0}", (uint) (Wow.Memory.WowProcess.WowModule + (uint) Addresses.FunctionWow.CTMChecker));
             * fasm.AddLine("call " + (uint) (Wow.Memory.WowProcess.WowModule + (uint) Addresses.FunctionWow.WoWTextCaller));
             * fasm.AddLine("push happilyeverafter");
             * fasm.AddLine("push " + (uint) (Wow.Memory.WowProcess.WowModule + (uint) Addresses.FunctionWow.RetFromFunctionBelow));
             * fasm.AddLine("jmp " + (uint) (Wow.Memory.WowProcess.WowModule + (uint) Addresses.FunctionWow.CTMChecker2));
             * fasm.AddLine("happilyeverafter:");*/
            /*fasm.AddLine("mov ebx, [{0}]", (Wow.Memory.WowProcess.WowModule + (uint) Addresses.FunctionWow.SpellChecker));
             * fasm.AddLine("mov esi, [" + _mSavedAntiban + "]");
             * fasm.AddLine("mov [ebx+" + (uint) Addresses.FunctionWow.SpellCheckerOff2 + "], esi");*/
            fasm.AddLine("xor eax, eax");
            fasm.AddLine("mov [" + _mExecuteRequested + "], eax"); // DX

            fasm.AddLine("@lockcheck:");

            fasm.AddLine("mov eax, [{0}]", _mLocked); // DX
            fasm.AddLine("test eax, eax");
            fasm.AddLine("jne @execution");
            fasm.AddLine("push 0");
            fasm.AddLine("add esp, 4");
            fasm.AddLine("popfd");
            fasm.AddLine("popad");

            Memory.WriteBytes(_mTrampolineDX, D3D.OriginalBytesDX);
            fasm.AddLine("jmp " + (JumpAddressDX + D3D.OriginalBytesDX.Length));
            fasm.Inject((uint)(_mTrampolineDX + D3D.OriginalBytesDX.Length));
        }