Уроки Iczelion'а

       

Получение имен функций и общего размера параметров


Это наиболее сложная часть процесса. Если у вас есть только DLL, вам

предстоит утомительное приключение. Hиже изложены несколько методов,

которые вы можете использовать, хотя ни один из них не дает 100 гарантию.

  • Используйте Interactive Disassembler (IDA), чтобы дизассемблировать

    DLL. С помощью этого чудесного инструмента вы можете получить полный

    размер параметров, принимаемых функцией. Однако это не совершенный

    способ. IDA - потрясающий дизассемблер, но иногда только человек может

    решить что есть что. Вам надо будет подумать и проработать весь листинг.

  • Следите за значением указателя на стек до и после вызова всех

    функций в DLL. Метод состоит в следующем:

  • Получить адрес функций с помощью GetProcAddress.
  • Вызвать каждую функцию не передавая ей никаких параметров через

    стек. Запомнить значение esp до вызова.



  • Когда функция возвратит управление, сравнить значение esр после

    вызова с тем, что было перед вызовом. Логическое обоснование здесь

    следующее: при передаче параметров в формате stdcall, функция берет на

    себя ответственность соблюдения стекового баланса. Разность значений

    esр и будет размером параметров, ожидаемых функцией.

  • Увы, этот метод не безупречен. Он может не удастся в следующих

    обстоятельствах.

    • Если функции в DLL используют другое соглашение передачи

      параметров, отличное от stdcall или рascal.

    • Если функции не удается очистить стек, например при возникновении

      исключения.

    • Если интересующие нас функции служат для чего-нибудь опасного,

      например для форматирования винта (Упаси Господь!)

    • Изучите существующие программы, которые используют нужную DLL. Вы

      можете отладить/дизассемблировать эти программы, чтобы увидеть

      количество и размер параметров, передаваемых функциям в DLL. Тем не

      менее, если в DLL есть функции, которые не используются ни в одной из

      доступной вам программ, этот метод не будет работать.



    • Содержание раздела