首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JIT基础知识

JIT基础知识
EN

Stack Overflow用户
提问于 2010-07-05 18:24:14
回答 3查看 228关注 0票数 0

我稍微理解了"int = b+abs(c)“是如何被翻译成简单的汇编指令,然后再翻译成一些二进制blob的。但是如何在内存中动态地运行和交互呢?

-编辑--

我知道C没有eval功能。但它被编译的目的是。我的意思是,这就是Java喜欢JIT的原因,就这一点而言,代码注入恶意软件不可能吗?例如,abs()函数只是一个指针,它可以在cdecl协议之后调用。新函数应该能够通过传递cdecl函数指针来公开。我不明白的是,这个新代码是如何在运行时注入的。

我更多的是出于对学术的好奇心,然后才能最有效地解决实际问题。

--示例--

假设我有一段嵌入的python代码,它经常从本机程序调用,并且还调用本机绑定notify():

代码语言:javascript
复制
def add(a, b):
    notify()
    return a+b

要做到这一点,函数可能应该包含更多的代码(并且更有用),但请耐心等待。分析器(或来自c-bindings的提示)也识别出所有调用都是带有所有参数和返回值的整数。这与以下内容匹配:

代码语言:javascript
复制
int add(int a, int b) {
    notify();
    return a + b;
}

它可以编译成类似如下的x86 cdecl:

代码语言:javascript
复制
:_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函数指针供本机程序使用?

抱歉,我的问题意图不明确。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-06 22:22:58

假设您已经在内存块中编译了代码,并且您有该块的地址,则可以将其强制转换为函数指针:

代码语言:javascript
复制
typedef int (*func)(int, int);
...
char * compiledCode = ...;
func f = (func) compiledCode;

然后可以调用该函数:

代码语言:javascript
复制
int x = f(2, 3);
票数 1
EN

Stack Overflow用户

发布于 2010-07-05 18:32:21

C缺乏任何类型的"eval“特性,这既是一个限制,也是使其高效的原因之一。如果您所需要做的就是使用一小部分内置数学函数(如abs() )来计算数学表达式,而不是使用任意的C代码,那么编写这样的表达式求值器是相当容易的。

这里有一个关于类似主题的过去SO帖子的链接:c expression Evaluator

票数 1
EN

Stack Overflow用户

发布于 2010-07-16 22:18:49

程序必须在允许执行的内存区域中。

在linux上,您可以执行以下操作:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3178732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档