Что такое пещера кода и там какое-либо законное использование для одного?

Немного новее:

Вы должны использовать как:

const alertPlay = () => () => alert("play");

И в вашем html, это должно быть просто: (Не требуются круглые скобки)

onclick="alertPlay"

[ 1116] Если вы хотите передать динамическое значение, а не просто play, вам нужно использовать следующее:

const alertPlay = (str) => () => alert(str);

HTML:

onclick="alertPlay('play')"

Функциональный блок второй стрелки должен передать событие, если вы хотите:

const alertPlay = (str) => (e) => {
  console.log(e, str);
}

Фактический ответ, который соответствует вашим интересам:

Кстати, () => () => {} - это метод публичного класса . В противном случае вы можете использовать встроенную функцию стрелки, например:

onclick="() => alertPlay('play')"

JS:

const alertPlay = (str) => alert(str);

Или без каких-либо параметров:

const alertPlay = () => alert('play');

HTML:

[ 118]

25
задан Community 23 May 2017 в 12:09
поделиться

9 ответов

I've used them, although I'd never heard the term code cave until today. The Wiktionary definition suggests that a code cave is something the cracker finds in the executable he or she is attempting to crack. The question you cite doesn't use it that way. Instead, it suggests the code cave is being allocated with VirtualAllocEx to create a brand new block of memory in the target process. That removes the need to search for unused space in the target, and it guarantees you'll have enough space to put all your new code.

Ultimately, I think a "code cave" is just a place to store run-time-generated code. There doesn't have to be any nefarious purpose to that code. And at that point, the question of what a code cave is becomes entirely uninteresting. The interesting parts are what reasons there are for generating code at run time, and what techniques there are for making sure that new code gets run when you want it.

12
ответ дан 28 November 2019 в 18:00
поделиться

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

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

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

Править

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

14
ответ дан 28 November 2019 в 18:00
поделиться

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

Предполагая, конечно, что это безумие.

18
ответ дан 28 November 2019 в 18:00
поделиться

some legitimate uses: patching live OS binaries without a reboot (MS does this), hooking low level OS functionality (filesystem, network) for firewall and antivirus, extending an application when you don't have source code (like scraping low level OS calls to DrawText so you can read them aloud for blind people)

9
ответ дан 28 November 2019 в 18:00
поделиться

То, как здесь описано , напоминает мне о контрольных точках - законное использование.

7
ответ дан 28 November 2019 в 18:00
поделиться

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

5
ответ дан 28 November 2019 в 18:00
поделиться

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

4
ответ дан 28 November 2019 в 18:00
поделиться

Для меня это звучит как правильное определение.

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

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

  1. Это огромная потенциальная проблема безопасности. Если есть возможность вставить код в память и затем выполнить его, злоумышленник теоретически может делать все, что угодно.
  2. Это кошмар обслуживания кода и кошмар отладки. Если код, который завершается выполнением, может измениться во время выполнения, становится практически невозможно отследить ошибки и ошибки.
4
ответ дан 28 November 2019 в 18:00
поделиться

Self-modifying code should not be considered lightly, but can sometimes bring big performance gains. If you've been programming for very long, you've probably used it without realizing it.

Prior to the widespread use of the 486 and higher, many PCs did not include hardware floating support. This left people writing programs involving floating point with a dilemma. If they compiled their program to use in-line floating point instructions it would run fast on a machine with a floating point processor, and not at all on machines without one. If they compiled their program with software floating point emulation, it would run on all machines, but slowly even on machines with hardware floating point.

Many compilers libraries used an interesting trick with self-modifying code. The default behavior was to put a trap instruction where a floating point operation was needed. The trap handler would either emulate the instruction in software, or if it detected it was running on a machine with floating point hardware, it would modify the code by replacing the trap instruction with the appropriate hardware floating point instruction and execute it. The result was software that ran on all machines, and ran almost as fast on a machine with floating point hardware as if the code had been compiled to use floating point hardware directly (since most floating point intensive operations occur in loops that are executed many times).

3
ответ дан 28 November 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: