Не создается поток в ДЛЛ внедренной в адресное простр-во др. процесса

Тема в разделе "WASM.WIN32", создана пользователем ZeroMemory, 29 мар 2005.

  1. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Внедрил свою ДЛЛ в другой процесс. Имеем код (ДЛЛ):


    Код (Text):
    1.  
    2. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID _Reserved)
    3. {
    4.     switch(dwReason)
    5.     {
    6.     case DLL_PROCESS_ATTACH:{
    7.         CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerThread, NULL, 0, &st_id);
    8.    
    9.         return true;
    10.     }
    11.  
    12.     case DLL_THREAD_ATTACH:
    13.  
    14.         break;
    15.  
    16.     case DLL_THREAD_DETACH:
    17.  
    18.         break;
    19.  
    20.     case DLL_PROCESS_DETACH:
    21.  
    22.         break;
    23.     }//end switch(dwReason)
    24.  
    25.     return true;
    26. }
    27.  




    Процесс 100% аттаччится. Т.к. если во входной в ДЛЛ ф-ции прописать скажем MessageBox(...), то он запускается от имени процесса в который внедрились.

    Внимание вопрос: почему я не могу создать дочерний поток (CreateThread(...))? Ошибок никаких нет, но поток не запускается! Помогите плз найти решение проблемы.

    Благодарен! --zeromemory
     
  2. liss

    liss New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    25
    Приведи код потока, а то картина не полная. Ты уверен что поток 100% не создается? Попробуй вставить в код потока мессадж бокс, проверь код возврата CreateThread! :)
     
  3. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    2 liss



    Да, уверен. Вставлял МессаджБакс в код потока - не выполняется. CreateThread возвращает корректное значение (т.е. не NULL).

    Код потока:
    Код (Text):
    1.  
    2. DWORD WINAPI ServerThread(PVOID param){
    3.     SOCKET hServerSocket, hClientSocket;
    4.     struct sockaddr_in serv_sin;
    5.     //DWORD dwCliThreadId;
    6.     WORD port;
    7.  
    8.     Sleep(10);
    9.  
    10.     port = 9876;
    11.  
    12.     MessageBox(0, "in the server thread", "", MB_OK);
    13.  
    14.     // create TCP socket
    15.     hServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    16.     if (hServerSocket == INVALID_SOCKET){
    17.         CreateThread(NULL, 0, ServerThread, NULL, 0, &st_id);
    18.         TerminateThread(GetCurrentThread(), 0);
    19.     }
    20.  
    21.     // fill out local addr struct
    22.     serv_sin.sin_family = AF_INET;
    23.     serv_sin.sin_port = htons(port);
    24.     serv_sin.sin_addr.s_addr = htonl(INADDR_ANY);
    25.     __memset(&serv_sin.sin_zero, 0, sizeof(serv_sin.sin_zero));
    26.  
    27.     // bind local addr and listen for connections
    28.     if (bind(hServerSocket, (struct sockaddr*)&serv_sin, sizeof(serv_sin)) == SOCKET_ERROR){
    29.         CreateThread(NULL, 0, ServerThread, NULL, 0, &st_id);
    30.         TerminateThread(GetCurrentThread(), 0);
    31.     }
    32.     if (listen(hServerSocket, SOMAXCONN) == SOCKET_ERROR){
    33.         CreateThread(NULL, 0, ServerThread, NULL, 0, &st_id);
    34.         TerminateThread(GetCurrentThread(), 0);
    35.     }
    36.  
    37.     CreateThread(NULL, 0, StatsThread, (PVOID)port, 0, &st_id);
    38.  
    39.     // wait for connection from anybody
    40.     while (1){
    41.         hClientSocket = accept(hServerSocket, NULL, NULL);
    42.         if (hClientSocket == INVALID_SOCKET){
    43.             Sleep(1000);
    44.             continue;
    45.         }else{
    46.             CreateThread(NULL, 0, ClientThread, (PVOID)hClientSocket, 0, &st_id);
    47.         }
    48.     }
    49.     return 0;
    50. }
    51.  
     
  4. liss

    liss New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    25
    Уверен, что DLL_PROCESS_ATTACH обрабатывается? Вставь туда мессадж бокс!:)
     
  5. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79




    Уверен! Вставлял - работает мессаджбокс в контексте целевого процесса!
     
  6. liss

    liss New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    25
    Твоя дллка почему-то даже локально не работает...
     
  7. liss

    liss New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    25
    т.е. тред не запускается :)
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Может быть дело в:

     
  9. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Если даже локально не запускает тред, то проблема 100% не в моем коде внедрения в процесс!

    Что же это может быть и как этот трабл решить? Если " entry-point function should perform only simple initialization" не позволяет стартануть тред, то как запустить тред вне входной ф-ции?

    Помогите плз - крайне важно!
     
  10. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    MSDN на DllMain:



     
  11. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Ok. Понял что нельзя вызывать CreateThread в инициализаторе... В таком случае откуда я должен вызвать ее? Необходимо создавать потоки, и я не верю что это вообще невозможно в ДЛЛ!

    Возникла мысль с инициализатора послать мое сообщение оконной ф-ции, и перехаватить его в ней же.. И уже оттуда вызвать CreateThread.. Но это как-то не красиво, по ламерски.. Да и возможно работать не будет.. Может кто-нить занет более красивый способ запуска дочерних потоков из ДЛЛ?

    Спасибо.
     
  12. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Фуфффф.... Пробела решена!! Геморр еще тот - но все заставил работать!! Заюзал WaitForSingleObject().



    Всем спасибо!
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ZeroMemory



    У меня нормально Thread создаётся и MessageBox показывается.
    Код (Text):
    1. .486
    2. .model flat, stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\user32.inc
    7. includelib kernel32.lib
    8. includelib user32.lib
    9.  
    10.  
    11. ThreadProc PROTO  :DWORD
    12.  
    13.  
    14. .DATA
    15.  
    16. szOk   db "Ok",0
    17.  
    18.  
    19. .DATA?
    20.  
    21. ThreadID    dd ?
    22.  
    23. .CODE
    24.  
    25. ALIGN DWORD
    26. DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD
    27.    .IF reason == DLL_PROCESS_ATTACH     ; When the dll is loaded
    28.       invoke CreateThread, NULL, 0, OFFSET ThreadProc, NULL, 0, OFFSET ThreadID
    29.       invoke CloseHandle, eax
    30.    .ENDIF
    31.    xor eax, eax
    32.    inc eax
    33.    ret
    34. DllEntry Endp
    35.  
    36. ThreadProc proc Param:DWORD
    37.   invoke MessageBox, 0, OFFSET szOk, 0, MB_OK or MB_ICONERROR
    38.   ret
    39. ThreadProc endp
    40.  
    41.  
    42. End DllEntry
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    а как DLL грузится в процесс ?

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

    n0ts New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2005
    Сообщения:
    5
    Все таки как была решена эта проблема? У меня аналогичная!

    Function L: DWord;

    Begin



    MessageBoxA(0, 'bla bla', '23', 0);

    end;



    Case Reason Of

    DLL_PROCESS_ATTACH:

    begin

    hThread := CreateThread(nil, 0, @L, nil, 0, lpThreadId);



    If (hThread <> 0) Then

    WaitForSingleObject(hThread,INFINITE);



    Мессадж не показывается!!!
     
  16. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Дык тред не создается в ф-ции инициализации (во всяком случае в среде VC++6)! Делай так:
    Код (Text):
    1.  
    2. DWORD WINAPI BeginThread(LPVOID lpParameter)
    3. {
    4.     MSG msg;
    5.     WSADATA wsa;
    6.     HMODULE hDll = (HMODULE) lpParameter;
    7.  
    8.     WaitForSingleObject(g_hThrDllMain, INFINITE);
    9.  
    10.     // begin my stuff
    11.  
    12.     // вот тут уже можем запускать потоки
    13.        
    14.     CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerThread, NULL, 0, &st_id);
    15.    
    16.     while (GetMessage(&msg, NULL, 0, 0)){
    17.         TranslateMessage(&msg);
    18.         DispatchMessage(&msg);
    19.     }
    20.  
    21.     WSACleanup();
    22.    
    23.     // Do what the function name says.
    24.     FreeLibraryAndExitThread(hDll, 0);
    25.     return 0;
    26. }
    27.  
    28. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID _Reserved)
    29. {
    30.     switch(dwReason)
    31.     {
    32.     case DLL_PROCESS_ATTACH:{
    33.         DWORD dwThrId;
    34.  
    35.         BOOL bRes =
    36.         DuplicateHandle(GetCurrentProcess(),
    37.                          GetCurrentThread(),
    38.                          GetCurrentProcess(),
    39.                          &g_hThrDllMain,
    40.                          0,
    41.                          FALSE,
    42.                          0);
    43.         if( bRes == FALSE ) break;
    44.  
    45.        
    46.         CloseHandle(CreateThread(NULL,
    47.                                   0,
    48.                                   BeginThread,
    49.                                   (LPVOID) LoadLibrary(g_tzModuleName),
    50.                                   0,
    51.                                   &dwThrId));
    52.        
    53.         return true;
    54.     }
    55.  
    56.     case DLL_THREAD_ATTACH:
    57.  
    58.         break;
    59.  
    60.     case DLL_THREAD_DETACH:
    61.  
    62.         break;
    63.  
    64.     case DLL_PROCESS_DETACH:
    65.  
    66.         break;
    67.     }//end switch(dwReason)
    68.  
    69.     return true;
    70. }
    71.  




    --zeromemory
     
  17. Julius

    Julius New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2003
    Сообщения:
    42
    to ZeroMemory

    Если тред не создается в функции инициализации, то как выше приведенный код будет работать? Ведь функция BeginThread никогда не запуститься, т.к. тред не создался.
     
  18. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Обрати внимание на ф-цию DuplicateHandle(). И если не веришь - просто скомпиль этот код и увидешь что все работает на ура. А если сразу CreateThread() - то ничего не прокатит...
     
  19. Julius

    Julius New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2003
    Сообщения:
    42
    Я верю что все работает. На моей памяти небыло еще такого чтобы треды при инициализации DLL не создавались. Вот такой код у меня работает.

    DWORD ThreadId;

    HANDLE hThread;

    int ThreadProc(int Param);



    BOOL APIENTRY DllMain( HANDLE hModule,

    DWORD ul_reason_for_call,

    LPVOID lpReserved

    )

    {

    if(ul_reason_for_call==DLL_PROCESS_ATTACH){

    hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,NULL,0,&ThreadId);

    };

    return TRUE;

    };

    int ThreadProc(int Param){

    MessageBox(0,"Hey man I'm sarted","New thread",MB_OK);

    return 0;

    };