Загрузите EXE-файл и запустите его из памяти

Я пытаюсь запустить исполняемый файл из памяти, как описано в этой статье. Я могу легко запускать любые .net / управляемые exes. Но я не могу запускать исполняемые файлы, такие как notepad.exe или calc.exe . Как я могу получить его, чтобы я мог запускать неуправляемые exes?

В случае запуска исполняемых файлов .NET из памяти библиотеки и сама CLR делают для вас много тяжелой работы. Для собственных исполняемых файлов, таких как notepad.exe и calc.exe, вам нужно будет сделать много ручной работы, чтобы это произошло. В принципе, вы должны действовать как загрузчик Windows.

Вероятно, здесь есть страницы оговорки, но в этой углубленной статье есть шаги, необходимые для загрузки PE в память и правильной перезагрузки и исправления. Затем вы сможете найти точку входа (как в статье) и запустить ее.

Если вы действительно просто хотите запустить notepad.exe и calc.exe, самым простым способом, конечно же, будет использование Process.Start и запуск их с диска. В противном случае, если у вас есть исполняемый файл, встроенный в качестве ресурса в ваш процесс, то следующим простым способом было бы просто написать содержимое на диск во временном месте (см. Path.GetTempFileName ), а затем выполнить его оттуда.

Я не уверен, но следующий код из этой темы может быть полезен:

 using System; using System.Runtime.InteropServices; /* * Title: CMemoryExecute.cs * Description: Runs an EXE in memory using native WinAPI. Very optimized and tiny. * * Developed by: affixiate * Release date: December 10, 2010 * Released on: http://opensc.ws * Credits: * MSDN (http://msdn.microsoft.com) * NtInternals (http://undocumented.ntinternals.net) * Pinvoke (http://pinvoke.net) * * Comments: If you use this code, I require you to give me credits. Don't be a ripper! ;] */ // ReSharper disable InconsistentNaming public static unsafe class CMemoryExecute { public struct STARTUPINFO { public uint cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } ///  /// Runs an EXE (which is loaded in a byte array) in memory. ///  /// The EXE buffer. /// Full path of the host process to run the buffer in. /// Optional command line arguments. ///  public static bool Run(byte[] exeBuffer, string hostProcess, string optionalArguments = "") { // STARTUPINFO STARTUPINFO StartupInfo = new STARTUPINFO(); StartupInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; StartupInfo.wShowWindow = SW_HIDE; var IMAGE_SECTION_HEADER = new byte[0x28]; // pish var IMAGE_NT_HEADERS = new byte[0xf8]; // pinh var IMAGE_DOS_HEADER = new byte[0x40]; // pidh var PROCESS_INFO = new int[0x4]; // pi var CONTEXT = new byte[0x2cc]; // ctx byte* pish; fixed (byte* p = &IMAGE_SECTION_HEADER[0]) pish = p; byte* pinh; fixed (byte* p = &IMAGE_NT_HEADERS[0]) pinh = p; byte* pidh; fixed (byte* p = &IMAGE_DOS_HEADER[0]) pidh = p; byte* ctx; fixed (byte* p = &CONTEXT[0]) ctx = p; // Set the flag. *(uint*)(ctx + 0x0 /* ContextFlags */) = CONTEXT_FULL; // Get the DOS header of the EXE. Buffer.BlockCopy(exeBuffer, 0, IMAGE_DOS_HEADER, 0, IMAGE_DOS_HEADER.Length); /* Sanity check: See if we have MZ header. */ if (*(ushort*)(pidh + 0x0 /* e_magic */) != IMAGE_DOS_SIGNATURE) return false; var e_lfanew = *(int*)(pidh + 0x3c); // Get the NT header of the EXE. Buffer.BlockCopy(exeBuffer, e_lfanew, IMAGE_NT_HEADERS, 0, IMAGE_NT_HEADERS.Length); /* Sanity check: See if we have PE00 header. */ if (*(uint*)(pinh + 0x0 /* Signature */) != IMAGE_NT_SIGNATURE) return false; // Run with parameters if necessary. if (!string.IsNullOrEmpty(optionalArguments)) hostProcess += " " + optionalArguments; if (!CreateProcess(null, hostProcess, IntPtr.Zero, IntPtr.Zero, false, CREATE_SUSPENDED, IntPtr.Zero, null, ref StartupInfo, PROCESS_INFO)) return false; var ImageBase = new IntPtr(*(int*)(pinh + 0x34)); NtUnmapViewOfSection((IntPtr)PROCESS_INFO[0] /* pi.hProcess */, ImageBase); if (VirtualAllocEx((IntPtr)PROCESS_INFO[0] /* pi.hProcess */, ImageBase, *(uint*)(pinh + 0x50 /* SizeOfImage */), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE) == IntPtr.Zero) Run(exeBuffer, hostProcess, optionalArguments); // Memory allocation failed; try again (this can happen in low memory situations) fixed (byte* p = &exeBuffer[0]) NtWriteVirtualMemory((IntPtr)PROCESS_INFO[0] /* pi.hProcess */, ImageBase, (IntPtr)p, *(uint*)(pinh + 84 /* SizeOfHeaders */), IntPtr.Zero); for (ushort i = 0; i < *(ushort*)(pinh + 0x6 /* NumberOfSections */); i++) { Buffer.BlockCopy(exeBuffer, e_lfanew + IMAGE_NT_HEADERS.Length + (IMAGE_SECTION_HEADER.Length * i), IMAGE_SECTION_HEADER, 0, IMAGE_SECTION_HEADER.Length); fixed (byte* p = &exeBuffer[*(uint*)(pish + 0x14 /* PointerToRawData */)]) NtWriteVirtualMemory((IntPtr)PROCESS_INFO[0] /* pi.hProcess */, (IntPtr)((int)ImageBase + *(uint*)(pish + 0xc /* VirtualAddress */)), (IntPtr)p, *(uint*)(pish + 0x10 /* SizeOfRawData */), IntPtr.Zero); } NtGetContextThread((IntPtr)PROCESS_INFO[1] /* pi.hThread */, (IntPtr)ctx); NtWriteVirtualMemory((IntPtr)PROCESS_INFO[0] /* pi.hProcess */, (IntPtr)(*(uint*)(ctx + 0xAC /* ecx */)), ImageBase, 0x4, IntPtr.Zero); *(uint*)(ctx + 0xB0 /* eax */) = (uint)ImageBase + *(uint*)(pinh + 0x28 /* AddressOfEntryPoint */); NtSetContextThread((IntPtr)PROCESS_INFO[1] /* pi.hThread */, (IntPtr)ctx); NtResumeThread((IntPtr)PROCESS_INFO[1] /* pi.hThread */, IntPtr.Zero); return true; } #region WinNT Definitions private const uint CONTEXT_FULL = 0x10007; private const int CREATE_SUSPENDED = 0x4; private const int MEM_COMMIT = 0x1000; private const int MEM_RESERVE = 0x2000; private const int PAGE_EXECUTE_READWRITE = 0x40; private const ushort IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ private const uint IMAGE_NT_SIGNATURE = 0x00004550; // PE00 private static short SW_SHOW = 5; private static short SW_HIDE = 0; private const uint STARTF_USESTDHANDLES = 0x00000100; private const uint STARTF_USESHOWWINDOW = 0x00000001; #region WinAPI [DllImport("kernel32.dll", SetLastError = true)] private static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, int[] lpProcessInfo); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("ntdll.dll", SetLastError = true)] private static extern uint NtUnmapViewOfSection(IntPtr hProcess, IntPtr lpBaseAddress); [DllImport("ntdll.dll", SetLastError = true)] private static extern int NtWriteVirtualMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, uint nSize, IntPtr lpNumberOfBytesWritten); [DllImport("ntdll.dll", SetLastError = true)] private static extern int NtGetContextThread(IntPtr hThread, IntPtr lpContext); [DllImport("ntdll.dll", SetLastError = true)] private static extern int NtSetContextThread(IntPtr hThread, IntPtr lpContext); [DllImport("ntdll.dll", SetLastError = true)] private static extern uint NtResumeThread(IntPtr hThread, IntPtr SuspendCount); #endregion #endregion } 

если вы ищете запуск файлов Exe с помощью C #, то эта ссылка дает хорошее объяснение с простым, но простым примером, как использовать Process и Process.Start .

В двух словах вы можете сделать

Process.Start("notepad.exe")

для запуска неуправляемых exe / приложений.

если это не работает, укажите полный путь к приложению, например

Process.Start(@"c:\windows\system32\notepad.exe")

(Я просто предполагаю, что notepad.exe существует в этой папке, но вы получаете эту идею.

Используйте [Process.Start()][1] (или другую перегрузку), и пусть O / S выполняет загрузку в память.

  • Как правильно передать параметры?
  • Является ли член-ссылочный class константы продлением срока службы временного?
  • Пользовательское связующее устройство для объекта
  • Win32Exception Недостаточно памяти для обработки этой команды
  • Каков правильный способ отмены асинхронной операции, которая не принимает CancellationToken?
  • memcpy vs назначение в C
  • Передача только типа параметра в C #
  • Использование rand () stdlib из нескольких streamов
  • Чтение пароля из std :: cin
  • Преобразование строки в double в C #
  • GCC фатальная ошибка: stdio.h: нет такого файла или каталога
  • Interesting Posts

    Tomcat 8 не может обрабатывать запрос на получение с ‘|’ в параметрах запроса?

    Как ускорить запуск Java VM (JVM)?

    Коллекция была изменена; перечисление не может выполнить ошибку при удалении ListItem из LIstBox

    Слишком длинное имя файла – НЕВОЗМОЖНО удалить / переместить / переименовать

    При получении результатов с сервера произошла ошибка транспортного уровня,

    Что означает robocopy, если вы изменили, одиноко и дополнительно?

    Загрузка файла на HTTP-сервер в программировании на iphone

    Считать слова в строковом методе?

    Какова ожидаемая продолжительность жизни SD-карты?

    Как получить json.net для сериализации членов classа, полученных из List ?

    Основная HTTP-аутентификация на iPhone

    UITableView прокручивается с определенной скоростью?

    Избавьтесь от сообщения «Значение атрибута annotation должно быть константным выражением»

    как преобразовать формат String в формат даты в JAVA?

    Несовместимость диска Windows 8 и 7 NTFS

    Давайте будем гением компьютера.