PSR1257II Вот закодил на коленке простейший семпл, запускалось на P4: http://indy-vx.narod.ru/Bin/rdtsc.zip Это тестовый код, он не полноценный(нет безопасного чтения памяти, последовательного вызова пост-диспетчера, проверки опкодов етц). При первом запуске на XP падал svchost, оказалось в одном из его модулей дёргается rdtsc. Для этого я специально ввёл magic-значения, чтобы только нашу инструкцию пропускать, иные эмуляться. Для загрузки Cr4 на все камни я не использовал IPI, а сделал проще - ud2(#UD) на камне настроит Cr4(хотя также не совсем корректно, ибо вероятен свич на другой камень, но для тестов годится). Тоесть нужно сделать в юзермоде Ud2 на всех камнях, переустановкой аффинитета. Под отладочным портом Kdp не вызывается, тоесть будет в любом случае фолт. Вот непосредственно диспетчер: Код (Text): OP_UD2 equ 0B0FH OP_RDTSC equ 310FH xKiDebugRoutineInternal: %GET_CURRENT_GRAPH_ENTRY KiDebugRoutineInternal proc uses ebx esi edi TrapFrame:PKTRAP_FRAME, ExceptionFrame:PKEXCEPTION_FRAME, ExceptionRecord:PEXCEPTION_RECORD, ContextRecord:PCONTEXT, PreviousMode:KPROCESSOR_MODE, SecondChance:BOOLEAN cmp SecondChance,FALSE jne Chain cmp PreviousMode,KernelMode je Chain mov esi,ExceptionRecord assume esi:PEXCEPTION_RECORD mov ebx,ContextRecord assume ebx:PCONTEXT cmp [esi].ExceptionFlags,NULL jne Chain test [ebx].ContextFlags,CONTEXT_CONTROL jz Chain cmp [esi].ExceptionCode,STATUS_ILLEGAL_INSTRUCTION jne IsRdtsc cmp [ebx].regEax,XCPT_UD_MAGIC jne Chain mov [ebx].regEax,0 ; !Eax mov [ebx].regEFlags,EFLAGS_MASK ; !EFlags cli mov eax,Cr4 or eax,CR4_TSD mov Cr4,eax sti Skip: ; * Возможно рекурсивное возникновение фолта, что требует обработки. ; * Так как код пермутирующий, обработка такого фолта требует анализ графа. mov esi,[esi].ExceptionAddress Call VirXasm32 add [ebx].regEip,eax Load: mov eax,TRUE jmp Exit Chain: xor eax,eax Exit: ret IsRdtsc: cmp [esi].ExceptionCode,STATUS_PRIVILEGED_INSTRUCTION jne Chain cmp [ebx].regEax,XCPT_TSC_MAGIC je Chain rdtsc mov [ebx].regEax,eax mov [ebx].regEdx,edx jmp Skip KiDebugRoutineInternal endp
Malfoy Здорово, спасибо за исследование. Мне (и другим тоже полагаю) было важно узнать работает это или нет.
а что именно? всё и так знали что rdtsc можно запретить или съэмулить. а энтропию и без rdtsc можно получить. а если бояться того что всё будет перехвачено, то для таких случаев есть поговорка - волков бояться в лес не ходить. такие дела
rpy3uH Без апи основных способов получить рандомное значение(Seed) не так и много: tsc, ktc(#2A/USD) ну и всё в общем. Хотя есчо можно со стека чексумму взять. В любом из этих случаев можно снять лог и обратно его подать.
чексумма стека - хороший способ. вытаскиваем из стека штук 15 адресов проверяем валидность, извлекаем из каждого адреса примерно по байт 20-30, получаем SHA1 от всего этого мусора, вот тебе и энтропия. (блин, вот только чтобы проверить валидность адреса нужна будет VirtualQuery) то что перехватить и съэмулить можно всё, это и так понятно. но по крайней мере такой способ не зависит от конкретной реализации ядра системы (в которой может быть запрещена инструкция rdtsc).
rpy3uH В стеке значения будут различаться между запусками приложения адресами из за ASLR, PID и TID(ну и есчо ядерным стартап контекстом, но это бага и не рассматриваем). Нет смысла читать фиксированный код.
ничего не понял. а какая разница какие адреса? Код (Text): VOID [b]WINAPI[/b] InitRandom(DWORD FuckingParam) { PVOID AddrInStack = &FuckingParam; //AddrInStack - вот и адрес в стеке, а какие проблемы? даже ассемблер не нужен //тыкаем по [AddrInStack+/-100h], извлекаем значения из стека проверяем валидность и так далее }
1. берём некоторый укзатель в стеке близкий к его верхушке 2. проходимся по стеку рядом с этим адресом и выдёргиваем из него примерно 15 адресов с проверкой через VirtualQuery 3. из каждого адреса читаем по 20 байт и складирумем их в отдельный буфер 4. получаем SHA1 от данных в буфере - вот и энтропия 5. ????? 6. PROFIT
rpy3uH А смысл в таких действиях ? При каждом запуске адреса будут одни и теже, это нисколько не рандом. Более, зачем это нужно, если можно апи юзать. Хоть число свапконтекстов поделить на ядерный колстек при запросе свапконтекстов и поксорить числом сисколов за 200 миллисекунд