Сам себе Iczelion

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl_, 11 май 2007.

Метки:
  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Блин-комом номер шесть. Драйвер написан по мотивам UserPort.sys 1.1 by Tomas Franzon. Как завещал великий Dale Roberts корректируем указатель на карту ввода/вывода, который по умолчанию указывал за границу TSS, и устанавливаем начало IOPM на TSS+0x88. В отличии от UserPort.sys 1.0 драйвер поддерживает Hyper-Threading Technology ("UserPort 1.0 did not run stable on Hyperthreading machined (rebooted without bluescreen).")
    В аттаче драйвер, user-mode приложение, которое его запускает и исходники
    to be continued...
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Блин-комом номер семь. Вариация драйвера scp2, но получает адрес user-mode процедуры не через WriteFile "\\.\driver", а через DeviceIoControl. В аттаче драйвер, user-mode приложение, которое его запускает и исходники
    to be continued...
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    2All
    Можно ли в user-mode приложениях использовать IN, OUT если драйвером установить флажки IOPL равными 3? Ведь в "Instruction Set Reference" псевдокод команды IN, выглядит так:
    IF ((PE = 1) and ((CPL > IOPL) or (VM = 1)))
    THEN (* Protected mode with CPL > IOPL or virtual-8086 mode *)
    IF (Any I/O Permission Bit for I/O port being accessed = 1)
    THEN (* I/O operation is not allowed *)
    #GP(0);
    ELSE ( * I/O operation is allowed *)
    DEST ← SRC; (* Read from selected I/O port *)

    Если у кого-то есть удачный опыт поделитесь исходником... ;)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    Можно, это кстати шедулер поддерживает и инфокласс есть - ProcessUserModeIOPL для NtSetInformationProcess. Кстати при этом cli и sti инструкции робят.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Clerk
    Если можно ссылочку на код...
    А разве CLI и STI в user-mode нельзя через pushf /and dword ptr [esp],0FFFFFDFFh/popf ?
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Clerk
    спасибо за подсказку, нашел DirectIO.cpp !
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Semiono
    Держи свой x-eyes ;)
    [​IMG]
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Только если !CPL || (CPL <= IOPL).
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    для работы с портами ввода/вывода обходимся без драйвера. В аттаче исходник и user-mode приложение...
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Улучшаем DirectIO. В аттаче подправленный ехе и исходный текст...
    может быть есть еще какие-нибудь идеи о "ring0 access from ring3"?
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Два варианта доступа к In/Out через установку IOPL=3. Драйвер scp09 при открытии через CreateFile("\\.\scp09") получает адрес процесса из IoGetCurrentProcess. Драйвер scp10 идентификатор процесса ProcessId получает через DeviceIoControl или из реестра или через WriteFile("\\.\scp10"). В функцию PsLookupProcessByProcessId передаем ProcessId и получаем указатель на KPROCESS. Устанавливаем поле KPROCESS.Iopl равным TRUE, в user-mode приложении создаем и запускаем поток, содержащий команды In/Out. Огромное спасибо TSS за подсказку. В аттаче драйвера, user-mode приложения и исходники.
    to be continued...
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    Зачем, если есть текущий, трап-фрейм которого сформирован и его не нужно ждать ?
    Кстате при свопинге поле IOPL не используется, эти флаги загружаются при инициализации обьекта.
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Пока делаю обзор написанного....
    Доступ к командам In/Out через kernel-mode драйвера
    1) scp00 просто переделанный beeper. Содержит внутри outbs, синхронизация
    через KeStallExecutionProcessor. Вызывается из scp00-00. Неполнофункциональный
    драйвер
    2) scp01 передает управление на фрагмент кода из scp01-00 в котором содержится
    outsb, синхронизация через предварительный подсчет тиков. Адрес процедуры
    передается через DeviceIoControl. Полнофункциональный драйвер.
    3) scp02 написано на основе r0pc.sys by @L.chemist (Andrey A. Meshkov).
    передает управление на фрагмент кода из scp02-00 в котором содержится
    outsb, синхронизация через предварительный подсчет тиков. Адрес процедуры
    передается через WriteFile("\\.\scp02"). Полнофункциональный драйвер.
    4) scp03 передает управление на фрагмент кода из scp03-00 в котором содержится
    outsb, синхронизация через предварительный подсчет тиков. Адрес процедуры
    передается через реестр. Недописан...
    5) scp?? передает управление на фрагмент кода из scp??-00 в котором содержится
    outsb, синхронизация через предварительный подсчет тиков. Адрес процедуры
    подсчитан заранее и передан при создании sys. Недописан...

    Доступ к командам In/Out через изменение карты IOPM
    6) scp04 написано на основе giveio by Four-F открывает порты IOPM и использует
    Ke386SetIoAccessMap, Ke386QueryIoAccessMap, Ke386IoSetAccessProcess. ProcessId
    получает через реестр. Сочетание команд outsb и WinAPI функции Sleep.
    Неполнофункциональный драйвер.
    7) scp05 написано на основе драйвера режима ядра PortTalk 2.0 by Craig Peacock.
    Открывает порты IOPM и использует Ke386SetIoAccessMap, Ke386QueryIoAccessMap,
    Ke386IoSetAccessProcess. ProcessId получает через DeviceIoControl. Сочетание
    команд outsb и WinAPI функции Sleep. Полнофункциональный драйвер.
    8) scp06 написано на основе драйвера режима ядра UserPort 2.0 by Tomas Franzon
    changed to PsSetCreateProcessNotifyRoutin method. адресный диаппазон расширен до
    0x7A80 для всех процессов и до 0xFFFF для \\.\scp06 процессов. Выполнение
    Ke386IoSetAccessProcess, сопровождается вызовом функции ZwYieldExecution,
    которая форсирует процесс переключения. Сочетание команд outsb и WinAPI функции
    Sleep. Полнофункциональный драйвер.
    9) scp07 написано на основе драйвера режима ядра UserPort 1.0 by Tomas Franzon
    изменение адреса начала IOPM в TSS расширяет размер TSS до 0x2135. адресный
    диаппазон расширен до 0x7A80 для всех процессов и до 0xFFFF для \\.\scp07
    процессов. Сочетание команд outsb и WinAPI функции Sleep. Для многопроцессорной
    или гипертрейдинговой машины может вызвать перезагрузку без BSOD.
    Полнофункциональный драйвер.
    10) scp08 написано на основе драйвера режима ядра UserPort 1.1 by Tomas Franzon
    изменение адреса начала IOPM в TSS расширяет размер TSS до 0x2FFF работает с
    гипертрейдинговыми и многопроцессорными системами. Полнофункциональный драйвер.

    Доступ к командам In/Out через установку user-mode приложению IOPL=3
    11) my_directio делает CPL = IOPL из user-mode. Повышаем привелегию SeTcbPrivilege
    через функцию ZwSetInformationProcess(GetCurrentProcess(), ProcessUserModeIOPL,
    0, 0) устанавливает IOPL=3. User-mode приложение, драйвер не нужен.
    12) my_directio1 усовершенствованный my_directio. Упростил заполнение структуры
    TOKEN_PRIVILEGES, избавился от функций GetCurrentProcess и ExitProcess, вызываю
    функции NtOpenProcessToken, NtAdjustPrivilegesToken, NtSetInformationProcess
    через int 2Eh. User-mode приложение, драйвер не нужен.
    13) scp09 при открытии драйвера через CreateFile("\\.\scp09") получаем адрес
    процесса через IoGetCurrentProcess. Устанавливаем поле KPROCESS.Iopl равным TRUE,
    в user-mode приложении создаем и запускаем поток, содержащий команды In/Out,
    для этого нового потока IOPL обновится, следом, после переключения задач,
    обновится EFLAGS. Полнофункциональный драйвер.
    14) scp10 ProcessId получает через DeviceIoControl, реестр или через
    WriteFile("\\.\scp10"). Передадим в функцию PsLookupProcessByProcessId
    полученный идентификатор процесса ProcessId, получаем указатель на KPROCESS.
    Устанавливаем поле KPROCESS.Iopl равным TRUE, в user-mode приложении создаем и
    запускаем поток, содержащий команды In/Out.
    Полнофункциональный драйвер.
    15) scp11 в драйвере получаем текущий поток и процесс, функция
    PsGetContextThread извлекает из стека ядра KTRAP_FRAME и преобразует его в
    структуру CONTEXT. В поле CONTEXT.RegEFlags устанавливаем флаги IOPL=3 и
    функция PsSetContextThread копирует переданный CONTEXT в KTRAP_FRAME.
    В user-mode приложении создаем и запускаем поток, содержащий команды In/Out.
    Полнофункциональный драйвер.
    Дай мне боже силы собраться и дописать статью!
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    Базовые способы анализа кода:
    o Парсинг фиксапов. Например имеется ссылка на переменную, для этой ссылки определён фиксап, в ядре секция релоков выгружена.
    o Дизассемблирование. Для этого необходим дизасм длин(ldasm). Инструкции последовательно разбираются, например:
    Код (Text):
    1. ; o KeEnterKernelDebugger
    2. ; o KdInitSystem
    3. ; o KiHardwareTrigger
    4. ; o KeBugCheckCount
    5. ; o KiDebugRoutine
    6. ; o KdpStub
    7.    
    8. KDEBUG_ENVIRONMENT struct
    9. pKeEnterKernelDebugger  PVOID ?
    10. pKdInitSystem           PVOID ?
    11. pKiHardwareTrigger      PVOID ?
    12. pKeBugCheckCount        PVOID ?
    13. pKiDebugRoutine     PVOID ?
    14. pKdpStub                PVOID ?
    15. KDEBUG_ENVIRONMENT ends
    16. PKDEBUG_ENVIRONMENT typedef ptr KDEBUG_ENVIRONMENT
    17.  
    18. xQueryDebugEnvironment proc uses ebx esi edi NtImageBase:PVOID, DbgEnv:PKDEBUG_ENVIRONMENT
    19. Local ImageHeader:PIMAGE_NT_HEADERS, ImageLimit:PVOID
    20. Local Fn:KDEBUG_ENVIRONMENT
    21.     Call SEH_Epilog_Reference
    22.     Call SEH_Prolog
    23.     mov edi,NtImageBase
    24.     invoke LdrImageNtHeader, Edi, addr ImageHeader
    25.     test eax,eax
    26.     mov Fn.pKeEnterKernelDebugger,6DED839AH ; HASH("KeEnterKernelDebugger")
    27.     mov Fn.pKeEnterKernelDebugger[4],eax
    28.     jnz Exit
    29.     invoke LdrEncodeEntriesList, Edi, 0, addr Fn.pKeEnterKernelDebugger
    30.     test eax,eax
    31.     mov esi,Fn.pKeEnterKernelDebugger
    32.     jnz Exit
    33.     mov edi,8   ; IP's
    34.     xor ebx,ebx
    35. KiHardwareTrigger@Step:
    36.     movzx eax,word ptr [esi]
    37.     cmp al,33H  ; 33 /r (xor r32,r/m32)
    38.     jne KiHardwareTrigger@IsImm
    39. comment '
    40.     33F6            xor esi,esi
    41.     46          inc esi
    42.     8935 XXXXXXXX   mov dword ptr ds:[_KiHardwareTrigger],esi
    43.     '
    44.     mov cl,ah   ; ModR/M
    45.     mov al,ah
    46.     and cl,MODRM_MOD_MASK
    47.     and al,MODRM_REG_MASK
    48.     cmp cl,MODRM_MOD_MASK
    49.     jne KiHardwareTrigger@Next
    50.     shr al,3    ; Reg
    51.     and ah,MODRM_RM_MASK
    52.     cmp al,ah
    53.     movzx ebx,al
    54.     jne KiHardwareTrigger@Next
    55.     add al,40H  ; 40 + rd (inc r32)
    56.     cmp byte ptr [esi + 2],al
    57.     jne KiHardwareTrigger@Next
    58.     cmp byte ptr [esi + 3],89H  ; 89 /r (mov r/m32,r32)
    59.     mov al,byte ptr [esi + 4]   ; ModR/M
    60.     jne KiHardwareTrigger@Next
    61.     ror al,3
    62.     mov ah,al
    63. ; (011B:EBX, 110B:ESI, 111B:EDI)
    64.     and al,(MODRM_REG_MASK shr 3)
    65.     and ah,NOT(MODRM_REG_MASK shr 3)
    66.     cmp ah,10100000B
    67.     movzx eax,al
    68.     jne KiHardwareTrigger@Next
    69.     cmp eax,ebx
    70.     jne KiHardwareTrigger@Next
    71.     mov eax,dword ptr [esi + 5] ; _KiHardwareTrigger
    72.     add esi,9
    73.     jmp KeBugCheckCount@Scan
    74. KiHardwareTrigger@Next:
    75.     Call VirXasm32
    76.     add esi,eax
    77.     dec edi
    78.     jnz KiHardwareTrigger@Step
    79.     jmp Error
    80. KiHardwareTrigger@IsImm:
    81.     cmp ax,05C7H    ; mov dword ptr ds:[_KiHardwareTrigger],1    
    82.     jne KiHardwareTrigger@Next
    83.     cmp dword ptr [esi + 6],1
    84.     jne KiHardwareTrigger@Next
    85.     mov eax,dword ptr [esi + 2] ; _KiHardwareTrigger
    86. ; _KeBugCheckCount
    87.     add esi,10
    88. KeBugCheckCount@Scan:
    89.     mov Fn.pKiHardwareTrigger,eax
    90.     lea edi,[esi + 60H]
    91. KeBugCheckCount@Step:
    92.     mov ax,word ptr [esi]
    93.     cmp al,0C3H ; ret
    94.     je Error
    95.     cmp al,0CCH ; int 3
    96.     je Error
    97.     sub al,0B8H ; B8 + rb (mov r32,imm32)
    98.     jb KeBugCheckCount@Next
    99.     cmp al,7    ; Reg
    100.     ja KeBugCheckCount@Next
    101.     mov ecx,dword ptr [esi + 1] ; _KeBugCheckCount
    102.     movzx eax,al
    103.     add esi,5
    104.     test ebx,ebx
    105.     mov Fn.pKdInitSystem,eax    ; /Reg
    106.     mov Fn.pKeBugCheckCount,ecx
    107.     jz KeBugCheckCount@Xadd
    108. KeBugCheckCount@Xchg:
    109. ; xchg
    110.     mov eax,dword ptr [esi]
    111.     .if al == 0F0H  ; Pfx lock
    112.     shr eax,8
    113.     .endif
    114.     cmp al,087H ; 87 /r (xchg r/m32,r32)
    115.     jne Error
    116.     mov al,ah
    117.     test ah,MODRM_MOD_MASK
    118.     jnz Error
    119.     and eax,(MODRM_RM_MASK or (MODRM_REG_MASK shl 8))
    120.     cmp byte ptr [Fn.pKdInitSystem],al
    121.     jne Error
    122.     shr ah,3
    123.     cmp ah,bl
    124.     jne Error
    125.     jmp KdInitSystem@Scan
    126. KeBugCheckCount@Xadd:
    127.     Call VirXasm32
    128.     add esi,eax
    129. ; xadd
    130.     mov eax,dword ptr [esi]
    131.     .if al == 0F0H  ; Pfx lock
    132.     shr eax,8
    133.     .endif
    134.     cmp ax,0C10FH   ; 0FC1 /r (xadd r/m32,r32)
    135.     jne Error
    136.     shr eax,16
    137.     movzx eax,al
    138.     test al,MODRM_MOD_MASK
    139.     jnz Error
    140.     and eax,MODRM_RM_MASK
    141.     cmp Fn.pKdInitSystem,eax    ; /Reg
    142.     jne Error
    143.     jmp KdInitSystem@Scan
    144. KeBugCheckCount@Next:
    145.     Call VirXasm32
    146.     add esi,eax
    147.     cmp esi,edi
    148.     jb KeBugCheckCount@Step
    149.     jmp Error
    150. KdInitSystem@Scan:
    151. ; _KdInitSystem
    152.     lea ebx,[esi + 50H]
    153.     mov edi,NtImageBase
    154. KdInitSystem@Step:
    155.     Call VirXasm32
    156.     add esi,eax
    157.     cmp byte ptr [esi],OPCODE_CALL  ; call _KdInitSystem
    158.     jne KdInitSystem@Next
    159.     cmp word ptr [esi + 5],056AH    ; push DBG_STATUS_FATAL(5)
    160.     jne KdInitSystem@Next
    161.     cmp byte ptr [esi + 7],OPCODE_CALL  ; call _KiBugCheckDebugBreak
    162.     jne KdInitSystem@Next
    163.     mov eax,ImageHeader
    164.     add esi,dword ptr [esi + 1]
    165.     mov eax,IMAGE_NT_HEADERS.OptionalHeader.SizeOfImage[eax]
    166.     add esi,5       ; _KdInitSystem
    167.     add eax,edi
    168.     mov Fn.pKdInitSystem,esi
    169.     lea ebx,[esi + 80H]
    170.     mov ImageLimit,eax
    171.     cmp esi,edi
    172.     jna Error
    173.     cmp esi,eax
    174.     jae Error
    175. KiDebugRoutine@Step:
    176.     Call VirXasm32
    177.     add esi,eax
    178.     cmp word ptr [esi],05C7H        ; mov dword ptr ds:[_KiDebugRoutine],@KdpStub
    179.     jne KiDebugRoutine@Next
    180.     mov ecx,dword ptr [esi + 2] ; @KiDebugRoutine
    181.     mov edx,dword ptr [esi + 6] ; @KdpStub
    182.     cmp ecx,edi
    183.     jna Error
    184.     cmp edx,edi
    185.     jna Error
    186.     cmp ImageLimit,ecx
    187.     jbe Error
    188.     cmp ImageLimit,edx
    189.     jbe Error
    190.     cld
    191.     mov Fn.pKiDebugRoutine,ecx
    192.     lea esi,Fn
    193.     mov edi,DbgEnv
    194.     mov ecx,sizeof(KDEBUG_ENVIRONMENT)/4
    195.     mov Fn.pKdpStub,edx
    196.     xor eax,eax
    197.     rep movsd
    198.     jmp Exit
    199. KiDebugRoutine@Next:
    200.     cmp byte ptr [esi],OPCODE_CALL
    201.     je Error
    202.     cmp esi,ebx
    203.     jc KiDebugRoutine@Step
    204.     jmp Error  
    205. KdInitSystem@Next:
    206.     cmp byte ptr [esi],0C3H ; ret
    207.     je Error
    208.     cmp esi,ebx
    209.     jc KdInitSystem@Step
    210. Error:
    211.     mov eax,STATUS_NOT_FOUND
    212.     jmp Exit
    213. SEH_Epilog_Reference:
    214.     %GET_CURRENT_GRAPH_ENTRY
    215. Exit:
    216.     Call SEH_Epilog
    217.     ret
    218. xQueryDebugEnvironment endp
    o Использование масок. На код налаживается маска, где смещения обнулены и выполняется сравнение с этой маской, например:
    Код (Text):
    1. ; o WRMSR
    2. ; o KiLoadFastSyscallMachineSpecificRegisters
    3. ; o KiFastCallEntry
    4. ; o KPRCB.DpcStack
    5.  
    6. comment '
    7. _KiLoadFastSyscallMachineSpecificRegisters:
    8. $       6A 00           push 0
    9. $+2     6A 08           push 8  ; KGDT_R0_CODE
    10. $+4     68 74010000     push 174    ; IA32_SYSENTER_CS
    11. $+9     E8 XXXXXXXX     call _WRMSR
    12. $+E     6A 00           push 0
    13. $+10        68 XXXXXXXX     push offset KiFastCallEntry ; Fixup..
    14. $+15        68 76010000     push 176
    15. $+1A        E8 XXXXXXXX     call _WRMSR
    16. $+1F        6A 00           push 0
    17. $+21        FFB6 XXXXXXXX       push dword ptr ds:[esi + DIS]   ; KPRCB.DpcStack
    18. $+27        68 75010000     push 175    ; IA32_SYSENTER_ESP
    19. $+2C        E8 XXXXXXXX     call _WRMSR
    20.  
    21. _WRMSR:
    22. $       8B4C24 04           mov ecx,dword ptr ss:[esp + 4]
    23. $+4     8B4424 08           mov eax,dword ptr ss:[esp + 8]
    24. $+8     8B5424 0C           mov edx,dword ptr ss:[esp + C]
    25. $+C     0F30                wrmsr
    26. $+E     C2 0C00         ret 0C'
    27.  
    28. SIGN_LENGTH     equ 30H ; Align!
    29.  
    30. FIX_WRMSR_1 equ 09H
    31. FIX_WRMSR_2 equ 1AH
    32. FIX_WRMSR_3 equ 2CH
    33. FIX_EIP     equ 10H
    34. FIX_ESP     equ 22H
    35.  
    36. MSR_ENVIRONMENT struct
    37. pWRMSR          PVOID ?
    38. pKiLoadFastSyscallX PVOID ?
    39. pKiFastCallEntry    PVOID ?
    40. PrcbDpcStack        ULONG ? ; Смещение в KPRCB.
    41. MSR_ENVIRONMENT ends
    42. PMSR_ENVIRONMENT typedef ptr MSR_ENVIRONMENT
    43.  
    44. xQueryMsrEnvironment proc uses ebx esi edi NtImageBase:PVOID, MsrEnv:PMSR_ENVIRONMENT
    45. Local ImageHeader:PIMAGE_NT_HEADERS
    46. Local SectionHeader:PIMAGE_SECTION_HEADER
    47. Local Environment:MSR_ENVIRONMENT
    48. Local Buffer[SIGN_LENGTH]:BYTE
    49.     Call SEH_Epilog_Reference
    50.     Call SEH_Prolog
    51. ; Mask.
    52.     push 000000000H
    53.     push 0E8000001H
    54.     push 075680000H
    55.     push 00000B6FFH
    56.     push 0006A0000H
    57.     push 00000E800H
    58.     push 000017668H
    59.     push 000000000H
    60.     push 068006A00H
    61.     push 0000000E8H
    62.     push 000000174H
    63.     push 068086A00H
    64.     mov ebx,esp
    65.     invoke LdrImageNtHeader, NtImageBase, addr ImageHeader
    66.     test eax,eax
    67.     mov edx,ImageHeader
    68.     jnz Exit
    69.     mov edi,IMAGE_SECTION_HEADER.VirtualAddress[edx + sizeof(IMAGE_NT_HEADERS)] ; .text
    70.     mov ecx,IMAGE_SECTION_HEADER.VirtualSize[edx + sizeof(IMAGE_NT_HEADERS)]
    71.     add edi,NtImageBase
    72.     sub ecx,SIGN_LENGTH
    73.     cld
    74. @@:
    75.     mov eax,6AH ;push #
    76.     repne scasb
    77.     mov esi,edi
    78.     jne Error
    79.     push ecx
    80.     push esi
    81.     mov ecx,(SIGN_LENGTH/4)
    82.     lea edi,Buffer
    83.     xor eax,eax
    84.     rep movsd
    85.     mov ecx,(SIGN_LENGTH/4)
    86.     lea edi,Buffer
    87.     mov esi,ebx
    88.     mov dword ptr [Buffer + FIX_WRMSR_1],eax
    89.     mov dword ptr [Buffer + FIX_WRMSR_2],eax
    90.     mov dword ptr [Buffer + FIX_WRMSR_3],eax
    91.     mov dword ptr [Buffer + FIX_EIP],eax
    92.     mov dword ptr [Buffer + FIX_ESP],eax
    93.     repe cmpsd
    94.     pop edi
    95.     pop ecx
    96.     jne @b
    97.     mov eax,dword ptr [edi + FIX_WRMSR_1]
    98.     lea ecx,[eax + edi + FIX_WRMSR_1 + 5 - 1]   ; _WRMSR
    99.     sub eax,11H
    100.     mov Environment.pWRMSR,ecx
    101.     cmp dword ptr [edi + FIX_WRMSR_2],eax
    102.     jne @b
    103.     sub eax,12H
    104.     mov edx,dword ptr [edi + FIX_ESP]
    105.     cmp dword ptr [edi + FIX_WRMSR_3],eax
    106.     jne @b
    107.     mov Environment.PrcbDpcStack,edx
    108.     cmp word ptr [ecx + 0CH],300FH  ; wrmsr
    109.     mov eax,dword ptr [edi + FIX_EIP]   ; _KiFastCallEntry
    110.     jne Error
    111.     sub edi,5
    112.     mov ecx,40H
    113. @@:
    114.     cmp dword ptr [edi],0FF8B9090H  ; nop/nop/mov edi,edi
    115.     je @f
    116. Step:
    117.     dec edi
    118.     loop @b
    119. Error:
    120.     mov eax,STATUS_NOT_FOUND
    121.     jmp Exit
    122. @@:
    123.     cmp dword ptr [edi - 3],90909090H
    124.     jne Step
    125.     add edi,2   ; _KiLoadFastSyscallMachineSpecificRegisters
    126.     lea esi,Environment
    127.     mov Environment.pKiLoadFastSyscallX,edi
    128.     mov Environment.pKiFastCallEntry,eax
    129.     mov edi,MsrEnv
    130.     xor eax,eax
    131.     movsd
    132.     movsd
    133.     movsd
    134.     movsd
    135.     jmp Exit
    136. SEH_Epilog_Reference:
    137.     %GET_CURRENT_GRAPH_ENTRY
    138. Exit:
    139.     add esp,SIGN_LENGTH
    140.     Call SEH_Epilog
    141.     ret
    142. xQueryMsrEnvironment endp
    143.  
    144. ; Ref. KiIpiGenericCall():
    145. ;   _KiAdjustInterruptTime@8
    146. ;   _KeSetIntervalProfile@8
    147. ;   _KiRestoreFastSyscallReturnState@0
    148. ;
    149. xQueryMsrEnvironmentEx proc uses ebx esi edi NtImageBase:PVOID, pKiIpiGenericCall:PVOID, MsrEnv:PMSR_ENVIRONMENT
    150. Local ImageHeader:PIMAGE_NT_HEADERS
    151. Local SectionHeader:PIMAGE_SECTION_HEADER
    152. Local Environment:MSR_ENVIRONMENT
    153.     Call SEH_Epilog_Reference
    154.     Call SEH_Prolog
    155.     invoke LdrImageNtHeader, NtImageBase, addr ImageHeader
    156.     test eax,eax
    157.     jnz Exit
    158.     invoke xQueryMsrEnvironment, NtImageBase, addr Environment
    159.     test eax,eax
    160.     mov edx,ImageHeader
    161.     jnz Exit
    162.     mov edi,IMAGE_SECTION_HEADER.VirtualAddress[edx + sizeof(IMAGE_NT_HEADERS)] ; .text
    163.     mov ecx,IMAGE_SECTION_HEADER.VirtualSize[edx + sizeof(IMAGE_NT_HEADERS)]
    164.     add edi,NtImageBase
    165.     cld
    166.     mov ebx,ecx
    167.     mov esi,edi
    168.     mov edx,Environment.pKiLoadFastSyscallX
    169.     add ebx,edi
    170. Scan:
    171.     mov eax,68H ; push offset _KiFastCallEntry
    172. @@:
    173.     repne scasb
    174.     jne Error
    175.     cmp dword ptr [edi],edx
    176.     jne @b
    177.     cmp byte ptr [edi + 4],OPCODE_CALL
    178.     jne @b
    179.     cmp word ptr [edi - 3],006AH    ; push 0
    180.     jne @b
    181.     mov eax,dword ptr [edi + 5]
    182.     lea eax,[eax + edi + 4 + 5] ; _KiIpiGenericCall
    183.     cmp esi,eax
    184.     jae Scan
    185.     cmp ebx,eax
    186.     jna Scan
    187.     cmp dword ptr [eax],8B55FF8BH   ; mov edi,edi/push ebp..
    188.     jne Scan
    189.     mov ecx,pKiIpiGenericCall
    190.     mov dword ptr [ecx],eax
    191.     mov edi,MsrEnv
    192.     lea esi,Environment
    193.     movsd
    194.     movsd
    195.     movsd
    196.     movsd
    197.     xor eax,eax
    198.     jmp Exit
    199. SEH_Epilog_Reference:
    200.     %GET_CURRENT_GRAPH_ENTRY
    201. Exit:
    202.     Call SEH_Epilog
    203.     ret
    204. Error:
    205.     mov eax,STATUS_NOT_FOUND
    206.     jmp Exit
    207. xQueryMsrEnvironmentEx endp
    o Сигнатурный поиск. Ищется последовательность байт в пределах секций модуля.
    o Парсинг сервисов. Для некоторых сервисов разность их ID является константой.
    o Использование графа. Это весьма сложные способы, но эффективные. Для большинства не доступны. Строится граф, затем выполняется его анализ.
    o Динамические способы крайне не желательны. Это трассировка.
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > Использование графа. Это весьма сложные способы, но эффективные. Для большинства не доступны. Строится граф, затем выполняется его анализ.
    дык всё просто вроде, избежать зацикливания и всё.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    n0name
    Ну тут не могут тупо память просканить, а вы про графы. Мб несколько человек это смогут сделать.)
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Блин-комом номер десять. В драйвере scp12 получаем текущий поток и процесс, устанавливаем Process->Iopl = TRUE, функция PsGetContextThread извлекает из стека ядра KTRAP_FRAME и преобразует его в структуру CONTEXT. Так как Process->Iopl = TRUE, функция PsSetContextThread устанавливает в поле CONTEXT.RegEFlags значение IOPL равным 3. Далее функция PsSetContextThread копирует переданный CONTEXT в KTRAP_FRAME. В user-mode приложении scp12-00 создаем и запускаем поток, содержащий команды In/Out. Полнофункциональный драйвер.
    В аттаче драйвер, user-mode приложение и исходники.
    Огромное спасибо Clerk за идею, терпение и помощь!
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Блин-комом номер одиннадцать и двенадцать. Доступ к портам ввода-вывода из юзермодного приложения без драйвера. scp13-00 устанавливает IOPL=3 через SetInformationProcess еще одним способом. Проверено под WinXP SP3. Идея взята здесь. scp14-00 для доступа к портам создает CallGate. К сожалению, не на всех машинах с WinXP SP3 \Device\PhysicalMemory можно открыть с атрибутом SECTION_MAP_WRITE даже с правами Администратора (версия 5.1 сборка 2600.xpsp_sp3_qfe.080423-1303 service pack 3 позволяет, а версия 5.1 сборка 2600.xpsp.080413-2111 service pack 3 -- нет), но там, гда открывается -- код работает. Идея калгейта взята у Ms-Rem из Перехват API функций в Windows NT (часть 3). Нулевое кольцо.. В аттаче исходники и ехе.
    to be continued...
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    На счёт калгейтов. В NT их использовать нельзя, так как регистр флагов не изменяется. Тоесть не маскируются прерывания и не сбрасывается TF. Изза IF если произойдёт переключение задач, это может привести к опасным последствиям, так как контекст задачи не полностью инициализирован(переключен на ядерный). Изза TF возникнет не обработанное исключение(это при трассировке вызова шлюза) и будет сгенерирован багчек. Вдобавок следует использовать следующее:
    o Устанавливать калгейт на всех GDT, либо устанавливать необходимый аффинитет потоку. Иначе после переключений потока на другой процессор возникнет #GP при вызове шлюза.
    o Передавать управление на инструкцию вызывающую шлюз посредством сервиса NtContinue, заранее замаскировав TF в контексте.
    o Снизите вероятность свапконтекста можно повысив приоритет и/или обождав начало нового кванта:
    Код (Text):
    1. YIELD_NPX macro
    2.     fnop
    3. @@:
    4.     smsw eax    ; 16i
    5.     bt ax,1 ; Cr0.MP
    6.     jnc @b
    7. endm
    http://files.virustech.org/indy/Teory/SwapContext/vt_smsw_npx.pdf

    Кстате такого типа бэкдоры нельзя в малваре юзать. Наиболее простой способ это использовать SST(запись ссылки в ETHREAD с последующим вызовом).
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Для загрузки драйверов можно использовать три способа:
    1) использовать API Service Control Manager'a. Для загрузки драйвера scpXX.sys здесь используется приложение scpXX-00.exe
    2) прописывать драйвер в реестре вручную и загружать его с помощью функции ZwLoadDriver. Вы создаете в реестре минимум необходимых записей, запускаете драйвер и удаляете его раздел из реестра. Для загрузки драйвера scpXX.sys здесь используется приложение scpXX-01.exe
    3) загрузить драйвер при помощи ZwSetSystemInformation. Для загрузки драйвера scp00.sys здесь используется приложение scp00-02.exe
    В аттаче сорцы приложений (от scp00-01 до scp12-01) и scp00-02 и сами ехе