Перехватываю функцию CreateProcess, вот обработчик фуункции перехватчика BOOL WINAPI UnrealMyCreateProccessA(IN LPCSTR lpApplicationName,IN LPSTR lpCommandLine,IN LPSECURITY_ATTRIBUTES lpProcessAttributes,IN LPSECURITY_ATTRIBUTES lpThreadAttributes,IN BOOL bInheritHandles,IN DWORD dwCreationFlags,IN LPVOID lpEnvironment,IN LPCSTR lpCurrentDirectory,IN LPSTARTUPINFOA lpStartupInfo,OUT LPPROCESS_INFORMATION lpProcessInformation) { dwCreationFlags=CREATE_SUSPENDED; //Замораживаю //Вызываю оригинальную BOOL handle=MyCreateProccessA( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); if(handle) { WaitForSingleObject(hMutex, INFINITE); //.... Тут код мой, где передаю проге id процесса и вклиниваюсь,по Рихтеру WaitForSingleObject(Event,INFINITE); ReleaseMutex(hMutex); } ResumeThread(lpProcessInformation->hThread);// Продолжаю работать return handle; } Так вот некоторые программы запускаются НЕ ДО ОКНЦА, а в ХР вообще ни опера и IExplorer не запускаются.. Хотя с блокнотом, офисными приложениями и многими другими-все ок.. Стоит убрать dwCreationFlags=CREATE_SUSPENDED;ResumeThread(lpProcessInformation->hThread)- все работает ,как по маслу.. И вообще, как тогда можно организовать такое взаимодействие? Мне обязательно нужно вернуть оригинальную функцию до своей обработки, ибо нужно получить запущеное приложение и еще его id процесса. Спасибо
закоментировал код, где передаю проге id процесса и вклиниваюсь,по Рихтеру через CreateRemoteThread. Тоже все работает. Значит где-то глюк. Собсствено мне нужен id процесса, а код дальше стандартный Сюда передаю это id Код (Text): BOOL CExInjectDlg::OpenProcessin(DWORD dwProcessId, CString Dll_name) { BOOL fOk = FALSE; // Assume that the function fails HANDLE hProcess = NULL, hThread = NULL; PWSTR pszLibFileRemote = NULL; // Get a handle for the target process. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | // Required by Alpha PROCESS_CREATE_THREAD | // For CreateRemoteThread PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx PROCESS_VM_WRITE, // For WriteProcessMemory FALSE, dwProcessId); if (hProcess == NULL) { if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Calculate the number of bytes needed for the DLL's pathname int cch = 1 + lstrlenW(Dll_name.GetBuffer()); int cb = cch * sizeof(WCHAR); // Allocate space in the remote process for the pathname pszLibFileRemote = (PWSTR) VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); if (pszLibFileRemote == NULL) { if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Copy the DLL's pathname to the remote process's address space if (!WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID) Dll_name.GetBuffer(), cb, NULL)) { if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Get the real address of LoadLibraryW in Kernel32.dll PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); if (pfnThreadRtn == NULL) { if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Create a remote thread that calls LoadLibraryW(DLLPathname) hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, pszLibFileRemote, 0, NULL); if (hThread == NULL) { if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Wait for the remote thread to terminate WaitForSingleObject(hThread, INFINITE); fOk = TRUE; // Everything executed successfully // Free the remote memory that contained the DLL's pathname if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return fOk; } Но я так и не увидел, что же может мешать ...
Сорри за ЛОЛ! Я так и делаю.dwCreationFlags |= CREATE_SUSPENDED; Просто запостили сюда с ошибкой. Это не важно. Результат не меняется... Прежде чем кричать ЛОЛ, нужно убедится в правильности своего ответа.
Исправляю вопрос, но результат прежний. что б ЛОЛ не кричали Код (Text): BOOL WINAPI UnrealMyCreateProccessA(IN LPCSTR lpApplicationName,IN LPSTR lpCommandLine,IN LPSECURITY_ATTRIBUTES lpProcessAttributes,IN LPSECURITY_ATTRIBUTES lpThreadAttributes,IN BOOL bInheritHandles,IN DWORD dwCreationFlags,IN LPVOID lpEnvironment,IN LPCSTR lpCurrentDirectory,IN LPSTARTUPINFOA lpStartupInfo,OUT LPPROCESS_INFORMATION lpProcessInformation) { dwCreationFlags|=CREATE_SUSPENDED; //Замораживаю //Вызываю оригинальную BOOL handle=MyCreateProccessA( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); if(handle) { WaitForSingleObject(hMutex, INFINITE); //.... Тут код мой, где передаю проге id процесса и вклиниваюсь,по Рихтеру WaitForSingleObject(Event,INFINITE); ReleaseMutex(hMutex); } ResumeThread(lpProcessInformation->hThread);// Продолжаю работать return handle; }
как же я могу сказать тебе правильный ответ если я не понимаю что ты делаешь я ж не знаю что такое hMutex Event, может у тебя там дедлоки где висят процессы которые ты тоже не сказал судя по коментам код у тебя выдран откуда-то из рихтера чтоли тоже лол кстати полностью согласен. Через него все проходит, а через CreateProcessA далеко не все посоветовать могу вместо CreateRemoteThread поменять EntryPoint на свой код (тот что StartAddress в ремоут-треде). Это более правильно чем то что ты делаешь
Пытаюсь вклинить свою длл, в вновь создаваемый процесс Исключено Вообще синхронизация отпадает. Ибо не работаеют КОНКРЕТНЫЕ приложения и в конкретных системах. Одни и теже! Да. Код внедрения длл в удаленый процесс. Есть перехват И W и A вариантов. Я ж не буду все вылаживать! Привел пример. Сразу скажу (хотя и так понятно должно быть), что не рабоает в обоих вариантах перехваченых функций. Я первый раз вижу такую функцию. Даже МСДН молчит. Больше у меня ничего не под рукой. Если можно, то дай ссылочку или обьясни, плиз подробней Кстати, нашел тут у вас в ветке такой же вопрос. На него не последовало ответа. У человека в некоторых приложения просто не отображались кнопки или до конца не отрисовывался интерфейс. У меня в одном из приложений просто не хватает некоторых пунктов меню еще..
Пользовался! Что такое PSDK? Откуда такая функция? Под NT, 2000 работает? Она исправит мою проблему? Если вы незнаете ответ, то ненадо разводить демагогию!! Очень сомневаюсь , в том, что вы имеете хоть какое-то представление, о ВОЗМОЖНЫХ причинах проблемы! Вы сами набирали в гугле? Ну так наберите! И посмотрите. Я вообще не понимаю , к чему весь этот разговор. К чему этот перехват CreateProcessInternalW!! Меня устраивают и мои функции. Если я лезу в форум, это не значит, что я только вчера открыл книгу по С++! Я лишь спрашивал совет, думал ЗДЕСЬ знают. Все понятно...
Действительно, тут никто ничего не знают. Вам следует обратиться в соседний форум и сайт, в котором знают ВСЁ.
Я не требую ответа.. Просто уже 40000 ответов-и все не по теме. У меня тоже все перехватывает. Проблема только с внедрением в новый процесс. Если не секрет-мож поделитесь БЕЗГЛЮЧНЫМ вариантом? Если нет-то и ненадо. Проблема давно решена путем снимка открытых процессов, а в новые-методом внедрения через AppInit_DLL/ Просто хотелось разобраться , в чем проблема в даной ситуации..
Это внутренняя функция kernel32.dll которая и делает всю работу по созданию процесса. CreateProcessA/W (и др) просто оболочки для неё. Поэтому и хучить надо её.
Когда я с этим экспериментировал, у меня тоже в нокоторых приложениях не прорисовывались окна до конца. И проблема как правило не в функции обработчика. А в том, что надо останавливать весь процесс уже при вызове ZwCreateThread . А потом делать ZwResumeThread. Тогда все должно быть как надо. По крайней мере , лучше всего перехватывать именно эти функции.
TermoSINteZ, спасибо, значит проблема не во мне,или коде. а в чем -то другом. Спасибо.. ,только, правда ,NtCreateThread