Фундаментальные основы хакерства




Идентификация виртуальных функций - часть 22


pop    ecx

retn  

main   endp

demo_call    proc near           ; CODE XREF: sub_0_401030+5p

arg_0        = dword      ptr  8

; вот-с! указатель – аргумент, а к виртуальным таблицам идет обращение

; через регистр...

push   ebp

mov    ebp, esp

push   esi

mov    esi, [ebp+arg_0]

call   dword ptr [esi]

; происходит двухуровневый вызов функции – по указателю на массив

; указателей на функцию, что характерно для вызова виртуальных функций

; но, опять-таки слишком тривиальный код, - вызов виртуальных функций

; сопряжен с большой избыточностью, а во-вторых опять нет указателя this

call   dword ptr [esi+4]

; аналогично – слишком просто для вызова виртуальной функции

pop    esi

pop    ebp

retn  

demo_call    endp

Like_VTBL    dd offset demo_1    ; DATA XREF:main

dd offset demo_2

; массив указателей внешне похож на виртуальную таблицу, но

; расположен "не там" где обычно располагаются виртуальные таблицы

Листинг 37

Обобщая выводы, разбросанные по комментариям, повторим основные признаки "подделки" еще раз:

- слишком тривиальный код, - минимум используемых регистров и никакой избыточности, обращение к виртуальным таблицам происходит куда витиеватее;

- указатель на виртуальную функцию заносится в экземпляр объекта, и передается он не через стек, а через регистр (точнее – см. "Идентификация this");

- отсутствует указатель this, всегда подготавливаемый перед вызовом виртуальной функции;

- виртуальные функции и статические переменные располагаются в различных местах сегмента данных – поэтому сразу можно отличить одни от других.

А можно ли так организовать вызов функции по ссылке, чтобы компиляция программы давала код идентичный вызову виртуальной функции? Как сказать… Теоретически да, но практически – едва ли такое удастся осуществить (а уж непреднамеренно – тем более). Код вызова виртуальных функций в связи с большой избыточностью очень специфичен и легко различим "на глаз".Легко сымитировать общую технику работы с виртуальными таблицами, но без ассемблерных вставок невозможно воспроизвести ее в точности.

::заключение.

Вообще же, как мы видим, работа с виртуальными функциями сопряжена с огромной избыточностью и "тормозами", а их анализ связан с большими трудозатратами – приходится постоянно держать в голове множество указателей и помнить какой из них на что указывает. Но, как бы там ни было, никаких принципиально-неразрешимых преград перед исследователем не стоит.




Содержание  Назад  Вперед