Перехват API-функций через CreateRemoteThread

Тема в разделе "WASM.BEGINNERS", создана пользователем Codegrammer, 16 май 2010.

  1. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Ниже приведен код функции, которая внедряет dll-ку в требуемый процесс.
    Этот почему то не хочет работать с файлами, скомпилированными в Delphi7. Вылетает какая-то непонятная ошибка.
    Ссылка на пример: http://foldo.ru/42113ioq47/hookDelphi.rar.html
    В архиве лежит hooker.dll, main.exe и input.txt, необходимый для main.


    Код (Text):
    1. void CreateHookedProccess(LPCWSTR fileExePath,LPCWSTR dllPath)
    2. {
    3.     PROCESS_INFORMATION info;
    4.     STARTUPINFO startupInfo;
    5.     startupInfo.cb=sizeof(startupInfo);
    6.     RtlZeroMemory(&startupInfo,sizeof(startupInfo));
    7.     BOOL b=CreateProcessW(fileExePath,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&startupInfo,&info);
    8.     int a = GetLastError();
    9.     LPWSTR pParam;
    10.     int len=2*(wcslen(dllPath)+1);
    11.     pParam=(LPWSTR)VirtualAllocEx(info.hProcess,NULL,len,MEM_COMMIT,PAGE_READWRITE);
    12.     WriteProcessMemory(info.hProcess,pParam,dllPath,len,NULL);
    13.     PTHREAD_START_ROUTINE startFunc = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandleW(L"kernel32.dll"),"LoadLibraryW");
    14.     HANDLE thread=CreateRemoteThread(info.hProcess,NULL,0,startFunc,pParam,0,NULL);
    15.     WaitForSingleObject(thread,INFINITE);  // тут исправь
    16.     VirtualFreeEx(info.hProcess,pParam,0,MEM_RELEASE);
    17.     ResumeThread(info.hThread);
    18.     CloseHandle(thread);
    19. }
     
  2. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Прошу не оффтопить по поводу APY-функций :) С кем не бывает.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Манифест битый.
    (кстате всёравно не загрузится у меня, требует какието левые либы/рантайм от компилятора. отвратительно собранный модуль).
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Codegrammer
    CreateProcess(CREATE_SUSPENDED) + CreateRemoteThread
    в общем случае не работает
    используйте QueueUserAPC или чтото другое вместо CreateRemoteThread
     
  5. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Так экзешник ведь запускается. Когда к нему погружаем dll, срабатывает DLLMain. Все фейлится после ResumeThread.

    Рихтер пишет именно о CreateRemoteThread. Тот ли это случай, что именно здесь не работает?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Codegrammer
    Кикие есчо длл. У меня на XP3 ничего не грузится. Я есчо подумал нафиг экзешник нужен был.. Сказано про длл.
     
  7. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Всмысле не грузится? Я только что скопировал вышеуказанный код. Все скомпилил. До CreateRemoteThread все норм. Я в эту длл-ку messageBox пихал в случае ее загрузки. Она грузилась нормально. В чем конкретно ошибка? Что означает не грузится?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Codegrammer
    Эм.. его компилить нужно ?
    Но у меня нет дельфе :)
     
  9. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    void CreateHookedProccess(LPCWSTR fileExePath,LPCWSTR dllPath) - это нужно компилить. Вы видимо немного меня не поняли. Не работает CreatHookedProccess. И причем не пработает если ему подсовывать старые делфийские программы. В архиве я и скинул такую программу + длл-ку.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Codegrammer
    Я запускал в песочнице экзешник. Он в файл строку символов пишет, из его каталога длл не грузится, тоесть не используется. Тогда я подумал что нужно её загружать вручную. Вот при загрузке лодер возвращает ошибку. Если подробно, то она возникает следующем образом:
    LoadLibraryA -> LdrpWalkImportDescriptor -> LdrpManifestProberRoutine
    Последняя переменная содержит ссылку на kernel32!BasepProbeForDllManifest, это калбэк вызываемый нэйтивным лодером. Он ищет манифест в ресурсах. Собственно CreateActCtx() возвращает STATUS_SXS_CANT_GEN_ACTCTX так как манифест битый(не знаю что с ним), далее после возврата модуль анмапиться, загрузка прекращается.
    Если удалить манифест то всё отрабатывает норм, почти всё. В импорте MSVCR90D.dll, у меня этого модуля нет и на этом дальнейшая загрузка обламывается, тоесть модуль не работаспособный.
     
  11. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Clerk, спасибо за подробную информацию. Если можно, хотелось бы еще пару вопросов:
    1)Что такое манифест pe-файла и где он находится? (Я слышал, что он есть .net сборках)
    2)где можно взять песочницу? (насколько я понимаю, вещь достаточно полезная)
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Codegrammer
    нужно проверять успешность работы функций, чтоб потом не искать ошибку непонятно где
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если слетают стили изза манифеста, можно использовать это:
    Код (Text):
    1. ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID    equ 1
    2. ACTCTX_FLAG_LANGID_VALID            equ 2
    3. ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID        equ 4
    4. ACTCTX_FLAG_RESOURCE_NAME_VALID         equ 8
    5. ACTCTX_FLAG_SET_PROCESS_DEFAULT         equ 10H
    6. ACTCTX_FLAG_APPLICATION_NAME_VALID      equ 20H
    7. ACTCTX_FLAG_HMODULE_VALID           equ 80H
    8.  
    9. CREATEPROCESS_MANIFEST_RESOURCE_ID      equ 1
    10.  
    11. ACTCTX struct   ; 0x20
    12. cbSize              ULONG ?
    13. dwFlags             DWORD ?
    14. lpSource            PWSTR ?
    15. wProcessorArchitecture      WORD ?
    16. wLangId             WORD ?
    17. lpAssemblyDirectory     PSTR ?
    18. lpResourceName          PSTR ?
    19. lpApplicationName       PSTR ?
    20. hModule             HANDLE ?
    21. ACTCTX ends
    22. PACTCTX typedef ptr ACTCTX
    23.  
    24. Local Context:ACTCTX
    25. Local CtxHandle:HANDLE
    26. Local Cookie:ULONG
    27.     mov Context.cbSize,sizeof(ACTCTX)
    28.     mov Context.dwFlags,ACTCTX_FLAG_HMODULE_VALID or ACTCTX_FLAG_RESOURCE_NAME_VALID
    29.     mov Context.lpResourceName,CREATEPROCESS_MANIFEST_RESOURCE_ID
    30.     mov Context.lpSource,offset $ExeName
    31.     mov dword ptr [Context.wProcessorArchitecture],NULL
    32.     mov Context.lpAssemblyDirectory,NULL
    33.     mov Context.lpApplicationName,NULL
    34.     ; DllHandle --> Context.hModule
    35.     invoke CreateActCtxA, addr Context
    36.     %APIERR
    37.     mov CtxHandle,eax
    38.     invoke ActivateActCtx, CtxHandle, addr Cookie
    39.     ..