问题标签 [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.

0 投票
7 回答
23266 浏览

assembly - 如何在 x86 汇编中编写自修改代码

我正在考虑为我最近一直在研究的爱好虚拟机编写 JIT 编译器。我知道一点汇编,(我主要是一名 C 程序员。我可以阅读大多数汇编,参考我不理解的操作码,并编写一些简单的程序。)但我很难理解几个例子我在网上找到的自修改代码。

这是一个这样的例子:http ://asm.sourceforge.net/articles/smc.html

提供的示例程序在运行时做了大约四种不同的修改,没有一个被清楚地解释过。Linux 内核中断多次使用,不作解释或详细说明。(作者在调用中断之前将数据移动到多个寄存器中。我假设他正在传递参数,但根本没有解释这些参数,让读者猜测。)

我正在寻找的是自修改程序代码中最简单、最直接的示例。我可以查看并使用它来了解如何编写 x86 程序集中的自修改代码,以及它是如何工作的。您是否可以指出我的任何资源,或者您可以提供的任何示例来充分证明这一点?

我正在使用 NASM 作为我的汇编程序。

编辑:我也在 Linux 上运行这段代码。

0 投票
2 回答
5799 浏览

c - 在汇编中编写 JIT 编译器

我用 C 语言编写了一个虚拟机,它对于非 JIT 虚拟机具有不错的性能,但我想学习一些新东西并提高性能。我当前的实现只是使用一个开关将 VM 字节码转换为指令,然后编译为跳转表。就像我说的那样,性能不错,但我遇到了只能通过 JIT 编译器克服的障碍。

不久前我已经问过一个关于自修改代码的类似问题,但我意识到我没有问对正确的问题。

所以我的目标是为这个 C 虚拟机写一个 JIT 编译器,我想用 x86 汇编来做。(我使用 NASM 作为我的汇编程序)我不太确定如何去做。我对汇编很满意,并且查看了一些自修改代码示例,但我还没有弄清楚如何进行代码生成。

到目前为止,我的主要工作是将指令复制到可执行内存中,并带有我的参数。我知道我可以在 NASM 中标记某行,并使用静态参数从该地址复制整行,但这不是很动态,并且不适用于 JIT 编译器。我需要能够解释来自字节码的指令,将其复制到可执行内存,解释第一个参数,将其复制到内存,然后解释第二个参数,并将其复制到内存。

我被告知有几个库可以使这项任务变得更容易,例如 GNU Lightning,甚至 LLVM。但是,在使用外部资源之前,我想先手动编写它,以了解它是如何工作的。

该社区是否可以提供任何资源或示例来帮助我开始执行此任务?一个简单的例子展示了两个或三个指令,如“add”和“mov”,用于在内存中动态生成可执行代码,并带有参数,会产生奇迹。

0 投票
16 回答
7063 浏览

executable - 是否有任何运行时代码修改的智能案例?

你能想到运行时代码修改的任何合法(智能)用途(程序在运行时修改它自己的代码)吗?

现代操作系统似乎不赞成执行此操作的程序,因为病毒已使用此技术来避免检测。

我能想到的只是某种运行时优化,它可以通过在运行时知道一些在编译时无法知道的东西来删除或添加一些代码。

0 投票
5 回答
3331 浏览

c++ - C++ 布尔变量更改

我有一个 C++ 类;这个类如下:

首先,标题:

和 .cpp 文件

我在 .cpp 文件中涉及 _modified 的所有 3 行上设置了一个断点,这样我就可以准确地看到它们被设置/更改/读取的位置。顺序如下:

  1. 构造函数中的断点被触发。_modified 变量确认设置为true
  2. 访问器中的断点被触发。_modified 变量为假!

这发生在每个 PageTableEntry 实例中。类本身并没有改变变量 - 别的东西是。不幸的是,我不知道是什么。该类是使用 new 动态创建的,并被传递(作为指针)到各种 STL 结构,包括向量和映射。我自己的代码永远不会调用 mutator(我还没有达到那一点),并且 STL 结构不应该能够,并且由于从未在 mutator 上调用断点,我只能假设它们不是.

显然有一些“陷阱”,在某些情况下,私有变量可以在不通过类的 mutator 的情况下被更改,由谁知道什么情况触发,但我无法想象它会是什么。有什么想法吗?

更新:每个阶段的值:构造
函数 1:0x100100210
构造函数 2:0x100100400访问器
1:0x1001003f0 访问器
2:0x100100440

UPDATE2:(
显示访问 PageTableEntry 的位置的代码)

这些是 PageTableEntry 对象在 STL 结构中存储和检索以导致问题的唯一点。所有其他函数都使用 testAddr() 函数来检索条目。

不相关:由于 C++ 现在有 65663 个问题,而到目前为止,今天已经提出了 164 个问题,这意味着就在今天,C++ 标记问题的数量超过了 16 位无符号整数。有用?不,有趣吗?是的。:)

0 投票
2 回答
8825 浏览

c++ - 自修改代码 [C++]

我正在阅读一篇关于自我修改代码的代码破解者期刊文章,其中有以下代码片段:

这段代码应该在堆栈上执行 Demo()。我了解大部分代码,但他们分配“func_len”的部分让我感到困惑。据我所知,他们从另一个随机指针地址中减去一个随机指针地址。

有人愿意解释吗?

0 投票
2 回答
2410 浏览

powershell - 是否可以编写自修改 PowerShell 脚本?

是否可以编写自修改 PowerShell 脚本?

假设我有一个名为的脚本foo.ps1

这个脚本打印出来Hello world。我可以使用什么技术将其打印出来Goodbye world

0 投票
2 回答
1999 浏览

c - C 标准是否允许自修改代码?

是否可以在 C 中以可移植的方式进行自修改代码?

我问的原因是,在某种程度上,OOP 依赖于自我修改代码(因为在运行时执行的代码实际上是作为数据生成的,例如在 v 表中),然而,似乎,如果这太过分了,它会阻止编译器中的大多数优化。

例如:

优化编译器可以提升*pAddend循环外,因为它不会干扰p. 但是,这不再是自修改代码中的有效优化

这样看来,C 语言似乎不允许自我修改代码,但同时,这是否意味着您不能在 C 语言中做一些诸如 OOP 之类的事情?C 真的支持自修改代码吗?

0 投票
11 回答
41317 浏览

c - 如何用 C 编写自修改代码?

我想写一段不断改变自己的代码,即使改变是微不足道的。

例如,也许像

code>

假设我希望我的代码在第一次迭代后将行更改x := 200为其他行x := 199,然后在下一次迭代后将其更改为x := 198依此类推。

写这样的代码可能吗?我需要为此使用内联汇编吗?

编辑:这就是为什么我想在 C 中这样做:

该程序将在实验性操作系统上运行,我不能/不知道如何使用从其他语言编译的程序。我需要这样的代码的真正原因是因为此代码正在虚拟机上的来宾操作系统上运行。管理程序是一个二进制翻译器,用于翻译代码块。翻译器做了一些优化。它只翻译一次代码块。下次在客户机中使用相同的块时,翻译器将使用先前翻译的结果。现在,如果代码被即时修改,那么翻译者会注意到这一点,并将其先前的翻译标记为过时的。从而迫使重新翻译相同的代码。这就是我想要达到的,强迫译者做很多翻译。通常,这些块是分支指令(例如跳转指令)之间的指令。我只是认为自我修改代码将是实现这一目标的绝佳方式。

0 投票
1 回答
314 浏览

mips - 我可以将存储在寄存器中的数字作为 MIPS 中的指令执行吗?

如果我接受一条指令并将其分解为其操作码、rs、rt 等的二进制表示...然后我可以将此二进制数放入寄存器并让 MIPS 将其视为指令吗?

例如:

指令: add $t0, $s0, $t0

分解为:

000000 10010 01000 01000 00000 100000

对应整数:18696

我可以将此整数存储在寄存器中,然后让 MIPS 将其视为指令吗?

我提出这个问题时考虑到了自我修改代码的想法。

0 投票
5 回答
951 浏览

self-modifying - 是否有任何真正的应用程序正在自我修改代码?

网上很少有示例演示如何编写自修改代码。但它们只是示例。我想知道是否有任何真正的应用程序正在自我修改代码。谢谢!