问题标签 [dynamic-code]
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.
c# - 如何在运行时计算表达式参数?
我需要解决的问题是通过 IF 语句运行数据。IF 语句由运行时的 SQL 表生成。
我已经设法通过使用表达式和 Lambda 表达式来做到这一点。
我的表有 memberName;操作员; 目标。例如,我从表中得到“Age”、“GreaterThan”和“40”,然后编译它。
我得到一个真值或假值,它工作得很好。
这对于像“Age > 30”这样的简单 if 语句非常有用
但是现在我需要它更复杂,通过在 if 语句中嵌套计算,例如我需要处理像“Age > (30 / 2)”这样的语句
任何人都知道我如何调整我的规则引擎以进行计算。
如果我可以将从表中获得的目标值解析为代码并在方法中执行它并返回单个值然后创建规则,但我不确定如何在运行时获取字符串,解析为代码并执行它。
我走进了表达式树的兔子洞,以为这可能是我的答案,但我意识到表达式树只是一种可视数据结构,而不是执行的代码。
如果像这样的规则引擎已经存在,那就太好了,但我还没有真正看到过类似的东西。
python - 为什么我要在 Python 中传递动态函数时遇到问题
我将一个函数动态传递给另一个类,如下所示
但我面临以下错误:
我猜它与范围有关,但我无法处理任何人?
编辑 :
这是一个更简单的代码,显示了问题:
c# - Microsoft.CodeAnalysis:使用 Newtonsoft JObject 编译动态代码时出错
我有一个无法解决的奇怪问题。我大部分时间都在成功编译动态程序集,但在编译以下行时遇到了一个奇怪的问题:
返回新的 JObject().Properties().ElementAt(0).Value();
出现错误:
当在项目中创建为真实类时,发出的文本输出可以正常工作,但在动态程序集中则不行。该项目是一个 asp.net core 2.2 项目,它引用了一个创建动态程序集的程序集。
这是创建程序集的代码:
(显示的代码不用于工作目的,它被简化以演示问题)
提前致谢,
c# - Jint 有没有办法将函数存储到 Func 中?
我正在使用 Jint 为我的 C# 代码动态运行函数。它非常适合运行这些功能。然而,每次执行的执行时间是线性的
我将运行这些功能可能超过 100 万次。目前此代码需要 126197 毫秒(2 分钟 6 秒)才能运行!有没有办法在引擎读取函数后将函数存储在 C# 中?或者是否有另一个库可以在更快的时间内处理这么多的执行?
编辑
我在想这样的事情:
谢谢,
c - 动态 C 代码执行:内存引用
tl; dr:我正在尝试从另一个片段中动态执行一些代码。但是我坚持处理内存引用(例如mov 40200b, %rdi
):我可以修补我的代码或运行代码的片段以便0x40200b
正确解析(作为200b
代码的偏移量)吗?
为了生成要动态执行的代码,我从一个(内核)对象开始,并使用 ld 解析引用。
然后我通过一个映射文件传输要执行的代码
我用这段代码动态地执行代码
这种方法适用于不访问内存的代码,例如"\x55\x48\x89\xe5\xc7\x45\xf8\x02\x00\x00\x00\xc7\x45\xfc\x03\x00\x00\x00\x8b\x55\xf8\x8b\x45\xfc\x01\xd0\x5d\xc3"
当涉及内存时我遇到问题。
请参见下面的示例。
假设我不想动态执行函数 vm_close。Objdump -d -S
返回:
在执行时,我的函数指针指向正确的代码:
但是,此代码将失败,因为:
1)在我的上下文中 $0x40200b 指向物理地址$0x40200b
,而不是offset 200b
从代码的开头。
2)我不明白为什么,但那里显示的地址实际上与正确的地址不同(0xffffc8ff818ec3de!= ffffffff810e73de)所以它不会指向我的符号并且会崩溃。
有没有办法解决我的两个问题?
另外,我很难找到与我的问题(低级内存分辨率)相关的好文档,如果你能给我一些,那真的对我有帮助。
编辑:由于我在内核中运行代码,我不能简单地用 gcc ( )-fPIC
或-fpie
不允许的代码编译代码cc1: error: code model kernel does not support PIC mode
编辑 24/09:
根据@Peter Cordes 的评论,我重新编译它添加mcmodel=small -fpie -mno-red-zone -mnosse
到 Makefile ( /lib/modules/$(uname -r)fixed/build/Makefile
) 这比原始版本更好,因为在链接之前生成的代码现在是:
因此,我现在可以访问脚本中的其他变量了……</p>
因此,链接后,我可以成功访问嵌入在缓冲区中的变量。
尽管如此,仍然存在一个问题:
我要访问的符号 ( printk
) 和我的可执行缓冲区位于不同的地址空间中,例如:
但是在我callq
的 to 中printk
,我只有 32 位来写入要调用的地址作为偏移量,$rip
因为内核中没有.got
部分。这意味着 printk必须位于[$rip-2GO, $rip+2GO]
. 但情况并非如此。
我是否有办法访问 printk 地址,尽管它们距离我的缓冲区超过 2GO(我尝试使用mcmodel=medium
但我没有看到生成的代码有任何区别),例如通过修改 gcc 选项以便二进制文件居然有.got
节?
或者是否有一种可靠的方法可以强制在(我目前使用)中分配我的可执行文件和可能对 kmalloc 而言太大的缓冲区[0xffffffff00000000 ; 0xffffffffffffffff] range?
__vmalloc(BUFFER_SIZE, GFP_KERNEL, PAGE_KERNEL_EXEC);
编辑 27/09:[0xffffffff00000000 ; 0xffffffffffffffff]
我使用非导出 __vmalloc_node_range
函数作为(脏)hack
成功地在范围内分配了我的缓冲区。
然后,当我知道我的可执行缓冲区的地址和内核符号的地址(通过解析)时,我可以使用's option where/proc/kallsyms
修补我的二进制文件。ld
--defsym symbol=relative_address
relative_address = symbol_address - buffer_offset
尽管非常肮脏,但这种方法确实有效。
但是我每次执行它时都需要重新链接我的二进制文件,因为缓冲区可能(并且将)分配在不同的地址。为了解决这个问题,我认为最好的方法是将我的可执行文件构建为一个真正的位置独立的可执行文件,这样我就可以修补全局偏移表而不是完全重新链接模块。
但是通过那里提供的选项,我得到了一个相对于 rip 的地址,但没有得到/plt。所以我想找到一种方法将我的模块构建为一个合适的 PIE。
这篇文章变得庞大而混乱,我们偏离了最初的问题。因此,我在那里打开了一个新的简化帖子。如果我得到有趣的答案,我会编辑这篇文章来解释它们。
注意:为简单起见,此处未显示安全测试
注 2:我非常清楚我的 PoC 非常不寻常,可能是一种不好的做法,但我还是想这样做。
roslyn - 动态构建 FluentAssertions 断言语句
我有一个使用 SpecFlow v3 配置的单元测试,并使用 FluentAssertions 库进行断言。
我有一些测试(针对模拟 dbset 的查询以返回对象列表)几乎相同,唯一的区别是我想如何编写断言。这是我正在使用的断言示例
由于唯一的差异是断言,我想看看是否有任何可能采用字符串断言值(如 ( "result.Should().NotContain(x => x.Status == "Failure");"
) 或 ( "result.Count().Should().BeGreaterThan(0);"
) 或任何类型的 fluentassertion 字符串并将其转换为实际的 c# fluentassertion 语句?
我希望使用的任何解决方案都能够像硬编码的断言一样运行,因为测试将采用这个动态断言,如果成功则通过,如果断言失败则失败。