问题标签 [self-modifying]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - 重新加载 Ruby 中的自修改代码
在我之前的问题之后,让我对我到底想要什么更准确,更少混淆。我写了一个化学包,我决定所有化学物质和反应的名称都大写,例如“ATP”、“腺苷”、“脱氧胞苷”等。这让我可以写例如:
现在如果使用 ATP 磷酸化 GDP,使用具有催化常数的酶 NDPK
,我想写成:
我可以写:
但对我来说它似乎太湿了。看看如何reactant_1
,reactant_2
重复两次,同时ATP
,GDP
记住。简单的解决方案是:
以及将和定义为 、 的浓度的上下文中instance_eval
的速率查找块。这非常接近,但不完全是我想要的东西,这让我很生气。我什至可以用来查找块内使用了哪些化学物质,例如。_ATP
_GDP
ATP
GDP
RubyVM
通过解析这个,可以了解里面有什么名字:_ATP
和_GDP
. 但就像我说的,出于固执,我发现_ATP
,_GDP
丑陋。我只想说ATP
,GDP
或者也许[ATP]
,[GDP]
因为化学家使用括号来表示浓度。我知道这就是 Yusuke Endoh 所说的约束编码。我的问题是,这两种理想的语法中的任何一种都可以被打败吗?例如,有一个闭包lambda { ATP * GDP * NDPK_constant }
,拆卸它会给出:
可以看到getconstant
出现在第 7 行、第 10 行的:ATP
, :GDP
。在块外,ATP
常量GDP
包含ChemicalSpecies
实例,但在块内,我希望它们引用 ATP 和 GDP浓度。在常量本身具有不同含义的环境中,我没有找到任何方法来评估块(也就是说,除非我想在运行时使用肮脏的技巧临时重写常量,这是我不想要的)。我渴望的是能够getconstant :ATP
用例如替换这个 RubyVM 代码指令。send :_ATP, 0, nil, 24, <ic:0>
,然后例如。instance_eval
在一个环境中关闭_ATP
意味着ATP.concentration
......我知道我在问一些棘手的问题,再次抱歉......
至于第二个选项[ATP]
,[GDP]
那只需要在块内激活某种新的数组创建钩子,这样如果只有一个元素,即 a ChemicalSpecies
,则将返回其浓度而不是数组对象。我认为这同样是困难的,即使不是不可能的任务。
functional-programming - 函数式编程类似于自修改代码吗?
似乎有时函数式程序中的代码接受其他代码(函数)作为参数并对其进行修改并将其返回以供执行。它似乎类似于自修改代码。这是否意味着函数式程序的紧凑性与允许极其紧凑的自修改程序的原因相同?
excel - 使用将 Worksheet_activate 和 _deactivate 添加到现有工作表
我发现 Siddharth Rout 的用于添加新工作表和代码的出色代码,但我的需要有点不同。
我想将激活代码添加到现有工作表。我尝试用该工作表名称代替使用该.Name
属性,删除
并替换ws.Name
为我现有的工作表名称“工作”。它在那个时候爆炸。
使用现有示例中的代码检查 ws 对象显示 ws 对象的属性 Name 是一个简单的字符串,因此无法使用我现有的工作表的名称代替让我感到困惑。
为什么:
现有工作表“工作”最初是在没有激活代码的情况下创建的。它在这个多页多功能系统中的许多步骤中被大量使用,如果用户手动选择它,我想防止用户更改它 - 有理由让他在暂停交互期间查看它,做出决定 - - 但当我的 VBA 往返于它之间时,让它不受保护。
所以,我想插入保护工作表的激活代码——取消保护的停用代码可以是工作表的永久部分,不会造成伤害——因此,只要用户决定手动查看工作表,就可以保护工作表,每当我的 VBA 允许用户交互时,然后在用户离开工作表并返回交互时通过其 Deactivate 删除/更改该代码,因此它通常可以免费供我的代码使用,否则每次我的代码切换到它时都不会添加保护.
我将创建并永久保留 Unprotect deactivate 代码 - 不会造成伤害 - 所以它不会改变自己(这是一个可怕的禁忌)。如何?
对不起所有的话。我在 VBA 中用谷歌搜索“自我修改代码”的时间没有找到好的答案。
self-modifying - 自修改代码如何工作?
它是由某种算法或数学程序生成的,用于测试代码是否产生所需的结果并且没有运行时/堆栈错误?或者是否有其他类型的启发式过程来决定要进行哪些更改。
lisp - 同调性水平
这是对我之前的问题的跟进。我不相信 Lisp 代码与 Von Neumann 架构上的机器代码一样具有同义性。在我看来,在这两种情况下,代码都表示为数据,但很明显,您可以在机器代码中比在 Lisp 中更自由地利用此属性。
当乱搞机器代码时,自我修改代码非常容易,它总是会发生,通常是偶然的,并且(根据我的经验)会产生有趣的结果。在编写一个简单的“打印数字 0-15”程序时,我的一个指针可能会出现“减一”错误。我最终会不小心将寄存器 1 中的任何内容转储到包含下一条指令的内存地址中,而是执行随机指令。(当它是某种“goto”时总是很棒。上帝知道它会在哪里结束,以及在那之后它会做什么)
代码和数据之间确实没有分离。一切都同时是一条指令(即使它只是一个 NOP)、一个指针和一个普通的旧数字。代码可能会在您眼前发生变化。
请帮助我解决我一直在摸索的 Lisp 场景。假设我有以下程序:
现在我想要在这个程序中添加一些 Lisp 代码,这些代码会将 * 更改为 +,将 <= 更改为 >=,将 (+ 1 2 3) 粘贴到某处,并且通常会破坏函数向上。然后我希望程序执行导致的绝对混乱。
关键点:除非我在示例代码中犯了一些致命错误,否则您只能更改该-– More code goes here –-
部分。您在上面看到的是代码。我不希望您引用整个列表并将其存储在变量中,以便可以将其作为具有相同名称的单独函数进行操作和吐出;我不希望将阶乘的标准重新定义为完全不同的东西。我想要那个我可以在屏幕上看到的代码在我眼前改变,就像机器代码一样。
如果这是一个不可能/不合理的要求,那么它只会进一步巩固我的想法,即同音性不是一种语言具有或不具有的离散属性,它是一个频谱,而 Lisp 并不处于最前沿。(或者,Lisp 就像它们来的一样,我正在寻找其他术语来描述机器代码式的自我修改)
c - 使用自修改代码观察 x86 上的陈旧指令获取
我被告知并阅读了英特尔的手册,可以将指令写入内存,但指令预取队列已经获取了过时的指令并将执行那些旧指令。我一直未能成功观察到这种行为。我的方法如下。
英特尔软件开发手册第 11.6 节指出
对当前缓存在处理器中的代码段中的内存位置的写入会导致相关的缓存行(或多个行)无效。此检查基于指令的物理地址。此外,P6 系列和 Pentium 处理器检查对代码段的写入是否会修改已预取执行的指令。如果写入影响预取指令,则预取队列无效。后一种检查基于指令的线性地址。
所以,看起来如果我希望执行陈旧指令,我需要有两个不同的线性地址引用同一个物理页面。所以,我将一个文件内存映射到两个不同的地址。
我有一个汇编函数,它接受一个参数,一个指向我要更改的指令的指针。
在 C 语言中,我将代码复制到内存映射文件中。我从线性地址调用函数a1
,但我传递了一个指针a2
作为代码修改的目标。
如果 CPU 拾取修改后的代码,则 val==1。否则,如果执行了过时的指令(两个 nops),则 val==0。
我在 1.7GHz Intel Core i5 (2011 macbook air) 和 Intel(R) Xeon(R) CPU X3460 @ 2.80GHz 上运行它。然而,每次我看到 val==1 表明 CPU 总是注意到新指令。
有没有人经历过我想观察的行为?我的推理正确吗?我对手册中提到 P6 和 Pentium 处理器以及没有提到我的 Core i5 处理器感到有些困惑。也许是其他原因导致 CPU 刷新其指令预取队列?任何见解都会非常有帮助!
assembly - 如何编写在现代 x64 处理器上高效运行的自修改代码?
我正在尝试加速可变位宽整数压缩方案,并且我对动态生成和执行汇编代码感兴趣。目前很多时间都花在了错误预测的间接分支上,并且根据发现的一系列位宽生成代码似乎是避免这种惩罚的唯一方法。
一般技术被称为“子程序线程”(或“调用线程”,尽管这也有其他定义)。目标是利用处理器有效的调用/调用预测以避免停顿。该方法在这里得到了很好的描述: http ://webdocs.cs.ualberta.ca/~amaral/cascon/CDP05/slides/CDP05-berndl.pdf
生成的代码将只是一系列调用,然后是返回。如果有 5 个宽度为 [4,8,8,4,16] 的“块”,它看起来像:
在实际使用中,它会是一个较长的调用序列,具有足够的长度,每个序列可能是唯一的,并且只调用一次。生成和调用代码在此处和其他地方都有很好的记录。但是除了简单的“不要这样做”或经过深思熟虑的“有龙”之外,我还没有找到太多关于效率的讨论。甚至英特尔文档也大多笼统地说:
8.1.3 处理自修改和交叉修改代码
处理器将数据写入当前正在执行的代码段以将该数据作为代码执行的行为称为自修改代码。IA-32 处理器在执行自我修改的代码时表现出特定于模型的行为,具体取决于代码已被修改的当前执行指针提前多远。...自修改代码将以比非自修改或普通代码更低的性能水平执行。性能恶化的程度将取决于修改频率和代码的具体特性。
11.6 自修改代码
对当前缓存在处理器中的代码段中的内存位置的写入会导致相关的缓存行(或多个行)无效。此检查基于指令的物理地址。此外,P6 系列和 Pentium 处理器检查对代码段的写入是否会修改已预取执行的指令。如果写入影响预取指令,则预取队列无效。后一种检查基于指令的线性地址。对于 Pentium 4 和 Intel Xeon 处理器,在目标指令已解码并驻留在跟踪缓存中的代码段中写入或窥探指令会使整个跟踪缓存无效。
虽然有一个性能计数器来确定是否发生了坏事(C3 04 MACHINE_CLEARS.SMC: Number of self-modifying-code machine clears detected)我想知道更多细节,特别是对于 Haswell。我的印象是,只要我可以提前足够远地编写生成的代码,指令预取还没有到达那里,并且只要我不通过修改同一页面上的代码来触发 SMC 检测器(四分之一 -页?)作为当前正在执行的任何内容,那么我应该获得良好的性能。但所有细节似乎都非常模糊:太近了?多远才够远?
试图把这些变成具体的问题:
Haswell 预取器运行的当前指令之前的最大距离是多少?
Haswell“跟踪缓存”可能包含的当前指令后面的最大距离是多少?
Haswell 上 MACHINE_CLEARS.SMC 事件的实际循环惩罚是多少?
如何在预测循环中运行生成/执行循环,同时防止预取器吃掉自己的尾巴?
如何安排流程,以便始终“第一次看到”每条生成的代码,而不是踩到已经缓存的指令?
c - c中的自修改代码
有没有办法让代码在每次运行时自行修改。我的意思是添加新功能和修改现有功能。例如,如果我有一个运行特定功能的 ac 程序来检查文件是否存在,我可以修改程序,以便在运行时我可以让它打开另一个文件并永久存储这个新程序。
例子:
在上述函数中,act_arg 预先解析了命令行参数。现在这个函数可以回答如下问题:
清单有什么作用?(或)列出所有文件
现在我希望它在执行过程中修改自己,如果用户希望它通过添加类似方法来处理 cp 命令。意味着它接受:
cp是做什么的?(或)将文件一复制到文件二
使用副本作为关键字。
c - 在 Linux C 程序中写入自己的可执行文件,错误“文本文件忙”
对于一个安全类,我应该为一个程序编写自修改代码,该程序在磁盘上找到自己的可执行文件,读取二进制数据,并在将其写回磁盘之前加密其中的一部分。这应该就像一种多态病毒,它会改变自身以欺骗检测已知签名的防病毒扫描程序。
我已经准备好了所有的部分:
- 我正在使用
/proc/self/exe
. - 我正在使用一个简单的 AES 实现来加密可执行文件中一些虚拟代码中的 16 字节字符串。
- 我能够读取二进制数据并找到我需要加密的部分。
我的问题是我能够打开可执行文件的唯一方法是只读模式"rb"
。如果我尝试打开文件以在模式下写入,"wb"
或者"r+b"
我得到错误"Text file busy"
。无论如何,我是否可以在 C 中写入进程自己的可执行文件?我可以通过以某种方式更改权限来做到这一点吗?
编辑:我想要完成的是拥有一个可执行文件,它每次运行时都会对自身的一部分进行加密,以便每次运行后都会有一个新的校验和。
从可执行二进制文件中读取数据后,我该如何写回它或删除它并用具有相同文件名的新文件替换它?
c - 为什么函数的引用在 C 中的自修改代码中丢失了?
我试图理解为什么在用 C 语言编写自修改代码时应该取消引用函数。
即使它以这种方式工作,我也想知道为什么!
这是我正在处理的一个示例:http: //nmav.gnutls.org/2011/12/self-modifying-code-using-gcc.html
我问了博客里的那个人,但他从来没有回答:(