我稍微理解了"int = b+abs(c)“是如何被翻译成简单的汇编指令,然后再翻译成一些二进制blob的。但是如何在内存中动态地运行和交互呢?
-编辑--
我知道C没有eval功能。但它被编译的目的是。我的意思是,这就是Java喜欢JIT的原因,就这一点而言,代码注入恶意软件不可能吗?例如,abs()函数只是一个指针,它可以在cdecl协议之后调用。新函数应该能够通过传递cdecl函数指针来公开。我不明白的是,这个新代码是如何在运行时注入的。
我更多的是出于对学术的好奇心,然后才能最有效地解决实际问题。
--示例--
假设我有一段嵌入的python代码,它经常从本机程序调用,并且还调用本机绑定notify():
def add(a, b):
notify()
return a+b要做到这一点,函数可能应该包含更多的代码(并且更有用),但请耐心等待。分析器(或来自c-bindings的提示)也识别出所有调用都是带有所有参数和返回值的整数。这与以下内容匹配:
int add(int a, int b) {
notify();
return a + b;
}它可以编译成类似如下的x86 cdecl:
:_add
push ebp ;setting up scope
mov ebp, esp
call _notify ;or more likely by a pointer reference
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret然后最后组装成二进制串。当然,人们必须为每个平台实现一个基本的编译器才能做到这一点。但是把这个问题放在一边,假设我现在有一个指向这个有效的二进制x86代码的字符指针。有没有可能以某种方式从其中提取一个cdecl函数指针供本机程序使用?
抱歉,我的问题意图不明确。
发布于 2010-07-06 22:22:58
假设您已经在内存块中编译了代码,并且您有该块的地址,则可以将其强制转换为函数指针:
typedef int (*func)(int, int);
...
char * compiledCode = ...;
func f = (func) compiledCode;然后可以调用该函数:
int x = f(2, 3);发布于 2010-07-05 18:32:21
C缺乏任何类型的"eval“特性,这既是一个限制,也是使其高效的原因之一。如果您所需要做的就是使用一小部分内置数学函数(如abs() )来计算数学表达式,而不是使用任意的C代码,那么编写这样的表达式求值器是相当容易的。
这里有一个关于类似主题的过去SO帖子的链接:c expression Evaluator
发布于 2010-07-16 22:18:49
程序必须在允许执行的内存区域中。
在linux上,您可以执行以下操作:
void *address;
functype proc;
int prot, flags;
prot = PROT_READ|PROT_WRITE|PROT_EXEC;
flags = MAP_PRIVATE|MAP_ANONYMOUS;
address = mmap(NULL, length, prot, flags, -1, 0);
if (address == NULL) error;
memcpy(address, program, length);
link(address, program_info);
proc = (functype)address;https://stackoverflow.com/questions/3178732
复制相似问题