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



         

Идентификация new и delete - часть 2


- функция new – одна из самых "популярных" библиотечных функций, - ищите функцию с "толпой" перекрестных ссылок;

- самое характерное: new возвращает указать this, а this очень легко идентифицировать даже при беглом просмотре кода (см. "Идентификация this");

- возвращенный new результат всегда проверяется на равенство нулю, и если он действительно равен нулю, конструктор (если он есть – см. "Идентификация конструктора и деструктора") не вызывается;

"Родимых пятен" у new более чем достаточно для быстрой и надежной идентификации, - тратить время на анализ ее кода совершенно ни к чему! Единственное, о чем следует помнить: new используется не только для создания новых экземпляров объектов, но и для выделения памяти под массивы (структуры) и изредка – одиночные переменные (типа int *x = new int, - что вообще маразм, но… некоторые так делают). К счастью, отличить два этих способа очень просто – ни у массивов, ни у структур, ни у одиночных переменных нет указателя this!

Давайте, для закрепления всего вышесказанного рассмотрим фрагмент кода, сгенерированного компилятором WATCOM (IDA PRO не распознает его "родную" new):

main_        proc near           ; CODE XREF: __CMain+40p

push   10h

call   __CHK

push   ebx

push   edx

mov    eax, 4

call   W?$nwn_ui_pnv

; это, как мы узнаем позднее, функция new. IDA

вообще-то распознала ее имя, но,

; чтобы узнать в этой "абракадабре" оператор выделения памяти – надо быть

; провидцем!

; Пока же обратим внимание, что она принимает один аргумент-константу

; очень небольшую по значению т.е. заведомо не являющуюся смещением

; (см. "Идентификация констант и смещений")

; Передача аргумента через регистр ни о чем не говорит – Watcom

так поступает

; со многими библиотечными функциями, напротив, другие компиляторы всегда

; заталкивают аргумент в стек...

mov    edx, eax

test   eax, eax

; Проверка результата, возвращенного функцией, на нулевое значение




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