Ниже приведен код функции, которая внедряет dll-ку в требуемый процесс. Этот почему то не хочет работать с файлами, скомпилированными в Delphi7. Вылетает какая-то непонятная ошибка. Ссылка на пример: http://foldo.ru/42113ioq47/hookDelphi.rar.html В архиве лежит hooker.dll, main.exe и input.txt, необходимый для main. Код (Text): void CreateHookedProccess(LPCWSTR fileExePath,LPCWSTR dllPath) { PROCESS_INFORMATION info; STARTUPINFO startupInfo; startupInfo.cb=sizeof(startupInfo); RtlZeroMemory(&startupInfo,sizeof(startupInfo)); BOOL b=CreateProcessW(fileExePath,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&startupInfo,&info); int a = GetLastError(); LPWSTR pParam; int len=2*(wcslen(dllPath)+1); pParam=(LPWSTR)VirtualAllocEx(info.hProcess,NULL,len,MEM_COMMIT,PAGE_READWRITE); WriteProcessMemory(info.hProcess,pParam,dllPath,len,NULL); PTHREAD_START_ROUTINE startFunc = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandleW(L"kernel32.dll"),"LoadLibraryW"); HANDLE thread=CreateRemoteThread(info.hProcess,NULL,0,startFunc,pParam,0,NULL); WaitForSingleObject(thread,INFINITE); // тут исправь VirtualFreeEx(info.hProcess,pParam,0,MEM_RELEASE); ResumeThread(info.hThread); CloseHandle(thread); }
Манифест битый. (кстате всёравно не загрузится у меня, требует какието левые либы/рантайм от компилятора. отвратительно собранный модуль).
Codegrammer CreateProcess(CREATE_SUSPENDED) + CreateRemoteThread в общем случае не работает используйте QueueUserAPC или чтото другое вместо CreateRemoteThread
Так экзешник ведь запускается. Когда к нему погружаем dll, срабатывает DLLMain. Все фейлится после ResumeThread. Рихтер пишет именно о CreateRemoteThread. Тот ли это случай, что именно здесь не работает?
Codegrammer Кикие есчо длл. У меня на XP3 ничего не грузится. Я есчо подумал нафиг экзешник нужен был.. Сказано про длл.
Всмысле не грузится? Я только что скопировал вышеуказанный код. Все скомпилил. До CreateRemoteThread все норм. Я в эту длл-ку messageBox пихал в случае ее загрузки. Она грузилась нормально. В чем конкретно ошибка? Что означает не грузится?
void CreateHookedProccess(LPCWSTR fileExePath,LPCWSTR dllPath) - это нужно компилить. Вы видимо немного меня не поняли. Не работает CreatHookedProccess. И причем не пработает если ему подсовывать старые делфийские программы. В архиве я и скинул такую программу + длл-ку.
Codegrammer Я запускал в песочнице экзешник. Он в файл строку символов пишет, из его каталога длл не грузится, тоесть не используется. Тогда я подумал что нужно её загружать вручную. Вот при загрузке лодер возвращает ошибку. Если подробно, то она возникает следующем образом: LoadLibraryA -> LdrpWalkImportDescriptor -> LdrpManifestProberRoutine Последняя переменная содержит ссылку на kernel32!BasepProbeForDllManifest, это калбэк вызываемый нэйтивным лодером. Он ищет манифест в ресурсах. Собственно CreateActCtx() возвращает STATUS_SXS_CANT_GEN_ACTCTX так как манифест битый(не знаю что с ним), далее после возврата модуль анмапиться, загрузка прекращается. Если удалить манифест то всё отрабатывает норм, почти всё. В импорте MSVCR90D.dll, у меня этого модуля нет и на этом дальнейшая загрузка обламывается, тоесть модуль не работаспособный.
Clerk, спасибо за подробную информацию. Если можно, хотелось бы еще пару вопросов: 1)Что такое манифест pe-файла и где он находится? (Я слышал, что он есть .net сборках) 2)где можно взять песочницу? (насколько я понимаю, вещь достаточно полезная)
Если слетают стили изза манифеста, можно использовать это: Код (Text): ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID equ 1 ACTCTX_FLAG_LANGID_VALID equ 2 ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID equ 4 ACTCTX_FLAG_RESOURCE_NAME_VALID equ 8 ACTCTX_FLAG_SET_PROCESS_DEFAULT equ 10H ACTCTX_FLAG_APPLICATION_NAME_VALID equ 20H ACTCTX_FLAG_HMODULE_VALID equ 80H CREATEPROCESS_MANIFEST_RESOURCE_ID equ 1 ACTCTX struct ; 0x20 cbSize ULONG ? dwFlags DWORD ? lpSource PWSTR ? wProcessorArchitecture WORD ? wLangId WORD ? lpAssemblyDirectory PSTR ? lpResourceName PSTR ? lpApplicationName PSTR ? hModule HANDLE ? ACTCTX ends PACTCTX typedef ptr ACTCTX Local Context:ACTCTX Local CtxHandle:HANDLE Local Cookie:ULONG mov Context.cbSize,sizeof(ACTCTX) mov Context.dwFlags,ACTCTX_FLAG_HMODULE_VALID or ACTCTX_FLAG_RESOURCE_NAME_VALID mov Context.lpResourceName,CREATEPROCESS_MANIFEST_RESOURCE_ID mov Context.lpSource,offset $ExeName mov dword ptr [Context.wProcessorArchitecture],NULL mov Context.lpAssemblyDirectory,NULL mov Context.lpApplicationName,NULL ; DllHandle --> Context.hModule invoke CreateActCtxA, addr Context %APIERR mov CtxHandle,eax invoke ActivateActCtx, CtxHandle, addr Cookie ..