Функция, которая прячет DLL от impRec с помощью PEB [delphi]

Тема в разделе "WASM.BEGINNERS", создана пользователем memory, 27 дек 2011.

  1. memory

    memory New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    5
    Привет!
    Посоветовали спросить тут. Спрашиваю.)
    Суть вот в чём пишу програмку способную впихивать длл в чужое АП, хочу прикрутить возможность скрытия внедренной длл от impRec. Я так понял, достаточно "пофиксить" PEB целевога процесса, и impRec идет лесом.
    Тестил пример на асме от ms rem
    Код (Text):
    1. http://wasm.ru/pub/21/files/fwb/dllinject.rar
    При попытке получить длл-ки из Ослика, пропатченого ms_rem-овым методом, impRec закрывается, даже не предложив отправить отчёт дядьке Билу.. дальше лезть не стал так как и такой результат устраивает, но вот програмка моя на дельфях, и как реализовать даную фичу в дельфи ума не приложу просто. пробовал гуглить, но ничего толкового не нашол.. Нет-нет, на си и асме пруд пруди такого а вот дельфи(

    вобщем нужна функция прототип которой:
    Код (Text):
    1. //функции передаем две переменные: pid - pid процесса, _dllname - путь к dll которую мы подгружаем в целевой процесс и прячем её от impRec
    2.  
    3. function HideDllFromImpRec(pid:cardinal, _dllname:string)
    4. var
    5. //наши переменные
    6. begin
    7. //тут код который подгружает в целевой процесс с заданым pid нашу dll, (это мы и сами умеем :-) )
    8. //фиксит Peb -> LoaderData -> InLoadOrderModuleList ,
    9. //слинковывает соседние указатели в InLoadOrderModuleList,
    10. //impRec ничего не замечает :)
    11. end.
    както-так.
     
  2. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    по выдергиванию с PEB функционал лучше в саму длл всунуть, т.к. придется немало делать всяких ReadProcessMemory() WriteProcessMemory() и что самое не хорошое - не сможем захватить критическую секцию лодера.
    = или инжектим код который там все дело сделает или функционал в длл пихаем.
    хотя можно и удаленно все сделать, но "ровней" полюбому с ап таргет процесса
     
  3. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
    http://www.wasm.ru/print.php?article=wayround
     
  4. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Код (Text):
    1. procedure DeleteListEntry(ListEntry: DWORD); stdcall;
    2. asm
    3.   MOV EAX, ListEntry
    4.   MOV EAX, DWORD PTR [EAX+4]
    5.   MOV ECX, DWORD PTR [EAX]     // FLINK
    6.   MOV ECX, DWORD PTR [ECX]
    7.   MOV DWORD PTR [EAX], ECX
    8.   MOV ECX, DWORD PTR [EAX+4]   // BLINK
    9.   MOV ECX, DWORD PTR [ECX+4]
    10.   MOV DWORD PTR [EAX+4], ECX
    11. end;
    12.  
    13. procedure HideModule(ModInstance: HMODULE); stdcall;
    14. var
    15.  pfirstmod: DWORD;
    16. asm
    17.   MOV EAX, FS:[30h]
    18.   MOV EAX, DWORD PTR [EAX+0Ch]
    19.   MOV EAX, DWORD PTR [EAX+0Ch]
    20.   MOV pfirstmod, EAX
    21. @continue:
    22.   MOV ECX, DWORD PTR [EAX+018h]
    23.   CMP ECX, ModInstance
    24.   JE @Found
    25.   MOV EAX, DWORD PTR [EAX]
    26.   CMP EAX, pfirstmod
    27.   JNE @continue
    28.   RET
    29. @Found: // удаляем элемент из Ldr.InLoadOrderModuleList
    30.   PUSH EAX
    31.   CALL DeleteListEntry
    32.   ADD EAX, 8
    33.   PUSH EAX
    34.   CALL DeleteListEntry
    35. end;
    Вызываться должно из АП процесса, в котором скрывается модуль.
     
  5. memory

    memory New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    5
    тема для размышления, спасибо.
    спасибо, прояснилось несколько недопонятых ранее моментов.
    К10, практически то, что я хотел узреть) спасибо огромное за код, отпишу завтра что получилось.
     
  6. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    K10
    LDRP_COR_OWNS_UNMAP | LDRP_DONT_CALL_FOR_THREADS; LdrUnloadDll()/FreeLibrary().
     
  7. memory

    memory New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    5
    K10, я так понял, что тут мы передаем процедуре хендл нашей длл, которую скрываем
    Код (Text):
    1. procedure HideModule(ModInstance: HMODULE);
    я это реализовал так:
    Код (Text):
    1. var
    2.   _dllPath:string; // это имя моей длл(например '123.dll'),
    3.   _h:HMODULE;  //контеинер для хендла длл, он(хендл) мне еще потом нужен будет
    4.    
    5. begin
    6.    _dllPath := dllname; //dllname - глобальная, содержит имя фаила заранее выбраной дллки
    7.    _h:=GetModuleHandle(strtoPchar(_dllPath)); //нахожу хендл своей длл с помощью GetModuleHandle()
    8.     HideModule(_h); //передаю найденый хендл процедуре: 'procedure HideModule(ModInstance: HMODULE)'
    9. end;
    ошибок никаких не возникает, длл загружена в АП моего процесса, смотрю cписок загруженых модулей в
    impRec - всеравно видит мою длл.

    ничего не скрылось, где грабли?

    или мб другую апи нужно заюзать для получения хендла длл??* ну например GetModuleHandleEX?
     
  8. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    memory
    Хендл длл находится в переменной hInstance, или если без RTL, то передается в функцию DllMain.

    Я хз как перечисляет модули именно ImpRec, лень разбираться, Process Explorer ее не показывает.
     
  9. memory

    memory New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    5
    Скачал Process Explorer дабы проверить, в нем тоже показывает, ошибка гдето в коде..
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Process Explorer+ посмотри http://exelab.ru/f/index.php?action=vthread&forum=3&topic=13876 дров в плагине не юзается но в нем покажет в любом случае :))) из пеба не скроешь ничего, да и нельзя скрыть ничего в р3
    А так для баловства можно юзать вот такой код, на входе база модуля, типа как тут некоторые считают "хендл":
    Код (Text):
    1. #define UNLINK(x) (x).Blink->Flink = (x).Flink; (x).Flink->Blink = (x).Blink;
    2. #define PUNLINK(x) ((x)->Blink)->Flink = (x)->Flink; ((x)->Flink)->Blink = (x)->Blink;
    3. bool __fastcall MaskDll(HMODULE hMod)
    4. {
    5.  
    6.     PPEB_LDR_DATA LdrData;
    7.            PLDR_DATA_TABLE_ENTRY LdrModule;
    8.            PLDR_DATA_TABLE_ENTRY LdrModule_P;
    9.     _asm
    10.     {
    11.         mov eax, fs:[0x18]  // TEB (or NtCurrentTeb)
    12.         mov eax, [eax + 0x30]   // PEB
    13.         mov eax, [eax + 0x0C]   // PEB_LDR_DATA
    14.         mov LdrData, eax
    15.     }
    16.     LdrData->Length=0;
    17.     while(!LdrData->Initialized) NtYieldExecution(); //add in future lockloaderlock
    18.     PLIST_ENTRY head=&LdrData->InLoadOrderModuleList;
    19.     PLIST_ENTRY entry=head->Flink;
    20.            LdrModule =(LDR_DATA_TABLE_ENTRY *)entry;
    21.     //Get process module information
    22.     LdrModule_P=CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY,InLoadOrderModuleList);
    23.           entry = entry->Flink;
    24.           while(entry != head)
    25.           {
    26.       LdrModule =CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY,InLoadOrderModuleList);
    27.     if(LdrModule->BaseAddress == hMod)
    28.     {
    29.      RtlZeroMemory(LdrModule->FullDllName.Buffer,LdrModule->FullDllName.Length);
    30.      PUNLINK(entry);
    31.      UNLINK(LdrModule->HashTableEntry);
    32.      UNLINK(LdrModule->InLoadOrderModuleList);
    33.      UNLINK(LdrModule->InInitializationOrderModuleList);
    34.      LdrModule->TimeDateStamp=0;
    35.      LdrModule->SizeOfImage=0;
    36.      LdrModule->CheckSum=0;
    37.      LdrModule->BaseAddress=0;
    38.      return true;
    39.     }
    40.     entry = entry->Flink;
    41.           }
    42.           return false;
    43. }
     
  11. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    RET
    Позволю себе не согласиться. Данные можно по разному интерпретировать, даже одни и теже. Вот например есть смещение Ip. Для одного потока будет адрес 0:Ip, для другого к примеру Ds:Ip, тоесть в простейшем случае одно и тоже значение по разному интерпретируется. Такое не только к ссылкам относится, но и к механизмам также. Ктото считает одни данные, мы прочитаем совершенно иные, изменив механизм чтения, например изменим часть загрузчика.

    Зачем, если можно естественным путём удалить запись ?
     
  12. memory

    memory New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    5
    RET
    нету компилятора сишного у меня, можеш залить куданить скомпилированую, пожалуйста, а еще, я не от процес експлорера скрываюсь а от impRec)
    kejcerfcrv,
    это как?)


    И вообще, возможно ли перехватить апи с помощью которых юсермод-приложения получают список загруженых библиотек(они же их через апи получают я так понимаю?), и скрыть присутствие своей длл таким образом? И как это можно(лучше) реализовать на практике если такое вообще возможно? А, и как это повлияет на работу моей длл??
     
  13. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    memory
    Как обычно.
     
  14. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    memory
    могу ЛС для этого
    kejcerfcrv
    Вариантов много, один из них: RtlQueryProcessDebugInformation + PDI_MODULES (она кстати из пеб читает) сравниваем с NtQueryVirtualMemory, если не совпадает то стелс и берем правду из последней, у рихтера есть все это, русинович после ProcessExplorer+ нашего написал отдельную приблуду отдельную VMMAP, курим информацию в абауте последней

    я и говорил баловство тот код что дал

    memory
    Я и говорю в ЛС пишите, там договоримся :))
     
  15. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    RET
    Да вы товарищ бредите. Вы не знаете даже апи для выгрузки модуля ??
     
  16. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    kejcerfcrv
    я бухаю, но не брежу. Но в любом случае ничего личного.
    Причем выгрузка модуля и апи? я про натив писал апи,.тут тема не та, WASM.BEGINNERS - какой им на загрузчик.....пусть хоть натив знают
    ADD: а если по теме достаточно хукнуть либой через окошки ImpReс, заинлайнить типа, и нифига он не увидит. Да и вообще тут не то что на руткитсах, а наоборот :)