На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Компонент перехвата API , Использование stdcall для функций-членов класса
    Доброго времени суток!

    Подскажите пожалуйста как перехватить API функции на в компоненте (GetProcAddress, LoadLibrary, etc.) - требуется написать компонент для перехвата API функций.

    Или подскажите как можно решить проблемму с вложенными функциями - из вложенной функции нет доступа к функциям-членам класса при подобном обьявлении:

    ExpandedWrap disabled
        
        procedure TSomeClass.SomeFunction(...);
         function SomeSubFunction : SomeType;
         begin
         end;
        begin
        end;
    Сообщение отредактировано: Docent -
      По второму вопросу. Я бы переписал функцию вот так
      ExpandedWrap disabled
          
          procedure TSomeClass.SomeFunction(...);
           function SomeSubFunction(Self: TSomeClass) : SomeType;
           begin
             with Self do
             begin
             end;
           end;
          begin
            // А вот так её вызываем
            SomeSubFunction(Self);
          end;


      По первому вопросу.
      1. С помощью GetProcAddress находим местоположение интересующих нас функций.
      2. Патчим начало перехватываемой функции таким образом, чтобы управление переходило к функции её заменяющей. То есть записываем в начало функции конструкцию вида
      ExpandedWrap disabled
               jmp OurFunction ; Переход на OurFunction, 5 байт

      В принципе, этого достаточно при условии, что вся логика, реализованная в перехватываемой функции, реализуется функцией её заменяющей. Если же необходимо, чтобы управление возвращалось в итоге в перехватываемую функцию, нужно в конец заменяющей функции добавить первые несколько байт из заменяемой функции, которые мы заменяем на jmp OurFunction (эти байты обычно называеют stollen bytes - украденные байты), таким образом, чтобы не нарушалась логика её работы. Допустим в начале заменяемой функции идет такая конструкиция:
      ExpandedWrap disabled
               push ebp
               mov ebp, esp
               push -1

      Это как раз и будет 5 байт, значит нужно добавить в конец заменяющей функции следующую конструкцию.
      ExpandedWrap disabled
               push ebp
               mov ebp, esp
               push -1
               jmp OldFunction+5 ; Переход на адрес OldFunction+5


      Вот в таком вот ключе. То, что я здесь написал, только общее описание процесса. Для более подробной информации можно почитать статьи на http://wasm32.ru
        Цитата Karbazol @
        2. Патчим начало перехватываемой функции ...

        Немного дополню :)
        Можно обойтись без изменений самих API, достаточно в процессе-жертве произвести поиск нужного нам адреса нашей API. Точнее если LoadLibrary имеет адрес 12345678, то мы должны пробороздить всю память (для первого раза сойдет) в поисках этого значения :) ... и для ускорения поиска (по моей наблюдательности) мы должны смещаться по 4 байта :) ... я это раньше практиковал.

        Ну а сейчас, сейчас запускаю нужный процесс и патчу LdrGetProcAddress, а при помощи него "подставляю" свои API ... без всякого пропатчивания и сканировании памяти :)

        ps. И немного посмотри этот сайт http://ms-rem.dot-link.net/ ...
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0349 ]   [ 17 queries used ]   [ Generated: 19.04.24, 23:56 GMT ]