Хук функции рандом

Тема в разделе "WASM.HEAP", создана пользователем ring4, 13 янв 2012.

  1. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    PSR1257II
    Вот закодил на коленке простейший семпл, запускалось на P4:
    [​IMG]
    http://indy-vx.narod.ru/Bin/rdtsc.zip

    Это тестовый код, он не полноценный(нет безопасного чтения памяти, последовательного вызова пост-диспетчера, проверки опкодов етц). При первом запуске на XP падал svchost, оказалось в одном из его модулей дёргается rdtsc. Для этого я специально ввёл magic-значения, чтобы только нашу инструкцию пропускать, иные эмуляться. Для загрузки Cr4 на все камни я не использовал IPI, а сделал проще - ud2(#UD) на камне настроит Cr4(хотя также не совсем корректно, ибо вероятен свич на другой камень, но для тестов годится). Тоесть нужно сделать в юзермоде Ud2 на всех камнях, переустановкой аффинитета.

    Под отладочным портом Kdp не вызывается, тоесть будет в любом случае фолт.

    Вот непосредственно диспетчер:
    Код (Text):
    1. OP_UD2  equ 0B0FH
    2. OP_RDTSC    equ 310FH
    3.  
    4. xKiDebugRoutineInternal:
    5.     %GET_CURRENT_GRAPH_ENTRY
    6. KiDebugRoutineInternal proc uses ebx esi edi TrapFrame:PKTRAP_FRAME,
    7.  ExceptionFrame:PKEXCEPTION_FRAME,
    8.  ExceptionRecord:PEXCEPTION_RECORD,
    9.  ContextRecord:PCONTEXT,
    10.  PreviousMode:KPROCESSOR_MODE,
    11.  SecondChance:BOOLEAN
    12.    
    13.     cmp SecondChance,FALSE
    14.     jne Chain
    15.    
    16.     cmp PreviousMode,KernelMode
    17.     je Chain
    18.  
    19.     mov esi,ExceptionRecord
    20.     assume esi:PEXCEPTION_RECORD
    21.  
    22.     mov ebx,ContextRecord
    23.     assume ebx:PCONTEXT
    24.  
    25.     cmp [esi].ExceptionFlags,NULL
    26.     jne Chain
    27.  
    28.     test [ebx].ContextFlags,CONTEXT_CONTROL
    29.     jz Chain
    30.  
    31.     cmp [esi].ExceptionCode,STATUS_ILLEGAL_INSTRUCTION
    32.     jne IsRdtsc
    33.  
    34.     cmp [ebx].regEax,XCPT_UD_MAGIC
    35.     jne Chain
    36.        
    37.     mov [ebx].regEax,0  ; !Eax
    38.     mov [ebx].regEFlags,EFLAGS_MASK ; !EFlags
    39.    
    40.     cli
    41.     mov eax,Cr4
    42.     or eax,CR4_TSD
    43.     mov Cr4,eax
    44.     sti
    45.  
    46. Skip:
    47. ; * Возможно рекурсивное возникновение фолта, что требует обработки.
    48. ; * Так как код пермутирующий, обработка такого фолта требует анализ графа.
    49.  
    50.     mov esi,[esi].ExceptionAddress
    51.     Call VirXasm32
    52.     add [ebx].regEip,eax
    53.    
    54. Load:
    55.     mov eax,TRUE
    56.     jmp Exit
    57.    
    58. Chain:
    59.     xor eax,eax
    60. Exit:
    61.     ret
    62. IsRdtsc:
    63.     cmp [esi].ExceptionCode,STATUS_PRIVILEGED_INSTRUCTION
    64.     jne Chain
    65.    
    66.     cmp [ebx].regEax,XCPT_TSC_MAGIC
    67.     je Chain
    68.    
    69.     rdtsc
    70.     mov [ebx].regEax,eax
    71.     mov [ebx].regEdx,edx
    72.    
    73.     jmp Skip
    74. KiDebugRoutineInternal endp
     
  2. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Malfoy

    Здорово, спасибо за исследование. Мне (и другим тоже полагаю) было важно узнать работает это или нет.
     
  3. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    а что именно? всё и так знали что rdtsc можно запретить или съэмулить.

    а энтропию и без rdtsc можно получить. а если бояться того что всё будет перехвачено, то для таких случаев есть поговорка - волков бояться в лес не ходить. такие дела
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    rpy3uH
    Без апи основных способов получить рандомное значение(Seed) не так и много: tsc, ktc(#2A/USD) ну и всё в общем. Хотя есчо можно со стека чексумму взять. В любом из этих случаев можно снять лог и обратно его подать.
     
  5. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    чексумма стека - хороший способ. вытаскиваем из стека штук 15 адресов проверяем валидность, извлекаем из каждого адреса примерно по байт 20-30, получаем SHA1 от всего этого мусора, вот тебе и энтропия. (блин, вот только чтобы проверить валидность адреса нужна будет VirtualQuery)

    то что перехватить и съэмулить можно всё, это и так понятно. но по крайней мере такой способ не зависит от конкретной реализации ядра системы (в которой может быть запрещена инструкция rdtsc).
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    rpy3uH
    В стеке значения будут различаться между запусками приложения адресами из за ASLR, PID и TID(ну и есчо ядерным стартап контекстом, но это бага и не рассматриваем). Нет смысла читать фиксированный код.
     
  7. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    ничего не понял. а какая разница какие адреса?

    Код (Text):
    1. VOID [b]WINAPI[/b] InitRandom(DWORD FuckingParam)
    2. {
    3.    PVOID AddrInStack = &FuckingParam;
    4.    //AddrInStack - вот и адрес в стеке, а какие проблемы? даже ассемблер не нужен
    5.    //тыкаем по [AddrInStack+/-100h], извлекаем значения из стека проверяем валидность и так далее
    6. }
     
  8. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    http://diskcryptor.net/wiki/RNG
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    newbie
    ну и причем здесь diskcryptor?
     
  10. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    там про ваш RtlRandom есть, читайте
     
  11. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Я прекрасно знаю про RtlGenRandom, причем тут дисккриптор?
     
  12. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    rpy3uH
    Опечатка, адреса не причём конечно.
     
  13. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    тогда в чём проблема моего метода?
     
  14. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    rpy3uH
    Я так и не понял что у вас за метод.
     
  15. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    1. берём некоторый укзатель в стеке близкий к его верхушке
    2. проходимся по стеку рядом с этим адресом и выдёргиваем из него примерно 15 адресов с проверкой через VirtualQuery
    3. из каждого адреса читаем по 20 байт и складирумем их в отдельный буфер
    4. получаем SHA1 от данных в буфере - вот и энтропия
    5. ?????
    6. PROFIT
     
  16. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    rpy3uH
    А смысл в таких действиях ?
    При каждом запуске адреса будут одни и теже, это нисколько не рандом. Более, зачем это нужно, если можно апи юзать. Хоть число свапконтекстов поделить на ядерный колстек при запросе свапконтекстов и поксорить числом сисколов за 200 миллисекунд :lol: