Отличить функцию от переменной в экспорте

Тема в разделе "WASM.NT.KERNEL", создана пользователем Denwer, 15 апр 2007.

  1. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Собственно вот в чем вопрос, можно ли как то отличить что экспортируется, функция или переменная, могу в принципе уточнить, из ядра экспортируется например KeServiceDesriptoTable, существует ли алгоритм определения что это не функция. Сравнение по именам не предлагать :).
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Например можешь посмотреть на диске по этому адресу лежит DWORD: 0. Если да, то скорее всего это переменная.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    на 99% )
    только обратное неверно - если это переменная, там не обязательно лежит 0. тем более она может быть не DWORD, а, например, всего лишь WORD :)

    Вариант получше - сравнить первый дворд со стандартными прологами вида

    Код (Text):
    1. enter 0, 0
    Код (Text):
    1. push ebp
    2. mov ebp, esp
    Код (Text):
    1. mov edi,edi
    2. push ebp
    3. mov ebp, esp
     
  4. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Да, с прологами идея вроде ниче, ща буду пробовать. А вот еще в голову что пришло, а таблица переаллокации не поможет никак?

    ПыСы: Воскресенье, а народ активный какой :)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    фиксапы чтоли? а чем они помогут то
     
  6. HoBleen

    HoBleen New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    77
    Просмотреть фиксапы, если по одному из адресов есть наш экспорт - то это переменная.

    P.S. согласен, не панацея =)
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    HoBleen
    Это тоже не панацея. А разве косвенного вызова быть не может?
    Например:
    Код (Text):
    1. mov esi, offset func
    2. call esi
    Для команды mov esi, offset func будет создан фиксап, потому что в ней абсолютный адрес используется, однако func - самая настоящая функция.
    Мало того, такие финты используются в ntdll и kernel32. Неисключено использование и в ядре.
    Такое часто используется при оптимизации последовательных вызовов одной функции, потому что, насколько я помню, call func / call func / call func длиннее, чем mov esi, offset func / call esi / call esi / call esi
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вообще универсального способа отличия быть не может, т.к. переменная может содержать код и вызываться как функция, и, наоборот, может быть чтение первого дворда функции (например для проверки целостности) и она будет использоваться как переменная.

    А если логически подумать, с точки зрения кода - переменная и функция одно и то же (за это бить не надо, я образно, конечно, выразился :))). Не зря их имена равноправно используются и кладутся в одну таблицу экспорта/импорта.

    Так что имеет смысл говорить лишь о вероятность обнаружения отличий тем или иным способом.


    UPD: Да, кстати, можно еще проверить банально принадлежность адреса секции кода или секции данных, хотя переменные в секции кода - не редкость
     
  9. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Млииин, просос в методе определения функции и данных. Например nt!NtAllocateVirtualMemory:
    Код (Text):
    1. 05a76d4 6818010000      push    118h
    2. 805a76d9 68989c4d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x17e8 (804d9c98)
    3. 805a76de e82d38f9ff      call    nt!wctomb+0x45 (8053af10)
    4. 805a76e3 33f6            xor     esi,esi
    5. 805a76e5 897598          mov     dword ptr [ebp-68h],esi
    6. 805a76e8 837d1015        cmp     dword ptr [ebp+10h],15h
     
  10. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Непонятно какого фига некоторые функции имеют такой вид.
     
  11. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    И еще кое что непонятное, ничего общего с сорцами nt!NtAllocateVirtualMemory этот код не имеет. Такое ощущение что NtAllocateVirtualMemory ссылается чер те знает куда, но не на тело настоящей функции.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм..чето все функции Nt* не имеют пролога
     
  13. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Имеют, ты просто не то навернео смотришь, нада смотреть реальное тело функции а не заголушку, которая вызывает прерывание 2E или сис энтер в Windows XP.
     
  14. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Смотри экспорт ядра, а не NDDLL.DLL
     
  15. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Например nt!NtDeleteAtom, с ним все впорядке.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Denwer
    есесно я смотрю ядро)) нафига мне сдалась ntdll.
    Я что говорю-то: в ядре много Nt* функций начинаются без пролога.. тока что посмотрел
    Например NtCreateSection
     
  17. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Ну да, много, но не все, причем непонятна причина, по какому принципу они такие. Может это как раз то, для чего и придумали в МС команду MOV EDI, EDI. Типа пропатчили некоторые функции, хотя на патч не похоже что то.
     
  18. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Еклмн, может причинато в том, что тип вызова Nt функций не такой как у других, тогда почему некоторые с прологом?
     
  19. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Похоже некоторую закономерность нашол, там первые две команды пуша что то делают с SEH, не может ли это связано быть с обработкой этого SEH, ну есть он и когда его нет?
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    короче чекай, что первая команда PUSH или MOV :P