Глобальные переменные.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Clerk, 24 июл 2010.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Здрасте.
    Задача следующая. Имеется мутирующий код(не содержащий данных), тоесть никакие переменные в нём находиться не могут. Код исполняется на всех процессорах. Необходима ссылка для адресации всех переменных. Где её можно хранить, при условии что код исполняется на любом IRQL ?
    Обычно я использовал страницу с PCR, доставляя IPI и загружая линк в конец страницы.
     
  2. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Первым ткну пальцем в.. небо.
    Именованные объекты можно создавать? Ну типа Mapping...
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Можно подробнее...
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Clerk
    если надо хранить только ссылку (это же 4\8 байт) - возможно использовать один из доступных MSR регистров (хотя это конечно очень зависимо от проца).
    Собственно на ум приходит только часть ядра которая доступна всем процессорам. Найти там область свободную (благо она небольшая) и там хранить данные. К примеру в образе nt kernel`а , который с проецирован в память.
    Это я назвал только то, что первое пришло на ум.
    Файлы\файловые потоки (вы сами сказали любой IRQL).
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    TermoSINteZ
    Для прогрузки мср нужно также IPI использовать. Хранить в модулях - нужен быстрый доступ к переменным, тогда где хранить смещение переменной в модуле.. можно конечно свободное пространство использовать, но его может и не быть.
    google
    Обьекты слишком медленно.
     
  6. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    KUSER_SHARED_DATA?
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    fsd
    Нет конечно, это ведь U-mode среда.
     
  8. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    а чобы не хранить в самом конце после отмутированого кода я ж так понимаю результирующий размер известен
     
  9. Clerk

    Clerk Забанен

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

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    ну а как чтобы двиг формировал псевдо инструкции ну для 32-х бит к примеру такую mov eax,adress_ ну и как нить её пометить и вшить в рандомное место морфируемого кода
     
  11. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    ну и модификации при само изменении чтобы инструкция менялась и метки оставались
     
  12. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    А да и оффтоп есть ли у кого семплы диких зверей один баянистый полиморф из текущего года и такой же пермутирующий
     
  13. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    все пажертвывания будут отмечены в стотие
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sl0n
    Не. Модель должна быть стандартной, так как заранее двиг, который будет исполнять морфинг не известный.
    Есть идея задать фиксированный адрес для блока, расположив его в конце пользовательского ап, или в начале системного. Так как лимиты дескрипторов ограничены MmHighestUserAddress, то выполнить доступ к этой странице из U-mode не удастся. Снизу она будет ограничена страницей NOACCESS, сверху тоже.
     
  15. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    ну ещё как вариант хмм регистр попользовать но система сама их юзоет .. сброситься .. . хз кароче как по уму сделать - остается тока вариант ага в ядре де нить хронить .. ну не обязательно в ядре в какой нить памяти с спец характеристиками
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sl0n
    MSR, NPX и прочие блоки локальны для процессора. С таким же успехом можно использовать TSS. У меня текущее решение следующее(без IPI):
    Код (Text):
    1. ; +
    2. ; Поиск переменной KiAbiosGdt.
    3. ;
    4. xQueryKiAbiosGdt proc uses ebx esi edi NtImageBase:PVOID, pKiAbiosGdt:PVOID, pKeNumberProcessors:PVOID
    5. Local ImageHeader:PIMAGE_NT_HEADERS
    6. Local Fn[3*4]:PVOID
    7.     Call SEH_Epilog_Reference
    8.     Call SEH_Prolog
    9.     invoke LdrImageNtHeader, NtImageBase, addr ImageHeader
    10.     test eax,eax
    11.     mov Fn[0],0D259263FH    ; HASH("KeI386AllocateGdtSelectors")
    12.     mov Fn[4],08B4DB3F5H    ; HASH("KeNumberProcessors")
    13.     mov Fn[2*4],eax
    14.     jnz Exit
    15.     invoke LdrEncodeEntriesList, NtImageBase, 0, addr Fn
    16.     test eax,eax
    17.     mov esi,Fn[0]   ; KeI386AllocateGdtSelectors
    18.     mov edi,pKiAbiosGdt
    19.     jnz Exit
    20.     lea ebx,[esi + 74H]
    21. Step:
    22.     movzx eax,word ptr [esi]
    23. ; 2B15 XXXXXXXX sub edx,dword ptr ds:[_KiAbiosGdt]
    24.     cmp al,2BH  ; 2B /r sub r32,r/m32
    25.     jne Next
    26.     mov al,ah   ; ModR/M
    27.     test ah,MODRM_MOD_MASK
    28.     jnz Next
    29.     and al,MODRM_RM_MASK
    30.     shr ah,3
    31.     cmp al,101B
    32.     jne Next
    33.     cmp ah,2
    34.     ja Next
    35.     mov ecx,dword ptr [esi + 2] ; _KiAbiosGdt
    36.     mov edx,Fn[4]   ; KeNumberProcessors
    37.     mov ebx,pKeNumberProcessors
    38.     xor eax,eax
    39.     mov dword ptr [edi],ecx
    40.     mov dword ptr [ebx],edx
    41.     jmp Exit   
    42. Next:
    43.     Call VirXasm32
    44.     add esi,eax
    45.     cmp ebx,esi
    46.     ja Step
    47.     mov eax,STATUS_NOT_FOUND
    48.     jmp Exit
    49. SEH_Epilog_Reference:
    50.     %GET_CURRENT_GRAPH_ENTRY
    51. Exit:
    52.     Call SEH_Epilog
    53.     ret
    54. xQueryKiAbiosGdt endp
    55.  
    56. ; +
    57. ; Загрузка переменной в KPCR всех процессоров.
    58. ; o Disp < X86_PAGE_SIZE
    59. ; o Адресация переменной посредством FS:[Disp].
    60. ;
    61. xLoadVariableInPcrs proc uses ebx esi edi pKiAbiosGdt:PVOID, NumberProcessors:ULONG, Variable:PVOID, Disp:ULONG
    62.     Call SEH_Epilog_Reference
    63.     Call SEH_Prolog
    64.     mov edi,pKiAbiosGdt
    65.     cmp NumberProcessors,32
    66.     mov eax,1
    67.     ja Error
    68.     cmp NumberProcessors,0
    69.     jne @f
    70.     cpuid
    71.     shr ebx,16
    72.     mov byte ptr [NumberProcessors],bl 
    73. @@:
    74.     mov esi,dword ptr [edi] ; PKGDT
    75.     xor eax,eax
    76.     xor ecx,ecx
    77.     xor edx,edx
    78.     xor ebx,ebx
    79.     lock cmpxchg8b qword ptr [esi + KGDT_R0_PCR]    ; -> Edx:Eax
    80.     mov ecx,edx
    81.     btr edx,8   ; A
    82.     mov ebx,Variable
    83.     cmp dh,10010010B    ; P:1, DPL:0, S:1, Type:001(DATA, RW)
    84.     jne Error
    85.     cmp ax,1    ; Limit
    86.     mov ecx,edx
    87.     jne Error
    88.     shr ecx,8
    89.     and ch,11001111B
    90.     mov al,dl   ; Base: 23%16
    91.     cmp ch,11000000B    ; G:1, ; D:1
    92.     jne Error
    93.     and edx,0FF000000H  ; Base: 31%24
    94.     ror eax,16
    95.     mov ecx,Disp
    96.     or eax,edx  ; PKPCR
    97.     mov dword ptr [eax + ecx],ebx
    98.     add edi,4
    99.     dec NumberProcessors
    100.     jnz @b
    101.     xor eax,eax
    102.     jmp Exit
    103. Error:
    104.     mov eax,STATUS_UNSUCCESSFUL
    105.     jmp Exit
    106. SEH_Epilog_Reference:
    107.     %GET_CURRENT_GRAPH_ENTRY
    108. Exit:
    109.     Call SEH_Epilog
    110.     ret
    111. xLoadVariableInPcrs endp
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sl0n
    Базу ядра хранить тоже гдето нужно, чтобы к нему обращаться.
     
  18. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Clerk
    Базу ядра на момент инициализации морфера можно 1 раз вычислить и хранить а в какой нибудь области кода морфера (можно даже неявно). Все-же база - это 4\8 байт. Не много.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    TermoSINteZ
    Именно в этом и вопрос. Хранить в коде нельзя. Просто потому, что нет нормального способа это сделать.
     
  20. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    ну а как дебильный вариант пронюхать место в ядре статик ... на разных осях и его по бычьи пробить .. ну с новым сп всё перепроверить придёцо