Привет! Посоветовали спросить тут. Спрашиваю.) Суть вот в чём пишу програмку способную впихивать длл в чужое АП, хочу прикрутить возможность скрытия внедренной длл от impRec. Я так понял, достаточно "пофиксить" PEB целевога процесса, и impRec идет лесом. Тестил пример на асме от ms rem Код (Text): http://wasm.ru/pub/21/files/fwb/dllinject.rar При попытке получить длл-ки из Ослика, пропатченого ms_rem-овым методом, impRec закрывается, даже не предложив отправить отчёт дядьке Билу.. дальше лезть не стал так как и такой результат устраивает, но вот програмка моя на дельфях, и как реализовать даную фичу в дельфи ума не приложу просто. пробовал гуглить, но ничего толкового не нашол.. Нет-нет, на си и асме пруд пруди такого а вот дельфи( вобщем нужна функция прототип которой: Код (Text): //функции передаем две переменные: pid - pid процесса, _dllname - путь к dll которую мы подгружаем в целевой процесс и прячем её от impRec function HideDllFromImpRec(pid:cardinal, _dllname:string) var //наши переменные begin //тут код который подгружает в целевой процесс с заданым pid нашу dll, (это мы и сами умеем :-) ) //фиксит Peb -> LoaderData -> InLoadOrderModuleList , //слинковывает соседние указатели в InLoadOrderModuleList, //impRec ничего не замечает :) end. както-так.
по выдергиванию с PEB функционал лучше в саму длл всунуть, т.к. придется немало делать всяких ReadProcessMemory() WriteProcessMemory() и что самое не хорошое - не сможем захватить критическую секцию лодера. = или инжектим код который там все дело сделает или функционал в длл пихаем. хотя можно и удаленно все сделать, но "ровней" полюбому с ап таргет процесса
Код (Text): procedure DeleteListEntry(ListEntry: DWORD); stdcall; asm MOV EAX, ListEntry MOV EAX, DWORD PTR [EAX+4] MOV ECX, DWORD PTR [EAX] // FLINK MOV ECX, DWORD PTR [ECX] MOV DWORD PTR [EAX], ECX MOV ECX, DWORD PTR [EAX+4] // BLINK MOV ECX, DWORD PTR [ECX+4] MOV DWORD PTR [EAX+4], ECX end; procedure HideModule(ModInstance: HMODULE); stdcall; var pfirstmod: DWORD; asm MOV EAX, FS:[30h] MOV EAX, DWORD PTR [EAX+0Ch] MOV EAX, DWORD PTR [EAX+0Ch] MOV pfirstmod, EAX @continue: MOV ECX, DWORD PTR [EAX+018h] CMP ECX, ModInstance JE @Found MOV EAX, DWORD PTR [EAX] CMP EAX, pfirstmod JNE @continue RET @Found: // удаляем элемент из Ldr.InLoadOrderModuleList PUSH EAX CALL DeleteListEntry ADD EAX, 8 PUSH EAX CALL DeleteListEntry end; Вызываться должно из АП процесса, в котором скрывается модуль.
тема для размышления, спасибо. спасибо, прояснилось несколько недопонятых ранее моментов. К10, практически то, что я хотел узреть) спасибо огромное за код, отпишу завтра что получилось.
K10, я так понял, что тут мы передаем процедуре хендл нашей длл, которую скрываем Код (Text): procedure HideModule(ModInstance: HMODULE); я это реализовал так: Код (Text): var _dllPath:string; // это имя моей длл(например '123.dll'), _h:HMODULE; //контеинер для хендла длл, он(хендл) мне еще потом нужен будет begin _dllPath := dllname; //dllname - глобальная, содержит имя фаила заранее выбраной дллки _h:=GetModuleHandle(strtoPchar(_dllPath)); //нахожу хендл своей длл с помощью GetModuleHandle() HideModule(_h); //передаю найденый хендл процедуре: 'procedure HideModule(ModInstance: HMODULE)' end; ошибок никаких не возникает, длл загружена в АП моего процесса, смотрю cписок загруженых модулей в impRec - всеравно видит мою длл. ничего не скрылось, где грабли? или мб другую апи нужно заюзать для получения хендла длл??* ну например GetModuleHandleEX?
memory Хендл длл находится в переменной hInstance, или если без RTL, то передается в функцию DllMain. Я хз как перечисляет модули именно ImpRec, лень разбираться, Process Explorer ее не показывает.
Process Explorer+ посмотри http://exelab.ru/f/index.php?action=vthread&forum=3&topic=13876 дров в плагине не юзается но в нем покажет в любом случае )) из пеба не скроешь ничего, да и нельзя скрыть ничего в р3 А так для баловства можно юзать вот такой код, на входе база модуля, типа как тут некоторые считают "хендл": Код (Text): #define UNLINK(x) (x).Blink->Flink = (x).Flink; (x).Flink->Blink = (x).Blink; #define PUNLINK(x) ((x)->Blink)->Flink = (x)->Flink; ((x)->Flink)->Blink = (x)->Blink; bool __fastcall MaskDll(HMODULE hMod) { PPEB_LDR_DATA LdrData; PLDR_DATA_TABLE_ENTRY LdrModule; PLDR_DATA_TABLE_ENTRY LdrModule_P; _asm { mov eax, fs:[0x18] // TEB (or NtCurrentTeb) mov eax, [eax + 0x30] // PEB mov eax, [eax + 0x0C] // PEB_LDR_DATA mov LdrData, eax } LdrData->Length=0; while(!LdrData->Initialized) NtYieldExecution(); //add in future lockloaderlock PLIST_ENTRY head=&LdrData->InLoadOrderModuleList; PLIST_ENTRY entry=head->Flink; LdrModule =(LDR_DATA_TABLE_ENTRY *)entry; //Get process module information LdrModule_P=CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY,InLoadOrderModuleList); entry = entry->Flink; while(entry != head) { LdrModule =CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY,InLoadOrderModuleList); if(LdrModule->BaseAddress == hMod) { RtlZeroMemory(LdrModule->FullDllName.Buffer,LdrModule->FullDllName.Length); PUNLINK(entry); UNLINK(LdrModule->HashTableEntry); UNLINK(LdrModule->InLoadOrderModuleList); UNLINK(LdrModule->InInitializationOrderModuleList); LdrModule->TimeDateStamp=0; LdrModule->SizeOfImage=0; LdrModule->CheckSum=0; LdrModule->BaseAddress=0; return true; } entry = entry->Flink; } return false; }
RET Позволю себе не согласиться. Данные можно по разному интерпретировать, даже одни и теже. Вот например есть смещение Ip. Для одного потока будет адрес 0:Ip, для другого к примеру Ds:Ip, тоесть в простейшем случае одно и тоже значение по разному интерпретируется. Такое не только к ссылкам относится, но и к механизмам также. Ктото считает одни данные, мы прочитаем совершенно иные, изменив механизм чтения, например изменим часть загрузчика. Зачем, если можно естественным путём удалить запись ?
RET нету компилятора сишного у меня, можеш залить куданить скомпилированую, пожалуйста, а еще, я не от процес експлорера скрываюсь а от impRec) kejcerfcrv, это как?) И вообще, возможно ли перехватить апи с помощью которых юсермод-приложения получают список загруженых библиотек(они же их через апи получают я так понимаю?), и скрыть присутствие своей длл таким образом? И как это можно(лучше) реализовать на практике если такое вообще возможно? А, и как это повлияет на работу моей длл??
memory могу ЛС для этого kejcerfcrv Вариантов много, один из них: RtlQueryProcessDebugInformation + PDI_MODULES (она кстати из пеб читает) сравниваем с NtQueryVirtualMemory, если не совпадает то стелс и берем правду из последней, у рихтера есть все это, русинович после ProcessExplorer+ нашего написал отдельную приблуду отдельную VMMAP, курим информацию в абауте последней я и говорил баловство тот код что дал memory Я и говорю в ЛС пишите, там договоримся )
kejcerfcrv я бухаю, но не брежу. Но в любом случае ничего личного. Причем выгрузка модуля и апи? я про натив писал апи,.тут тема не та, WASM.BEGINNERS - какой им на загрузчик.....пусть хоть натив знают ADD: а если по теме достаточно хукнуть либой через окошки ImpReс, заинлайнить типа, и нифига он не увидит. Да и вообще тут не то что на руткитсах, а наоборот