Что такое пещера кода и есть ли у нее законное применение?

Я впервые столкнулся с этим словом в вопросе StackOverflow «Теоретический код C #: напишите JMP в кодекаве в asm». Я вижу, что согласно Wiktionary, пещера кода:

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

Я нашел правильное определение? Если да, то есть ли законное использование пещеры для кода?


person Eddie    schedule 24.04.2009    source источник
comment
И немного не по теме вопрос: если нет законного использования для одного, должны ли мы голосовать, чтобы закрыть такие вопросы?   -  person Eddie    schedule 24.04.2009
comment
+1, у меня и у самого был такой же вопрос к тому самому посту.   -  person Adam Robinson    schedule 24.04.2009
comment
@ Эдди: Нет. Ответ на вопрос «нет» не отменяет его как вопрос.   -  person chaos    schedule 24.04.2009
comment
Нет, кто сказал, что мы не пишем антивирусное программное обеспечение. Чего мы пытаемся достичь, закрывая вопрос? Вы пытаетесь не дать информации ускользнуть? Знание - ваш друг.   -  person cgp    schedule 24.04.2009
comment
@Chaos и @altCognito: Вы подтвердили мои предпочтения. (Сокрытие информации вредит только хорошим парням.) Тем не менее, я бы не хотел даже случайно помочь кому-то, кто пытался стать взломщиком черных шляп.   -  person Eddie    schedule 25.04.2009


Ответы (9)


Я использовал их, хотя до сегодняшнего дня никогда не слышал термин code cave. Определение Wiktionary предполагает, что пещера кода - это то, что взломщик находит в исполняемом файле, который он или она пытается взломать. Вопрос, который вы цитируете, не использует его таким образом. Вместо этого он предполагает, что пещере кода выделяется VirtualAllocEx для создания нового блока памяти в целевом процессе. Это избавляет от необходимости искать неиспользуемое пространство в целевом объекте и гарантирует, что у вас будет достаточно места для размещения всего вашего нового кода.

В конечном счете, я думаю, что «пещера кода» - это просто место для хранения кода, сгенерированного во время выполнения. Этот код не должен иметь гнусной цели. И тогда вопрос о том, что такое пещера кода, становится совершенно неинтересным. Интересно то, что есть причины для генерации кода во время выполнения и какие есть методы, позволяющие убедиться, что новый код запускается тогда, когда вы этого хотите.

person Rob Kennedy    schedule 24.04.2009
comment
Есть много хороших ответов, но я выбрал ваш, потому что вы ответили не только на мой вопрос, но и на вопрос, который заставил меня задуматься, что такое пещера кода. (Людям, не выбранным в качестве ответа, которые все же дали хорошие ответы ... Я проголосовал за несколько хороших ответов. Спасибо!) - person Eddie; 25.04.2009

Можно намеренно создать "пещеру кода" как часть использования самомодифицирующегося кода.

Если, конечно, это безумие.

person chaos    schedule 24.04.2009
comment
Должен любить методы программирования, которые, хотя и полностью действительны, основаны на безумии программиста ... - person Shog9; 24.04.2009
comment
Интересный ответ, но есть ли гарантия, что ваш код не будет перезаписан? Разве кто-нибудь, пишущий самомодифицирующийся код, не защитит это пространство памяти? - person cgp; 24.04.2009
comment
Конечно. Он был бы защищен так же, как и любая другая часть программы (по модулю защиты исполняемого пространства, которая не могла быть применена к пещере кода). Утилита взлома кода пещеры основана не на том, что она освобождена от защиты памяти ОС; для того, чтобы его можно было вообще использовать, взломщик должен каким-то образом вводить в него данные (например, запускать программу под отладчиком). - person chaos; 24.04.2009
comment
+1: Слишком смешно. Мне и в голову не приходило, что это можно использовать как преднамеренный самомодифицирующийся механизм кода. Раньше (середина 80-х) это было в моде ... когда 4k было умеренным объемом ОЗУ, и приходилось использовать хитрости, чтобы ваш код умещался в отведенном пространстве. - person Eddie; 25.04.2009

Пещеры кода обычно создаются компиляторами для выравнивания и часто располагаются между функциями в большом количестве. Между структурами и переходами также должны быть пещеры кода (в некоторых архитектурах), но обычно не в значительных количествах.

Вы также можете искать блок обнуленной памяти, но нет гарантии, что программа не будет их использовать.

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

Изменить

Тем из вас, кто предлагает пещеры кода, предназначены только для кода, сгенерированного во время выполнения: это неполное определение. Много раз я писал структуру данных в «пещере кода» и обновлял указатели, указывающие туда, и подозреваю, что я не единственный, кто это сделал.

person Unknown    schedule 24.04.2009

некоторые законные применения: исправление исполняемых файлов операционной системы без перезагрузки (это делает MS), подключение низкоуровневой функциональности ОС (файловая система, сеть) для брандмауэра и антивируса, расширение приложения, когда у вас нет исходного кода (например, очистка низкоуровневых вызовов ОС в DrawText, чтобы вы могли читать их вслух для слепых)

person Dustin Getz    schedule 24.04.2009

Его описание здесь напоминает мне patchpoints - законное использование.

person Dan    schedule 24.04.2009

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

person DanM    schedule 24.04.2009

Его можно использовать для внедрения кода во время выполнения. Его можно использовать для написания самомодифицирующегося кода на статических языках при условии, что ОС позволяет вам (бит NX не установлен и т. Д.). У него есть применение, но вы не должны думать об этом в своем типичном бизнес-приложении.

person jfclavette    schedule 24.04.2009

Мне это кажется правильным определением.

Что касается законного использования, позвольте мне сказать следующее: не делайте этого, если вы просто экспериментируете ради экспериментов и не готовы принять последствия.

Невозможно, чтобы этот тип вещей когда-либо попадал в производственный код:

  1. It is an enormous potential security problem. If it is possible to inject code into memory and then execute it, a malicious attacker can theoretically do, well, whatever they like.
  2. It is a code maintenance nightmare and debugging nightmare. If the code that ends up being run can change during runtime, it becomes almost impossible to track down errors and bugs.
person e.James    schedule 24.04.2009
comment
Если можно ввести код в память, а затем выполнить его ммммм в Windows, вы можете сделать это для каждого отдельного процесса, я предполагаю, что вы можете сделать это с правами root в любой ОС. - person Dustin Getz; 14.08.2009
comment
Это кошмар обслуживания кода и кошмар отладки, ни один здравомыслящий программист не будет вводить код во время выполнения, если они могут изменить исходный код. вы делаете это, когда вы абсолютный эксперт, у которого нет альтернатив. - person Dustin Getz; 14.08.2009
comment
@Dustin Getz, по поводу пункта №1: опытный программист с root-доступом может делать что угодно. Я имею в виду опасность наличия незащищенного кода в производственном программном обеспечении, которое может оставить программу открытой для злоумышленников, не имеющих доступа root. - person e.James; 14.08.2009
comment
@ Дастин Гетц, по поводу пункта 2: согласен. Как я сказал во второй строке своего ответа, вы должны быть готовы принять последствия. Остальные предупреждения предназначены для невменяемых программистов, и я могу сказать вам по опыту, что они действительно существуют. - person e.James; 15.08.2009
comment
наличие "пещеры" кода не оказывает никакого влияния на безопасность приложения. они просто артефакты компилятора. - person Dustin Getz; 15.08.2009
comment
Я не думаю, что это правильно, особенно в контексте этого вопроса. Вопрос, на который ссылается Эдди, описывает умышленную пещеру кода, как и многие ответы. Если ваше производственное программное обеспечение включает средство для внедрения и выполнения кода, это, несомненно, проблема безопасности, а не просто артефакт компилятора. - person e.James; 15.08.2009
comment
Этому 3 года, но, тем не менее, это неправильно. Если ваше производственное программное обеспечение включает средство для внедрения и выполнения кода, то возможному злоумышленнику все равно потребуется какой-то способ использовать это средство. Например, ему понадобится способ доступа к памяти приложения, либо путем внедрения кода (например, dll), либо записи в память приложений через другое приложение, либо путем прямого изменения шестнадцатеричного кода приложения. В любом из этих случаев он мог просто создать свою собственную пещеру кода или использовать вместо этого один из этих артефактов компилятора. Так что правильно, что наличие пещеры кода не оказывает никакого воздействия. - person Sascha Hennig; 04.04.2012

Самомодифицирующийся код не следует рассматривать легкомысленно, но иногда он может привести к значительному увеличению производительности. Если вы занимаетесь программированием очень долго, вы, вероятно, использовали это, даже не осознавая этого.

До широкого использования 486 и выше многие ПК не имели аппаратной поддержки плавающего режима. Это ставило людей, пишущих программы с плавающей запятой, перед дилеммой. Если бы они скомпилировали свою программу для использования встроенных инструкций с плавающей запятой, она бы быстро работала на машине с процессором с плавающей запятой, а не на машинах без такового. Если бы они скомпилировали свою программу с программной эмуляцией с плавающей запятой, она бы работала на всех машинах, но медленно даже на машинах с аппаратным обеспечением с плавающей запятой.

Многие библиотеки компиляторов использовали интересный трюк с самомодифицирующимся кодом. По умолчанию команда ловушки помещалась там, где требовалась операция с плавающей запятой. Обработчик прерывания либо эмулирует инструкцию в программном обеспечении, либо, если он обнаруживает, что она выполняется на машине с аппаратным обеспечением с плавающей запятой, он модифицирует код, заменяя инструкцию прерывания соответствующей аппаратной инструкцией с плавающей запятой, и выполняет ее. Результатом стало программное обеспечение, которое работало на всех машинах и работало почти так же быстро на машине с оборудованием с плавающей запятой, как если бы код был скомпилирован для прямого использования оборудования с плавающей запятой (поскольку большинство операций с высокой интенсивностью операций с плавающей запятой выполняются в циклах, которые выполняются много раз. ).

person Stephen C. Steel    schedule 24.04.2009
comment
Я знал о самомодифицирующемся коде. (Используется для игры с ASM в начале 80-х на микропроцессорах. 6809, 6502, Z-80 и т. Д.) Но я не рассматривал пещеры кода как механизм, позволяющий целенаправленно изменять код! - person Eddie; 25.04.2009