如何在堆上实现堆栈的情况下将程序集转换为C?

如何在堆上实现堆栈的情况下将程序集转换为C?,c,assembly,stack,heap,reverse-engineering,C,Assembly,Stack,Heap,Reverse Engineering,我知道有一些帖子在讨论如何将汇编语言翻译成C语言, 但基本上,它们都是针对如何获得人类可读的C源代码 所以我想要实现的是在堆上实现堆栈的转换过程 我不需要使代码易于阅读,只需要翻译成合法的c源代码 甚至伪代码(如果直接翻译成c源代码太难) 但是在这个相对容易的任务中(一点也不容易),我想在堆上实现堆栈,就像ML和Scheme编译器所做的那样 有人能给我一些关于这些东西的指导和说明吗 实验环境应该在x86上,程序集是从 gcc -S source 假设我们在这个任务中有原始的c源代码,它会有帮助

我知道有一些帖子在讨论如何将汇编语言翻译成C语言, 但基本上,它们都是针对如何获得人类可读的C源代码

所以我想要实现的是在堆上实现堆栈的转换过程

我不需要使代码易于阅读,只需要翻译成合法的c源代码 甚至伪代码(如果直接翻译成c源代码太难)

但是在这个相对容易的任务中(一点也不容易),我想在堆上实现堆栈,就像ML和Scheme编译器所做的那样

有人能给我一些关于这些东西的指导和说明吗

实验环境应该在x86上,程序集是从

gcc -S source

假设我们在这个任务中有原始的c源代码,它会有帮助吗?

假设这里是x86/x64

堆栈指针由ESP(32位)或RSP(64位)寄存器跟踪。 您可以在ASM中插入
mov ESP,ADDRESS
指令,并将堆栈更改为首选位置。您需要先将ESP/RSP存储在新堆栈上,因为以后需要它

在C程序中设置ESP/RSP call
main()
(或任何其他C函数)后立即执行


函数返回后,将ESP/RSP恢复为其原始值。

假设此处为x86/x64

堆栈指针由ESP(32位)或RSP(64位)寄存器跟踪。 您可以在ASM中插入
mov ESP,ADDRESS
指令,并将堆栈更改为首选位置。您需要先将ESP/RSP存储在新堆栈上,因为以后需要它

在C程序中设置ESP/RSP call
main()
(或任何其他C函数)后立即执行


函数返回后,将ESP/RSP恢复为其原始值。

根据汇编语言代码的生成位置/时间/方式,如果它不映射到C语言语义,则可能无法实现。嗨,Eric,我更新了我的问题..如果我有原始C源代码,它能帮上忙吗?取决于汇编语言代码生成的位置/时间/方式,如果它不映射到C语言语义,则可能无法实现。嗨,Eric,我更新了我的问题。如果我有原始C源代码,它能帮上忙吗?嗨,egur,非常感谢你的帮助回答!但我仍然对一些细节感到困惑..至于32位环境,我是否必须更改ss寄存器。。?因为基本上我认为只有通过组合ss:sp,你才能找到堆栈的确切顶部。而且,如果我将堆栈放在堆内存区域,我如何保证该内存区域不会被“真正”的堆内存操作函数(如HeapAlloc/HeapFree)重叠?不再使用@computereasy-ss(32/64位),只使用ESP/RSP。由于您分配了堆栈,因此您可以控制该内存的情况。操作系统分配的堆栈稍微复杂一些,它不会分配所有的堆栈大小,而是分配一小部分并以保护页结束分配,当访问保护页时,它将访问更多的空间。如果要覆盖堆栈分配,请确保分配足够的ram。@computereasy-堆栈操作是非常高级的东西,在执行此操作之前,您应该了解所有涉及的机制。基本上,我只知道这方面的一些高级想法,似乎我需要弄脏我的手……谢谢egur!嗨,埃格尔,非常感谢你的回答!但我仍然对一些细节感到困惑..至于32位环境,我是否必须更改ss寄存器。。?因为基本上我认为只有通过组合ss:sp,你才能找到堆栈的确切顶部。而且,如果我将堆栈放在堆内存区域,我如何保证该内存区域不会被“真正”的堆内存操作函数(如HeapAlloc/HeapFree)重叠?不再使用@computereasy-ss(32/64位),只使用ESP/RSP。由于您分配了堆栈,因此您可以控制该内存的情况。操作系统分配的堆栈稍微复杂一些,它不会分配所有的堆栈大小,而是分配一小部分并以保护页结束分配,当访问保护页时,它将访问更多的空间。如果要覆盖堆栈分配,请确保分配足够的ram。@computereasy-堆栈操作是非常高级的东西,在执行此操作之前,您应该了解所有涉及的机制。基本上,我只知道这方面的一些高级想法,似乎我需要弄脏我的手……谢谢egur!