перехват CreateProcess =\

Тема в разделе "WASM.BEGINNERS", создана пользователем LazzY, 29 мар 2007.

  1. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    Перехватываю функцию 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 процесса.
    Спасибо
     
  2. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    закоментировал код, где передаю проге id процесса и вклиниваюсь,по Рихтеру через CreateRemoteThread. Тоже все работает. Значит где-то глюк. Собсствено мне нужен id процесса, а код дальше стандартный
    Сюда передаю это id
    Код (Text):
    1. BOOL CExInjectDlg::OpenProcessin(DWORD dwProcessId, CString Dll_name)
    2. {
    3.   BOOL fOk = FALSE; // Assume that the function fails
    4.   HANDLE hProcess = NULL, hThread = NULL;
    5.   PWSTR pszLibFileRemote = NULL;
    6.  
    7.     // Get a handle for the target process.
    8.     hProcess = OpenProcess(
    9.       PROCESS_QUERY_INFORMATION |   // Required by Alpha
    10.       PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
    11.       PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
    12.       PROCESS_VM_WRITE,             // For WriteProcessMemory
    13.       FALSE, dwProcessId);
    14.     if (hProcess == NULL)
    15.     {
    16.       if (pszLibFileRemote != NULL)
    17.         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    18.  
    19.       if (hThread  != NULL)
    20.         CloseHandle(hThread);
    21.  
    22.       if (hProcess != NULL)
    23.         CloseHandle(hProcess);
    24.       return FALSE;
    25.     }
    26.  
    27.     // Calculate the number of bytes needed for the DLL's pathname
    28.     int cch = 1 + lstrlenW(Dll_name.GetBuffer());
    29.     int cb  = cch * sizeof(WCHAR);
    30.  
    31.     // Allocate space in the remote process for the pathname
    32.     pszLibFileRemote = (PWSTR)
    33.       VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
    34.     if (pszLibFileRemote == NULL)
    35.     {
    36.       if (pszLibFileRemote != NULL)
    37.         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    38.  
    39.       if (hThread  != NULL)
    40.         CloseHandle(hThread);
    41.  
    42.       if (hProcess != NULL)
    43.         CloseHandle(hProcess);
    44.       return FALSE;
    45.     }
    46.  
    47.     // Copy the DLL's pathname to the remote process's address space
    48.     if (!WriteProcessMemory(hProcess, pszLibFileRemote,
    49.       (PVOID) Dll_name.GetBuffer(), cb, NULL))
    50.     {
    51.       if (pszLibFileRemote != NULL)
    52.         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    53.  
    54.       if (hThread  != NULL)
    55.         CloseHandle(hThread);
    56.  
    57.       if (hProcess != NULL)
    58.         CloseHandle(hProcess);
    59.       return FALSE;
    60.     }
    61.  
    62.     // Get the real address of LoadLibraryW in Kernel32.dll
    63.     PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
    64.       GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
    65.     if (pfnThreadRtn == NULL)
    66.     {
    67.       if (pszLibFileRemote != NULL)
    68.         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    69.  
    70.       if (hThread  != NULL)
    71.         CloseHandle(hThread);
    72.  
    73.       if (hProcess != NULL)
    74.         CloseHandle(hProcess);
    75.       return FALSE;
    76.     }
    77.  
    78.     // Create a remote thread that calls LoadLibraryW(DLLPathname)
    79.     hThread = CreateRemoteThread(hProcess, NULL, 0,
    80.       pfnThreadRtn, pszLibFileRemote, 0, NULL);
    81.     if (hThread == NULL)
    82.     {
    83.       if (pszLibFileRemote != NULL)
    84.         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    85.  
    86.       if (hThread  != NULL)
    87.         CloseHandle(hThread);
    88.  
    89.       if (hProcess != NULL)
    90.         CloseHandle(hProcess);
    91.       return FALSE;
    92.     }
    93.  
    94.     // Wait for the remote thread to terminate
    95.     WaitForSingleObject(hThread, INFINITE);
    96.  
    97.     fOk = TRUE; // Everything executed successfully
    98.  
    99.     // Free the remote memory that contained the DLL's pathname
    100.     if (pszLibFileRemote != NULL)
    101.       VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    102.  
    103.     if (hThread  != NULL)
    104.       CloseHandle(hThread);
    105.  
    106.     if (hProcess != NULL)
    107.       CloseHandle(hProcess);
    108.   return fOk;
    109. }
    Но я так и не увидел, что же может мешать ...
     
  3. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    лол

    dwCreationFlags |= CREATE_SUSPENDED;
     
  4. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Сорри за ЛОЛ! Я так и делаю.dwCreationFlags |= CREATE_SUSPENDED; Просто запостили сюда с ошибкой. Это не важно. Результат не меняется... Прежде чем кричать ЛОЛ, нужно убедится в правильности своего ответа.
     
  5. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Исправляю вопрос, но результат прежний. что б ЛОЛ не кричали
    Код (Text):
    1. 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)
    2.  
    3. {
    4.   dwCreationFlags|=CREATE_SUSPENDED; //Замораживаю
    5. //Вызываю оригинальную
    6.   BOOL handle=MyCreateProccessA(  lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
    7.   if(handle)
    8.  
    9.   {
    10.     WaitForSingleObject(hMutex, INFINITE);
    11.     //.... Тут код мой, где передаю проге id процесса и вклиниваюсь,по Рихтеру
    12.     WaitForSingleObject(Event,INFINITE);
    13.     ReleaseMutex(hMutex);
    14.   }
    15.   ResumeThread(lpProcessInformation->hThread);// Продолжаю работать
    16.   return handle;
    17. }
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    ja bi perexvatival CreateProcessInternalW
     
  7. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Я первый раз слышу о такой функции. Я вообще-то из UserMode все делаю...
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    coocky
    imenno ottuda
     
  9. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    как же я могу сказать тебе правильный ответ если я не понимаю что ты делаешь
    я ж не знаю что такое hMutex Event, может у тебя там дедлоки
    где висят процессы которые
    ты тоже не сказал
    судя по коментам код у тебя выдран откуда-то из рихтера чтоли

    тоже лол кстати

    полностью согласен. Через него все проходит, а через CreateProcessA далеко не все

    посоветовать могу вместо CreateRemoteThread поменять EntryPoint на свой код (тот что StartAddress в ремоут-треде). Это более правильно чем то что ты делаешь
     
  10. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Пытаюсь вклинить свою длл, в вновь создаваемый процесс
    Исключено Вообще синхронизация отпадает. Ибо не работаеют КОНКРЕТНЫЕ приложения и в конкретных системах. Одни и теже!
    Да. Код внедрения длл в удаленый процесс.
    Есть перехват И W и A вариантов. Я ж не буду все вылаживать! Привел пример. Сразу скажу (хотя и так понятно должно быть), что не рабоает в обоих вариантах перехваченых функций.
    Я первый раз вижу такую функцию. Даже МСДН молчит. Больше у меня ничего не под рукой.
    Если можно, то дай ссылочку или обьясни, плиз подробней
    Кстати, нашел тут у вас в ветке такой же вопрос. На него не последовало ответа. У человека в некоторых приложения просто не отображались кнопки или до конца не отрисовывался интерфейс. У меня в одном из приложений просто не хватает некоторых пунктов меню еще..
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    coocky
    esli vi lezete v forum, znachit inet u vas est'. vospolzuitec' googlom!
     
  12. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Пользовался! Что такое PSDK? Откуда такая функция? Под NT, 2000 работает? Она исправит мою проблему? Если вы незнаете ответ, то ненадо разводить демагогию!! Очень сомневаюсь , в том, что вы имеете хоть какое-то представление, о ВОЗМОЖНЫХ причинах проблемы! Вы сами набирали в гугле? Ну так наберите! И посмотрите. Я вообще не понимаю , к чему весь этот разговор. К чему этот перехват CreateProcessInternalW!! Меня устраивают и мои функции. Если я лезу в форум, это не значит, что я только вчера открыл книгу по С++!
    Я лишь спрашивал совет, думал ЗДЕСЬ знают. Все понятно...
     
  13. ShadoWich

    ShadoWich New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2007
    Сообщения:
    35
    Действительно, тут никто ничего не знают. Вам следует обратиться в соседний форум и сайт, в котором знают ВСЁ.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    coocky
    spokoynee. u menya perexvat pabotaet, a pabotaet li on u Vas?
     
  15. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Я не требую ответа.. Просто уже 40000 ответов-и все не по теме.
    У меня тоже все перехватывает. Проблема только с внедрением в новый процесс. Если не секрет-мож поделитесь БЕЗГЛЮЧНЫМ вариантом? Если нет-то и ненадо. Проблема давно решена путем снимка открытых процессов, а в новые-методом внедрения через AppInit_DLL/ Просто хотелось разобраться , в чем проблема в даной ситуации..
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это внутренняя функция kernel32.dll которая и делает всю работу по созданию процесса.
    CreateProcessA/W (и др) просто оболочки для неё. Поэтому и хучить надо её.
     
  17. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Когда я с этим экспериментировал, у меня тоже в нокоторых приложениях не прорисовывались окна до конца. И проблема как правило не в функции обработчика. А в том, что надо останавливать весь процесс уже при вызове ZwCreateThread . А потом делать ZwResumeThread. Тогда все должно быть как надо.
    По крайней мере , лучше всего перехватывать именно эти функции.
     
  18. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    TermoSINteZ, спасибо, значит проблема не во мне,или коде. а в чем -то другом. Спасибо.. ,только, правда ,NtCreateThread
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    coocky
    Если глянуть в отладчик, что NT, что ZW - точка входа одна.
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В ntdll - да, в ядре - нет.