Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Вопрос по перехвату API
Посл.ответ Сообщение

Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 22 декабря 2008 23:57
· Личное сообщение · #1

Всем привет...

Есть прекрасные статьи MSRem'а по перехвату. У меня вопрос по 3 части:
www.wasm.ru/article.php?article=apihook_3

В прилагающихся файлах есть "Номера всех системных вызовов Windows 2000/XP": www.wasm.ru/pub/21/files/sysservice.rar
Так вот вопрос: Как определить Serivce ID для неизвестной функции или функции в Vista?



Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 декабря 2008 00:09
· Личное сообщение · #2

Гугл форева: www.metasploit.com/users/opcode/syscalls.html

Однако как определить значение для неизвестной функи...непонятно...




Ранг: 116.9 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 23 декабря 2008 00:11 · Поправил: Viktoro
· Личное сообщение · #3

вот таблица... виста присутствует
www.metasploit.com/users/opcode/syscalls.html

определять например так:
moyix.blogspot.com/2008/08/auditing-system-call-table.html

-----
Nothing just happens. You choose it to happen.





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 23 декабря 2008 00:21 · Поправил: coderess
· Личное сообщение · #4

Дизассемблируя kernel32.dll и ntdll.dll, в кернел содердаться WinAPI функции, которые ведут к ntdll.dll,
гуляешь по отладчику и получаешь, пример ниже:


ZwQueryInformationProcess:
Code:
  1. 7C913921    8D45 FC         LEA     EAX, DWORD PTR SS:[EBP-4]
  2. 7C913924    50              PUSH    EAX                    ;hProcess = FFFFFFFF
  3. 7C913925    6A 24           PUSH    24                         ;InfoClass = 24 (36.)
  4. 7C913927    6A FF           PUSH    -1                         ;Buffer = 0006F1B4
  5. 7C913929    E8 EDA6FFFF     CALL    ntdll.ZwQueryInformationProcess     ;pReqsize = NULL


После входа по (F7)
Code:
  1. 7C90E01B >  B8 9A000000     MOV     EAX, 9A                    ; номер сервиса
  2. 7C90E020    BA 0003FE7F     MOV     EDX, 7FFE0300            ; адрес шлюза KiFastSystemCall 7FFE0300
  3. 7C90E025    FF12            CALL    DWORD PTR DS:[EDX]                        ; вызов ntdll.KiFastSystemCall
  4. 7C90E027    C2 1400         RETN    14       

вызывая:
Code:
  1. CALL    DWORD PTR DS:[EDX]


мы переходим к SYSENTER (для Windows XP) в Windows 2000, int 2eh
Code:
  1. 7C90EB8B >  8BD4            MOV     EDX, ESP ;Перед вызовом SYSENTER, EDX=ESP
  2. 7C90EB8D    0F34            SYSENTER                 ;вызываем SYSENTER
  3. 7C90EB8F    90              NOP
  4. 7C90EB90    90              NOP
  5. 7C90EB91    90              NOP
  6. 7C90EB92    90              NOP
  7. 7C90EB93    90              NOP
  8. 7C90EB94 >  C3              RETN



Несколько замечаний: В сайсе есть такая команда как ntcall, с помощью нее можно просматривать номера
системных вызовов и второе точно не помню на каком то из сервис паков используется

Code:
  1. CALL  EDX вместо CALL    DWORD PTR DS:[EDX]


-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 декабря 2008 10:14
· Личное сообщение · #5

Всем спасибо, очень помогли.

Появился еще вопрос, драйвер пытаюсь написать первый раз, т.ч. не обессудьте...
Как вызвать beep (или написать "свой низкоуровневый" beep)? Может у кого код завалялся?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 23 декабря 2008 11:26
· Личное сообщение · #6

wasm.ru/article.php?article=drvw2k03

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 декабря 2008 21:27
· Личное сообщение · #7

Всем ОГРОМНОЕ СПАСИБО за помощь...



Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 27 декабря 2008 09:04 · Поправил: NeoTall
· Личное сообщение · #8

Всем привет...

Появился такой вопрос.
Как унифицировать работу драйвера в системах NT/2k/XP/2k3/Vista?

В аттаче, рабочий (в WinXP) пример от MSRem'а (бинарники, сурсы и утилита загрузки - 28кБ). Однако, как оказалось, он не загружается в Win2k3 (и думаю в Vista тоже). Кто может подсказать, в чем ошибка?

З.Ы. Пересобирал исходники с помощью Win2k3 DDK (3790.1830) как с настройками "FRE WNET", так и с настройками "FRE WXP"...результат один.

Ну, и вопрос на будущее (пока не к спеху):
Будет ли этот драйвер работать в 64битной системе? Или же его надо пересобирать с "FRE 64"?

Заранее Спасибо... С Наступающими, Всех, Праздниками!!!

86dd_27.12.2008_CRACKLAB.rU.tgz - drivers_in_win2003.7z



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

Создано: 27 декабря 2008 09:41
· Личное сообщение · #9

NeoTall пишет:
Будет ли этот драйвер работать в 64битной системе? Или же его надо пересобирать с "FRE 64"?

конечно пересобирать. и возможно даже код придется чуть поправить (особенно если asm используется)

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 27 декабря 2008 09:45
· Личное сообщение · #10

Ну, это я предполагал, но мне пока это не так важно. Больше интересует первый вопрос. Спасибо.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 27 декабря 2008 11:25
· Личное сообщение · #11

В аттаче, рабочий (в WinXP) пример от MSRem'а (бинарники, сурсы и утилита загрузки - 28кБ). Однако, как оказалось, он не загружается в Win2k3 (и думаю в Vista тоже). Кто может подсказать, в чем ошибка?

в Windows Vista введена цифровая подпись на драйверах
windowshelp.microsoft.com/Windows/ru-RU/help/5622d7d6-531b-4e76-be48-0059d38339c41049.mspx

Руководство по подписи драйверов oszone.net/4846_2

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 27 декабря 2008 14:46 · Поправил: SLV
· Личное сообщение · #12

эцп в 64битной висте. ответ почему не работает на других осях прямо в DriverEntry написан.

-----
Shalom ebanats!




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 28 декабря 2008 10:58
· Личное сообщение · #13

2 coderess
С вистой понятно, а как быть с Windows 2003 Server?

2 SLV
Я может и первый раз что-то с драйвером пытаюсь "замутить", но на такие грабли:
Code:
  1.          switch (*NtBuildNumber)
  2.     {
  3.         case 2195 :  //win 2k
  4.          OpenProcId = 0x06A;
  5.          break;
  6.         
  7.         case 2600 : //win xp
  8.          OpenProcId = 0x07A;
  9.          break;
  10.         
  11.         default :
  12.          return STATUS_NOT_IMPLEMENTED;
  13.          break;
  14.     }

не наступлю.
Добавление:
Code:
  1.         case 3790 : //win 2003 server
  2.          OpenProcId = 0x080;
  3.          break;
  4.         
  5.         case 6000 : //win vista
  6.          OpenProcId = 0x0BF;
  7.          break;
  8.         
  9.         case 6001 : //win vista
  10.          OpenProcId = 0x0BF;
  11.          break;
  12.         
  13.         case 6002 : //win vista
  14.          OpenProcId = 0x0BF;
  15.          break;

никак не помогает. Я же четко написал "...он не загружается в Win2k3", а не "не работает"... Вот в чем вопрос!!!




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 29 декабря 2008 00:12 · Поправил: coderess
· Личное сообщение · #14

Грабли используют:

wasm.ru/forum/viewtopic.php?id=30413

С Windows 2003 Server не сталкивался, и если уже говорить
то весь код приводить нужно, а не отдельные куски...

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 29 декабря 2008 08:20
· Личное сообщение · #15

2 coderess
И что я должен вынести из этого топика? Я его уже читал.
Насчет полного кода DriverEntry он есть в аттаче.

Как оказалось, даже такой драйвер:
Code:
  1. #include <ntddk.h>
  2. #define DEBUG
  3. /*
  4. Создаем макрос для вывода отладочных сообщений 
  5. в случае компиляции с директивой DEBUG
  6. */
  7. #ifdef DEBUG
  8.   #define DPRINT DbgPrint
  9. #else
  10.   #define DPRINT
  11. #endif
  12. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
  13. {
  14.          DPRINT("Driver unloaded");
  15.          return;
  16. }
  17. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
  18.                      IN PUNICODE_STRING RegistryPath)
  19. {
  20.          DPRINT("Driver loaded");
  21.   DriverObject->DriverUnload = DriverUnload;
  22.     return STATUS_SUCCESS;
  23. }

не загружается в Windows 2003 Server... Сборку делал как для WXP, так и для WNET.

Будут ли еще какие-нибудь предложения?



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 31 декабря 2008 17:37
· Личное сообщение · #16

может сертификат нужно чтобы заработал твой драйвер?



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 31 декабря 2008 19:30
· Личное сообщение · #17

я не ставил Win2k3, но мож попробовать - у Уолтера Они видел

extern "C" NTSTATUS ...



Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 03 января 2009 16:14
· Личное сообщение · #18

Все оказалось гораздо проще. Криво происходила загрузка через ZwLoadDiver.

Но появился такой вопрос:
Как винда программно отключает винт? Что надо хукать чтобы предотвратить это?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 03 января 2009 17:21
· Личное сообщение · #19

Как винда программно отключает винт?

автоматическое отключение дисков при простое

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 03 января 2009 18:32
· Личное сообщение · #20

2 coderess
Пошутил, да? Я оценил и улыбнулся. Зачем флудить то и меня на это вынуждать?

Хорошо, задам вопрос по другому:
Используя какие API, винда программно выключает винт при простое?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 03 января 2009 19:41 · Поправил: coderess
· Личное сообщение · #21

www.wasm.ru/article.php?article=atazen01

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 03 января 2009 20:15 · Поправил: HiEndsoft
· Личное сообщение · #22

NeoTall пишет:
Используя какие API, винда программно выключает винт при простое?

Можно было бы и самому DeviceIOControl поперехватывать и посмотреть....
Вот код на Си (писал когда-то "убивалку" винта в цикле "пуск"-"стоп" шпинделя):
Code:
  1. ............................
  2. ............................
  3. ............................
  4. char ou[0x0С];
  5. memset(ou, 0,sizeof(ou));
  6. ou[6]=0xe0;
  7. DeviceIoControl(hSMARTIOCTL,IOCTL_IDE_PASS_THROUGH,(LPVOID) ou, 0x0c,(LPVOID) iu,sizeof(iu),&BytesReturned,NULL);


-----
продавец резиновых утёнков




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 04 января 2009 14:26
· Личное сообщение · #23

Благодарю всех за помощь...однако пока не все как оказалось.

2 HiEndsoft
А почему Вы используете ou[6]=0xe0;? В статье, которую посоветовал coderess, указано другое значение:
Code:
  1. Ну и наконец - команда остановки винчестера. Все абсолютно аналогично предыдущему пункту, только код - <b>E6h</b>, и никаких данных принимать не надо, сразу после посылки в 1F7h байта <b>E6h</b> веник отправляется смотреть сладкие сны ( процесс осановки будет слышно). Будить его лучше всего сбросом (установкой бита 2 в 3F6h).

Да, и в подтверждение этого, скомпилив Ваш код с ou[6]=0xe0; остановки не получилось, а вот с ou[6]=0xe6;, все прошло успешно, диск остановился. ...Да и в DDK:
Code:
  1. #define SCSIOP_DENON_EJECT_DISC    0xE6


Теперь как программно остановить диск стало ясно, отлично. Далее я сделал перехват NtDeviceIOControlFile фильтруя значение IOControlCode (на равенство IOCTL_IDE_PASS_THROUGH) и 6-ого байта InputBuffer (на равенство 0хЕ6). В результате получил вот что:
Если использовать Ваш, HiEndsoft, код (с правкой), то загруженный драйвер прекрасно справляется с задачей, перехватывает NtDeviceIOControlFile (вызов DeviceIOControl) и правильно обрабатывает данные, но если настроить систему питания на отключение дисков при простое, загрузить драйвер, и ждать, то диски как останавливались, так и останавливаются!!!

Помогите разобраться. В чем дело? Как блокировать отключение дисков системой при простое?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 04 января 2009 16:06
· Личное сообщение · #24

IOCTL_SCSI_PASS_THROUGH подходит как для IDE, так и для SCSI

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 04 января 2009 20:53
· Личное сообщение · #25

coderess пишет:

IOCTL_SCSI_PASS_THROUGH подходит как для IDE, так и для SCSI

Неа.
Вот кусок кода. Можете смеяться, в С я не очень шарю.
Code:
  1. NTSTATUS NewNtDeviceIoControlFile(
  2.          IN HANDLE FileHandle,
  3.          IN HANDLE Event OPTIONAL,
  4.          IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  5.          IN PVOID ApcContext OPTIONAL,
  6.          OUT PIO_STATUS_BLOCK IoStatusBlock,
  7.          IN ULONG IoControlCode,
  8.          IN PVOID InputBuffer OPTIONAL,
  9.          IN ULONG InputBufferLength,
  10.          OUT PVOID OutputBuffer OPTIONAL,
  11.          IN ULONG OutputBufferLength
  12.          )
  13. {
  14.   if ((IoControlCode == IOCTL_IDE_PASS_THROUGH) || 
  15.       (IoControlCode == IOCTL_ATA_PASS_THROUGH) || 
  16.       (IoControlCode == IOCTL_ATA_PASS_THROUGH_DIRECT) ||
  17.       (IoControlCode == IOCTL_SCSI_PASS_THROUGH))
  18.    {
  19.     BYTE *p;
  20.     p = InputBuffer;
  21.     DbgPrint("Hook works #1... /NtDeviceIoControlFile/");
  22.     if (p[6] == 0xE6)
  23.           {
  24.       DbgPrint("Hook works #2... /NtDeviceIoControlFile/");
  25.       return STATUS_SUCCESS;
  26.           }
  27.       else
  28.       {
  29.        return TrueNtDeviceIoControlFile(
  30.              FileHandle,
  31.              Event,
  32.              ApcRoutine,
  33.              ApcContext,
  34.              IoStatusBlock,
  35.              IoControlCode,
  36.              InputBuffer,
  37.              InputBufferLength,
  38.              OutputBuffer,
  39.              OutputBufferLength
  40.           );
  41.     }
  42.    }
  43.     else
  44.     {
  45.      return TrueNtDeviceIoControlFile(
  46.            FileHandle,
  47.            Event,
  48.            ApcRoutine,
  49.            ApcContext,
  50.            IoStatusBlock,
  51.            IoControlCode,
  52.            InputBuffer,
  53.            InputBufferLength,
  54.            OutputBuffer,
  55.            OutputBufferLength
  56.           );
  57.     }
  58. }

Обрабатываю все возможные варианты IOControl'а. Но системную остановку это не перехватавает. Что еще посоветуете? Могу выложить полный исходник драйвера, если надо...



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 04 января 2009 21:46 · Поправил: HiEndsoft
· Личное сообщение · #26

NeoTall пишет:
А почему Вы используете ou[6]=0xe0;?

--блин, реально очепятка
У меня работает: и SATA и IDE -тормозит с парковкой.
Вообще - вариантов помню несколько было...(в каких - то тулзах типа HDDScan сплайсил DeviceIoControl..)
Перед этим делаю IOCTL_SCSI_RESCAN_BUS.
Еще вариант:
Code:
  1. ou[0]=0x28; ou[2]=0x01; ou[12]=0x5;ou[20]=0x28; ou[37]=0xA0;
  2. ou[38]=0xe2; //<-OFF
  3. или
  4. ou[38]=0x10;//-<ON
  5. //соответственно с dwIoControlCode=<b>0x0004D028</b>

В те времена в наличии полного комплекта NTDDK не было, приходилось извращаться.

-----
продавец резиновых утёнков




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 07 января 2009 16:37
· Личное сообщение · #27

Привет...

Спасибо за подсказки.

Вот какой еще вопрос возник:
Какими API винда отключает систему, перезагружает ее или завершает сеанс?

Посмотрел драйвер HideToolz, там MsRem вроде перехватывает:
ZwSetSystemPowerState
ZwShutdownSystem
ZwRaiseHardError
ZwInitiatePowerAction
ExitWindowsEx

первые 4 я перехватываю, HookAnalyzer правильно определяет перехваченные функи, однако винда все равно перезагружает комп.

Посоветуйте, как блокировать перезагрузку компа?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 07 января 2009 17:00 · Поправил: coderess
· Личное сообщение · #28

Я завершал работу системы вызовом ZwShutdownSystem
с получением прав на перезагрузку SE_SHUTDOWN_PRIVILEGE
Вот пример
rootkits.ru/viewtopic.php?id=616


Также с помощью CsrClientCallServer можно, мини описание:
bugtraq.ru/library/internals/shut.html

bugtraq.ru/library/internals/.keep/shut.cpp.txt

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 07 января 2009 17:58
· Личное сообщение · #29

coderess
Спасибо. Попробую перехватить еще и CsrClientCallServer.


 eXeL@B —› Программирование —› Вопрос по перехвату API
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати