Вобщем интересует следущее есть ли у когото сырец по данной теме нужно помочь в такой идее есть процесс м когда он порождает дочерний туда надо внедрить либу или кусок бинарного кода возможно и то и другое вопрос в следующем нужен нормальный маппинг DLL файла в режиме ядра поток я создаю сам ZwCreateThread это я научился ) ах да прыжок на LoadlibraryEx, LdrLoadDll не то они не подходять в виду того что либа должна быть немного незаметной .. DllMain я выполняю своим кодом это уже готово я делаю данную вещь в юзмоде там все ок а вот в ядре пока не решаюсь а ещо внедрение происходит на стадии создания процесса а DllMain выполняется перед кодом главной нити проиложения. кто из уважаемой публики по делу может чтото посоветовать? бу ду рад любой помощи по данной теме! и либы юзает только Kernel32 Ntdll функции
Юзай (peb+2d8)=адрес строки с именем dll (в каноническом виде) - это для x64, для x32 1e8. Правда винда иногда грузит shimeng.dll (смотрит ExecuteOptions и в sysmain.sdb) так что лучше замапить себя как \\knowndlls\shimeng.dll (+knowndlls32 для 32б процессов в 64битной винде) и пихать в peb уже shimeng.dll соответственно. В peb писать можно уже на колбэке о создании процесса (который ставится PsSetCreateProcessNotifyRoutine).
Вот код собсно: Код (Text): typedef unsigned long DWORD; typedef unsigned short WORD; typedef unsigned char BYTE; __declspec(dllimport) DWORD PsLookupProcessByProcessId(HANDLE ProcessId,PEPROCESS* pProcess); __declspec(dllimport) DWORD ZwOpenProcess(PHANDLE ProcessHandle,ULONG DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID Cid); __declspec(dllimport) DWORD ZwQueryInformationProcess(HANDLE ProcessHandle,PROCESSINFOCLASS ProcessInformationClass,PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength); __declspec(dllimport) BYTE *PsGetProcessPeb(PEPROCESS Process); #ifdef _WIN64 #define SHIM_OFFSET 0x2d8 #else #define SHIM_OFFSET 0x1e8 #endif STATIC_UNICODE_STRING(shimRegRoot,"\\REGISTRY\\MACHINE\\SOFTWARE\\shim"); WCHAR shimName[]=L"shimeng.dll"; WCHAR shimSection[]=L"\\knowndlls\\shimeng.dll"; STATIC_UNICODE_STRING(shimDllRegKey,"shimdll"); HANDLE hShimSection; #ifdef _WIN64 WCHAR shimSection32[]=L"\\knowndlls32\\shimeng.dll"; STATIC_UNICODE_STRING(shimDll32RegKey,"shimdll32"); HANDLE hShimSection32; #endif void processNotify(HANDLE parentId,HANDLE processId,BOOLEAN createFlag){ PVOID memAddress=0; SIZE_T memSize=sizeof(shimName); HANDLE hProcess; BYTE *pPeb; OBJECT_ATTRIBUTES objAttr; CLIENT_ID idClient; PEPROCESS pEProcess; DWORD ntStatus; KAPC_STATE kaps; if(createFlag){ RtlZeroMemory(&objAttr,sizeof(OBJECT_ATTRIBUTES)); idClient.UniqueProcess=processId; idClient.UniqueThread=0; if(ZwOpenProcess(&hProcess,PROCESS_DUP_HANDLE,&objAttr,&idClient)!=0){ return; } if(PsLookupProcessByProcessId(processId,&pEProcess)!=0){ return; } pPeb=PsGetProcessPeb(pEProcess); if(pPeb==0){ return; } ntStatus=ZwAllocateVirtualMemory(hProcess,&memAddress,0,&memSize,MEM_COMMIT,PAGE_READWRITE); if(ntStatus!=0){ return; } KeStackAttachProcess(pEProcess,&kaps); __try{ memcpy(memAddress,shimName,sizeof(shimName)); *(WCHAR**)(pPeb+SHIM_OFFSET)=memAddress; }__except(EXCEPTION_EXECUTE_HANDLER){ } KeUnstackDetachProcess(&kaps); } return; } void driverUnload(PDRIVER_OBJECT DriverObject){ PsSetCreateProcessNotifyRoutine(processNotify,TRUE); ZwClose(hShimSection); #ifdef _WIN64 ZwClose(hShimSection32); #endif #ifdef SHIM_DEBUG DbgPrint("shim injector: unloaded"); #endif return; } NTSTATUS mapShim(HANDLE *pSection,PUNICODE_STRING dllName,WCHAR *sectionName){ HANDLE hFile; OBJECT_ATTRIBUTES objAttr; IO_STATUS_BLOCK ioStatusBlock; UNICODE_STRING usFileName; DWORD ntStatus; HANDLE hRegKey; PKEY_VALUE_PARTIAL_INFORMATION regKeyInfo=0; DWORD regKeySize=sizeof(KEY_VALUE_PARTIAL_INFORMATION)+0x200; InitializeObjectAttributes(&objAttr,&shimRegRoot,0,0,0); ntStatus=ZwOpenKey(&hRegKey,KEY_QUERY_VALUE,&objAttr); if(ntStatus!=STATUS_SUCCESS){ return ntStatus; } regKeyInfo=(KEY_VALUE_PARTIAL_INFORMATION*)ExAllocatePoolWithTag(PagedPool,regKeySize,'SHIM'); if(regKeyInfo==0){ ZwClose(hRegKey); return ntStatus; } ntStatus=ZwQueryValueKey(hRegKey,dllName,KeyValuePartialInformation,regKeyInfo,regKeySize,®KeySize); ZwClose(hRegKey); if(ntStatus!=STATUS_SUCCESS){ ExFreePool(regKeyInfo); return ntStatus; } #ifdef SHIM_DEBUG DbgPrint("shim injector: shim %ls added",regKeyInfo->Data); #endif RtlInitUnicodeString(&usFileName,regKeyInfo->Data); InitializeObjectAttributes(&objAttr,&usFileName,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,0,0); ntStatus=ZwOpenFile(&hFile,FILE_GENERIC_EXECUTE,&objAttr,&ioStatusBlock,FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT); if(ntStatus!=STATUS_SUCCESS){ ExFreePool(regKeyInfo); return ntStatus; } RtlInitUnicodeString(&usFileName,sectionName); ntStatus=ZwCreateSection(pSection,SECTION_ALL_ACCESS,&objAttr,0,PAGE_EXECUTE,SEC_IMAGE,hFile); ZwClose(hFile); ExFreePool(regKeyInfo); return ntStatus; } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){ DWORD ntStatus; #ifdef SHIM_DEBUG DbgPrint("shim injector: loaded"); #endif ntStatus=mapShim(&hShimSection,&shimDllRegKey,shimSection); #ifdef _WIN64 if(ntStatus==STATUS_SUCCESS){ ntStatus=mapShim(&hShimSection32,&shimDll32RegKey,shimSection32); } #endif if(ntStatus==STATUS_SUCCESS){ ntStatus=PsSetCreateProcessNotifyRoutine(processNotify,FALSE); } if(ntStatus!=STATUS_SUCCESS){ ZwClose(hShimSection); #ifdef _WIN64 ZwClose(hShimSection32); #endif #ifdef SHIM_DEBUG DbgPrint("shim injector: unloaded (0x%x)",ntStatus); #endif } DriverObject->DriverUnload=driverUnload; return ntStatus;
ну правда не совсем то что я хотел .... либа у меня мапится по типу xLoadLibrary потом вшивается в прцесс а после она там запускается тее таким образом в процесс можно вшить любой базо-независимый код а ещо таков вопрос каким чудом смотреть адреса экспортируемых ф-ций либ в процессе с ядра?
tylerdurden <В peb писать можно уже на колбэке о создании процесса (который ставится PsSetCreateProcessNotifyRoutine).> Да ну !!! Неужели !!! Так вот. В момент срабатывания колбэка Peb ещё не сформирован. Посмотри сорцы PspCreateProcess. Во всяком случае у меня все попытки прочитать Peb из колбека оканчивались неудачей, потому как отладчик показывал, что память по PsGetProcessPeb вообще ещё не передана. В противном случае вылитаем в синий экран. во всяком случае вот сорец. Вытаскивал коммандную строку процесса Код (Text): NTSTATUS iniGetProcessCommandLine(HANDLE ProcessId, PWCHAR us) { PVOID peb = NULL; PVOID eprocess = NULL; NTSTATUS ns; PPROCESS_PARAMETERS pp = NULL; KAPC_STATE ApcState; __try{ if (KeGetCurrentIrql() > PASSIVE_LEVEL) return STATUS_UNSUCCESSFUL; if (osBuildNumber > 3790) return STATUS_UNSUCCESSFUL; ns = (*_PsLookupProcessByProcessId)(ProcessId,&eprocess); if (!NT_SUCCESS(ns)) return STATUS_UNSUCCESSFUL; if (osBuildNumber == 2195) peb = (PVOID)0x7ffdf000; if (osBuildNumber > 2195)(DWORD)peb = (* _PsGetProcessPeb)(eprocess); (*_KeStackAttachProcess)(eprocess, &ApcState); if (MmIsAddressValid(peb)) { (DWORD)pp = *(PDWORD)((DWORD)peb+0x10); if (MmIsAddressValid(pp)) { if (pp->CommandLine.Length < MAX_PATH*2)RtlCopyMemory(us,pp->CommandLine.Buffer,pp->CommandLine.Length); } }; (*_KeUnstackDetachProcess)(&ApcState); } __except(EXCEPTION_EXECUTE_HANDLER){return STATUS_UNSUCCESSFUL;}; return STATUS_SUCCESS; } Не думаю что он косячный. wworld <а ещо таков вопрос каким чудом смотреть адреса экспортируемых ф-ций либ в процессе с ядра?> Тем же самым чудом. Находить Peb, а в нём уже PLDR_DATA_TABLE_ENTRY на список Длл. Затем разбором PE вытаскивать функции. Только не забудь приаттачиться к процессу для начала, а при поиске функций в конкретном модуле залочить память в оперативке.
хм ... а если сделать вот так смотрим что на вернет ZwCreateProcess or ZwCreateProcessEx запоминаем хегл потом при создании потока ZwCreateThread мапим туда либу настраиваем в ней все что нам надо и делаем на нее переход? стоит ли так делать? ну ещо предварительно смотрим что за процесс создается есть просто идея таким образом систему защиты накатать от разной гадости. на диплом надо )))) а может ктото ещо сырцом поделится где реализована ф-ция получения адресса ф-ции по типу xGetProcAddress но с ядра тее по базе ДЛЛ файла нужного нам .... там нужно получать лиш ф-ции от kernel32 ntdll все остальное там динамически получается
k3internal Возьми и запусти мой код. Работает везде от хп32 до хп64 и висты П.С. Пеб сформирован на момент колбэка. Он не полностью заполнен, но он есть. Поэтому собственно я и делаю мэппинг в knowndlls, kernel32 иногда затирает это указатель указателем на оригинальную shimeng.dll