CreateRemoteThread говорит, что файл не существует, но он СУЩЕСТВУЕТ

#c# #visual-c #dll-injection #createremotethread

#c# #visual-c #dll-инъекция #createremotethread

Вопрос:

Я пытаюсь внедрить .dll в память другого процесса, используя Interop .

Это мой код на C #:

 class Program
{
        static void Main(string[] args)
        {
            var result = Inject(Process.GetProcessesByName("notepad")[0].Id);

            Console.WriteLine(result);

            if (result < 0)
                throw new Win32Exception(Marshal.GetLastWin32Error());

            Console.ReadLine();
        }

        [DllImport("Testing.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Inject(int dwProcessId);
}
  

Код для функции Inject такой (обратите внимание на комментарий return -6 ):

 //C   .dll that does actually exists
const char* DLL_NAME = "C:\Users\Bruno\Source\Repos\CourseGuidance\InteropTestingDebug\Loader.dll";

TESTING_API DWORD Inject(DWORD dwProcessId)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

    if (hProcess == NULL)
        return -1;

    HMODULE hModule = GetModuleHandleW(L"kernel32.dll");

    if (hModule == NULL)
        return -2;

    FARPROC pLoadLibrary = GetProcAddress(hModule, "LoadLibraryA");

    if (pLoadLibrary == NULL)
        return -3;

    LPVOID pMemory = VirtualAllocEx(hProcess, NULL, strlen(DLL_NAME)   1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    if (pMemory == NULL)
        return -4;

    BOOL result = WriteProcessMemory(hProcess, pMemory, DLL_NAME, strlen(DLL_NAME)   1, NULL);

    if (!result)
        return -5;

    HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE) pLoadLibrary, pMemory, 0, NULL);

    if (hThread == NULL)
        return -6;

    WaitForSingleObject(hThread, INFINITE);

    VirtualFreeEx(hProcess, pMemory, strlen(DLL_NAME)   1, MEM_RELEASE);

    CloseHandle(hThread);

    CloseHandle(hProcess);

    return 0;
}
  

Я думаю, что ошибка, которую я получаю, может вводить в заблуждение, поскольку файл действительно существует в этой папке. Я также подумал, что ошибка может быть из-за LoadLibraryA , что для ASCII, даже пробовал использовать LoadLibraryW , но у меня все та же проблема.

Если у кого-то есть представление о том, что может быть не так, не могли бы вы указать мне правильное направление?

Комментарии:

1. В чем заключается фактическая ошибка? Шестнадцатеричный код ошибки? Может ли это быть проблемой зависимости, DLL зависит от какого-то другого модуля, который он не может найти?

2. Фактический код 2

3. У вас стандартная ошибка, которая часто встречается со строками C. Вы забываете скопировать 0-терминатор. Используйте strlen(DLL_NAME) 1 вместо этого.

4. В вашем const char* DLL_NAME одна из обратных косых черт не была удвоена.

5. Есть ли причина, по которой вы не сообщаете нам, какое значение вернула функция ввода?

Ответ №1:

Вы не объявили Inject as SetLastError=true . Следовательно, значение, которое вы получили, Marshal.GetLastWin32Error является мусором:

Маршал.Метод GetLastWin32Error

Возвращает код ошибки, возвращенный последней неуправляемой функцией, которая была вызвана с помощью platform invoke, имеющей атрибут DllImportAttribute .Установлен флаг SetLastError .

Вы можете использовать этот метод для получения кодов ошибок, только если вы применяете System.Runtime.Службы взаимодействия.DllImportAttribute для подписи метода и установите для поля SetLastError значение true . Процесс для этого варьируется в зависимости от используемого исходного языка: C # и C по умолчанию имеют значение false , но оператор Declare в Visual Basic имеет значение true .