gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:52 27 4
gpt4 key购买 nike

我正在阅读一篇关于自修改代码的密码破译期刊文章,其中有一段代码:

void Demo(int (*_printf) (const char *,...))
{
_printf("Hello, OSIX!n");
return;
}
int main(int argc, char* argv[])
{
char buff[1000];
int (*_printf) (const char *,...);
int (*_main) (int, char **);
void (*_Demo) (int (*) (const char *,...));
_printf=printf;
int func_len = (unsigned int) _main ­- (unsigned int) _Demo;
for (int a=0; a<func_len; a++)
buff[a] = ((char *) _Demo)[a];
_Demo = (void (*) (int (*) (const char *,...))) &buff[0];
_Demo(_printf);
return 0;
}

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

有人愿意解释一下吗?

最佳答案

代码依赖于编译器对函数布局的了解——这对于其他编译器可能不可靠。

func_len行,一旦更正为包括 -最初丢失的,决定函数的长度 Demo通过减去 _Demo 中的地址(应该包含 Demo() 的起始地址)来自 _main 中的地址(应该包含 main() 的起始地址)。这被假定为函数的长度 Demo , 然后按字节复制到缓冲区 buff . buff地址然后被强制转换为函数指针,然后调用该函数。然而,由于 _Demo也不_main实际上是初始化的,代码是极度错误的。此外,尚不清楚 unsigned int足够大以准确地容纳指针; Actor 阵容可能应该是uintptr_t来自 <stdint.h><inttypes.h> .

如果错误被修复,如果关于代码布局的假设是正确的,如果代码是位置无关的代码,并且如果没有针对执行数据空间的保护措施,这将起作用。它不可靠,不可携带,不推荐使用。但它确实说明,如果它有效,代码和数据非常相似。

我记得在两个进程之间玩过类似的把戏,将一个程序的函数复制到共享内存中,然后让另一个程序从共享内存中执行该函数。那是大约四分之一个世纪前的事,但这项技术是相似的,并且对它所试用的机器“有效”。谢天谢地,我再也不需要使用这种技术了!

关于c++ - 自修改代码 [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5786583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com