Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Мануальная терапия

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #057, стр. 057-080-2


К сожалению, с прикладного уровня манипуляции со страницами невозможны. Ну, практически невозможны. Небольшая лазейка все-таки есть. Возьмем PE-файл. Как известно, он состоит из секций, то есть непрерывных фрагментов произвольной длины. С каждой секцией связан ряд атрибутов: name - имя; raw offset или просто offset - физическое смещение секции в файле; raw size - размер секции на диске; virtual address, или, сокращенно, va – адрес, по которому секция проецируется в память; virtual size, или v_sz - размер секции в памяти. Есть и другие атрибуты, но эти самые важные.

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

Имя секции может быть любым, операционная система все равно игнорирует его. А вот хакеры реагируют на нестандартные имена вполне адекватно. Чтобы не выделяться, лучше использовать имена вроде ".tsl" (Thread Local Storage - локальные данные потока) или ".rsrc" (сокращение от resource - ресурсы). Тот факт, что содержимое секции не совпадает с ее называнием, ничуть не смущает операционную систему, зато на бдительность хакера воздействует самым усыпительным образом.

Физическое смещение секции в файле должно быть кратно степени выравнивания, прописанной в заголовке файла в поле File Alignment. Линкер от Microsoft по умолчанию использует выравнивание в 1000h, а минимальная кратность выравнивания составляет 200h (и хотя Windows NT поддерживает гораздо меньшие значения в 20h и даже 10h, такой файл не сможет работать в Windows 9x, поэтому такое выравнивание в природе практически не встречается).

Виртуальный адрес секции должен быть выравнен на величину Section Alignment, также указанную в заголовке. По умолчанию она чаще всего равна 1000h или 4000h.

Если физический размер секции меньше виртуального, то она исправно грузится в память, а оставшийся хвост заполняется нулями. Если виртуальный размер меньше физического, проекция секции в память автоматически расширяется до физического размера. Короче говоря, из двух размеров всегда выбирается наибольший, и он автоматически округляется до ближайшего Section Aliment в большую сторону.

Виртуальный образ не может содержать никаких "дыр". Другими словами, на всем своем протяжении он должен быть непрерывен. Если мы попытаемся спроецировать секцию по произвольному виртуальному адресу, операционная система жестоко обломает нас. Поэтому виртуальные адреса секций лучше не трогать. Лучше (и безопаснее) оперировать с физическими. Так мы и поступим.

Назад на стр. 057-080-1  Содержание  Вперед на стр. 057-080-3