Сейчас на форуме: zds (+6 невидимых)

 [email protected] —› Программирование —› либа для сплайсинга в ядре
Посл.ответ Сообщение

Ранг: 4.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 декабря 2013 09:28
· Личное сообщение · #1

Всем привет

я у вас новенький прошу любить и жаловать

значит в юзер моде я юзаю libMinHook как готовое решение для сплайсинга она сама все делает и даже
фиксит адреса если перемещает команды в трамплин с относительной адресацией ниже пример как я её использую

мой вопрос таков а есть ли готовое решение наподобие libMinHook только для сплайсинга в ядре ?

спасибо

Code:
  1.  
  2. #include <boost/algorithm/string/regex.hpp>
  3. #include "minhook.h"
  4.  
  5. #if defined _M_X64
  6. #pragma comment(lib, "libMinHook.x64.lib")
  7. #elif defined _M_IX86
  8. #pragma comment(lib, "libMinHook.x86.lib")
  9. #endif
  10.  
  11. FILE *fout;
  12.  
  13. typedef NTSTATUS WINAPI NtDeviceIoControlFile_t(
  14.          _In_   HANDLE FileHandle,
  15.          _In_   HANDLE Event,
  16.          _In_   PVOID ApcRoutine,
  17.          _In_   PVOID ApcContext,
  18.          _Out_  PVOID IoStatusBlock,
  19.          _In_   ULONG IoControlCode,
  20.          _In_   PVOID InputBuffer,
  21.          _In_   ULONG InputBufferLength,
  22.          _Out_  PVOID OutputBuffer,
  23.          _In_   ULONG OutputBufferLength
  24.          );
  25.  
  26.  
  27. NtDeviceIoControlFile_t* fpNtDeviceIoControlFile;
  28.  
  29. #define AFD_RECV 0x12017
  30. #define AFD_SEND 0x1201f
  31.  
  32. #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
  33.  
  34. struct AFD_WSABUF
  35. {
  36.          DWORD len;
  37.          PCH buf;
  38. };
  39.  
  40. struct AFD_INFO
  41. {
  42.          AFD_WSABUF* BufferArray;
  43.          DWORD BufferCount;
  44.          DWORD AfdFlags;
  45.          DWORD TdiFlags;
  46. };
  47.  
  48. void WriteData(PCCH Buffer, DWORD Len)
  49. {
  50.          std::string str(Buffer, Len);
  51.          std::vector<std::string> scripts;
  52.          boost::regex regex("<script>[^<]+</script>");
  53.  
  54.          boost::find_all_regex(scripts, str, regex);
  55.  
  56.          if (!scripts.empty())
  57.          {
  58.                  for each(auto script in scripts)
  59.                  {
  60.                         fprintf(fout, "%s\n", script.c_str());
  61.                         fflush(fout);
  62.                  }
  63.          }
  64.  
  65. }
  66.  
  67. NTSTATUS WINAPI Hook_NtDeviceIoControlFile(
  68.          _In_   HANDLE FileHandle,
  69.          _In_   HANDLE Event,
  70.          _In_   PVOID ApcRoutine,
  71.          _In_   PVOID ApcContext,
  72.          _Out_  PVOID IoStatusBlock,
  73.          _In_   ULONG IoControlCode,
  74.          _In_   PVOID InputBuffer,
  75.          _In_   ULONG InputBufferLength,
  76.          _Out_  PVOID OutputBuffer,
  77.          _In_   ULONG OutputBufferLength
  78.          )
  79. {
  80.          if (IoControlCode == AFD_RECV) 
  81.          {
  82.                  AFD_INFO* AfdInfo = (AFD_INFO*)InputBuffer;
  83.                  __try
  84.                  {
  85.                         memset(AfdInfo->BufferArray->buf, 0, AfdInfo->BufferArray->len);
  86.                  }
  87.                  __except(EXCEPTION_EXECUTE_HANDLER)
  88.                  {
  89.                  }
  90.          }
  91.  
  92.          NTSTATUS Status = 
  93.          fpNtDeviceIoControlFile(
  94.                  FileHandle,
  95.                  Event,
  96.                  ApcRoutine,
  97.                  ApcContext,
  98.                  IoStatusBlock,
  99.                  IoControlCode,
  100.                  InputBuffer,
  101.                  InputBufferLength,
  102.                  OutputBuffer,
  103.                  OutputBufferLength
  104.                  );
  105.          
  106.          if (NT_SUCCESS(Status))
  107.          {
  108.                  if (IoControlCode == AFD_SEND || IoControlCode == AFD_RECV) 
  109.                  {
  110.                         AFD_INFO* AfdInfo = (AFD_INFO*)InputBuffer;
  111.                         PCCH Buffer = AfdInfo->BufferArray->buf;
  112.                         DWORD Len = AfdInfo->BufferArray->len;
  113.                         WriteData(Buffer, Len);
  114.                  }
  115.          }
  116.  
  117.          return Status;
  118. }
  119.  
  120. extern "C" __declspec(dllexport) void lock() {}
  121.  
  122. BOOL CALLBACK DllMain(HINSTANCE, DWORD res, LPVOID)
  123. {
  124.          if (DLL_PROCESS_ATTACH == res)
  125.          {
  126.                  fout = fopen("c:/garbage.txt", "a+");
  127.  
  128.                  MH_Initialize();
  129.  
  130.                  HMODULE mod = GetModuleHandle("ntdll");
  131.                  void * ptr = GetProcAddress(mod, "NtDeviceIoControlFile");
  132.                  MH_CreateHook(ptr, Hook_NtDeviceIoControlFile, 
  133.                         reinterpret_cast<void**>(&fpNtDeviceIoControlFile));
  134.  
  135.                  MH_EnableHook(ptr);
  136.  
  137.          }
  138.          return true;
  139. }
  140.  





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 декабря 2013 10:37
· Личное сообщение · #2

Забудь про сплайсинг в х64 ядре, там патчгард. Да и зачем там вообще сплайсинг понадобился?



Ранг: 4.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 декабря 2013 11:31 · Поправил: 87nd85
· Личное сообщение · #3

Archer пишет:
Забудь про сплайсинг в х64 ядре, там патчгард. Да и зачем там вообще сплайсинг понадобился?


просто у меня в юзермоде стоит хук на NtDeviceIoControlFile который ловит AFD_SEND и AFD_RECV для одной программки

в коде берется первый буфер и его длинна хотя предположительно их может быть несколько

Code:
  1. PCCH Buffer = AfdInfo->BufferArray->buf;
  2. DWORD Len = AfdInfo->BufferArray->len;


хотел хукнуть в драйвере дабы посмотреть в рамках всей системы передается ли несколько буферов и где указывается размер сколько реально вернулось байт для каждого буфера... вот не понятно как узнать размер для AFD_RECV ? ведь как я понимаю там указан размер отданных для заполнения буферов а как узнать размер реально отданных байт для каждого буфера ? сейчас в коде что я привел в первом посте для AFD_RECV перед передачей вызова системе я просто обнуляю буфер и то это срабатывает только потому что я логирую некий текст... а если к примеру бинарные данные то где указано сколько вернулось ? или этот параметр len в структуре он in/out ? тоесть на выходе содержит сколько байт вернулось реально ?

да и вообще в личных целях обучения у меня ось 32 битная иногда хочется что нить хукнуть в ядре посмотреть в рамках всей системы за чем то... хотелось бы аналог libminhook для простого сплайсинга только в ядре




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 12 декабря 2013 11:34
· Личное сообщение · #4

На x86 он тоже не нужен, сст же массив векторов. Хотя их модификация тоже патч, они в кодосекции, а значит вредоносно.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 декабря 2013 11:59
· Личное сообщение · #5

Если это делать нормально, делай драйвер-фильтр. Если на 1 раз на х86 и только посмотреть, патчи сдт. Про параметры-мсдн в зубы. Никакой сплайсинг в ядре тут не нужен.

| Сообщение посчитали полезным: ajax

Ранг: 4.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 декабря 2013 13:04 · Поправил: 87nd85
· Личное сообщение · #6

я вас понял

но мне все равно хочется иметь инструмент для сплайсинга в ядре наподобие libminhook есть такой на примете ?

можно попробовать libminhook для ядра переточить благо опен сорс либа...




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 13 декабря 2013 01:32
· Личное сообщение · #7

87nd85

Можите пример привести зачем что то сплайсить ?



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 13 декабря 2013 01:55
· Личное сообщение · #8

87nd85 пишет: есть такой на примете
Как вариант EasyHook
Code:
  1. EasyHook starts where Microsoft Detours ends.
  2. This project supports extending (hooking) unmanaged code (APIs) with pure managed ones, from within a fully managed environment like C# using Windows 2000 SP4 and later, including Windows XP x64, Windows Vista x64 and Windows Server 2008 x64. Also 32- and 64-bit kernel mode hooking is supported as well as an unmanaged user-mode API which allows you to hook targets without requiring a NET Framework on the customers PC. An experimental stealth injection hides hooking from most of the current AV software.





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 13 декабря 2013 02:10
· Личное сообщение · #9

Code:
  1.     mov dword ptr [esp],     0448BD3FFh        ; call ebx [VirtualFree()]
  2.     mov dword ptr [esp + 4], 05C8B0C24h        ; mov eax, [esp + 12]
  3.     mov dword ptr [esp + 8], 0E3FF1024h        ; mov ebx, [esp + 16]
  4.                                             ; jmp ebx [exit thread]
  5.     
  6. ; save params for VirtualFree(Inject->RemoteEntryPoint, 0, MEM_RELEASE);
  7.     mov ebx, [esi + 64] ; VirtualFree()


На говнокод смахивает..



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 13 декабря 2013 02:18
· Личное сообщение · #10

Dr0p пишет: На говнокод смахивает..
Чел спрашивал ( если достаточно развита телепатия ) библиотеку для перехватов, но замкнуло на сплайсинге, качество это уже второе, работает и хрен с ней, да и аверы
[url=https://www.virustotal.com/ru/file/5687f14a793392c07bdabea77190f0d66726ac1546a3f1b3d0f60946b97ff818/analysis/1386886212/
]--> Link <--[/url] для нужд ТС сойдет, учитывая упоминание minhook.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 13 декабря 2013 02:39 · Поправил: Dr0p
· Личное сообщение · #11

F_a_u_s_t

--> Link <--

Оно если и работает, то с огромной вероятностью крэша - код тупо перетирается без поправок контекста. Если поток свопнулся то получится синька. А это будет по любому в активном коде. Для такой модификации нужно останавливать ось. Блокировать шедулер не поможет.




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 13 декабря 2013 03:54
· Личное сообщение · #12

Автор до сих пор внятно не объяснил, зачем ему сплайсинг. Толку что-то советовать?



Ранг: 4.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 декабря 2013 04:01
· Личное сообщение · #13

Dr0p пишет:
Можите пример привести зачем что то сплайсить ?


да просто иногда интересно что то похукать посмотреть... в данном случае хотел похукать NtDeviceIoControlFile для исследования её работы на предмет перехвата AFD_SEND AFD_RECV запросов



Ранг: 4.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 декабря 2013 04:07
· Личное сообщение · #14

F_a_u_s_t пишет:
Как вариант EasyHook


завтра попробую её заюзать для сплайсинга в ядре




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 13 декабря 2013 04:25
· Личное сообщение · #15

87nd85

Все сервисы(Nt-апи) описаны в 2-х массивах. Модифицируется ссылка там. Зачем их патчить.

Впрочем я ваши извращенья давно хорошо знаю по лабу




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 13 декабря 2013 17:01
· Личное сообщение · #16

Системный программист, мальчик молодой, Все хотят засплайсить код с тобой. Ах, если бы ты знал женскую тоску По хуку твоему..

| Сообщение посчитали полезным: Dr0p, dant3, Dynamic, [wl], Veliant, Alinator3500, Kindly, sivorog, MickeyBlueEyes, egyp7

Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 13 декабря 2013 22:55
· Личное сообщение · #17

Dr0p пишет: Оно если и работает, то с огромной вероятностью крэша
Возможно недавняя бага или качал библиотеку от другого разработчика, ветка не одна.
В любом случае извращенцу ТС, проще будет пофиксить багу чем писать с нуля.
87nd85 пишет: есть ли готовое решение наподобие libMinHook
Собственно ответ, а остальное уже проблемы ТС.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 14 декабря 2013 03:02
· Личное сообщение · #18

F_a_u_s_t

Какая есчо бага, там мусора куча, сделанного по тому же принципу:

--> Link <--



Ранг: 4.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 декабря 2013 11:30 · Поправил: 87nd85
· Личное сообщение · #19

да ладно вам... вот когда я стану (если стану) таким же матерым как и вы у меня тоже взгляды и интересы поменяются а сейчас мне по большому счету пофиг правильно ли я хукаю или нет мне главное сделать хук и наблюдать передаваемые параметры )

да и вообще я могу быть как ужасным занудой и педантом так и раздолбаем так что я не придаю особого значения правильности технологии мне важнее цель в данный момент ;))




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 15 декабря 2013 03:10 · Поправил: Dr0p
· Личное сообщение · #20

87nd85

Ну так чтобы сделать, надо начать.

Во первых понадобится процессы и потоки енумить. Нужно найти PsGetNextProcess() и PsGetNextProcessThread(). Хотя возможно сгодится SystemProcessInformation, но не уверен, там проблемы могут быть типо дедлоков.

Нужно на время модификации все процессоры остановить. KeFreezeExecution/KeThawExecution().

1. Описываем страницу через мдл и мапим. Либо сбрасываем WP.
2. Останавливаем ось. KeFreezeExecution().
3. Енумим все потоки(PsGetNextProcessThread()), проверяем вхождение Ip каждого потока в модифицируемый код. Если входит, то поточная маршрутизация - фиксим Ip на буфер.
4. Патчим код.
5. KeThawExecution().

Но сразу скажу что мне эта затея не нравится, впрочем как и метод выше. Хотя бы просто потому, что осевой код налету так просто не изменить. Придётся брать костыли.



Ранг: 23.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 мая 2014 03:06 · Поправил: TheNozza
· Личное сообщение · #21

На говнокод смахивает..
Шутишь, тут в топике вообще нормального кода нет)))
fout = fopen("c:/garbage.txt", "a+");
Таким почерком обладают школьники и студенты младших курсов, которым ещё не поставили кодстайл.
В промышленном коде на первом ревью такие выходки забанят))))



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 01 мая 2014 07:03
· Личное сообщение · #22

Кто этого наркомана из бана выпустил?

| Сообщение посчитали полезным: SReg

Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 01 мая 2014 07:55
· Личное сообщение · #23

TryAga1n прошло 4.5 месяца.. со времен последнего поста.. состав видимо был знатный.. раз так долго держал...

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 01 мая 2014 09:28
· Личное сообщение · #24

Закрыт старый топик.


 [email protected] —› Программирование —› либа для сплайсинга в ядре
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати