gpt4 book ai didi

c - 如何在正确提供 argc、argv、envp 的 NASM 中调用用 C 编写的链接可执行文件中的主要函数

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:57 27 4
gpt4 key购买 nike

我正在将 C 程序链接到 NASM 可执行文件。汇编文件调用链接的C程序中的main函数

virus:  infect.c virus.o
$(CC) $(LFLAGS) $^ -o $@

virus.o: virus.asm template.asm.inc
$(ASM) $(AFLAGS) $< -o $@

我尝试过的:

infect.c 以这种方式包含主要功能:

int main(int argc, char *const argv[], char *const envp[]) {
DIR *dir;
struct dirent *ent;
struct stat st;
int vfd, xfd, magic;
pid_t pid;
off_t offset;
ino_t inode;

vfd = open(argv[0], O_RDONLY);
...

因为我想从 virus.asm 调用 infect.c 中的 main 函数。 main 函数应该 infactvirus.asm 中,因为在可执行文件中不能有两个 main 函数,所以我更改了 main 中的函数 infect.c

int infect(int argc, char *const argv[], char *const envp[]) {
DIR *dir;
struct dirent *ent;
struct stat st;
int vfd, xfd, magic;
pid_t pid;
off_t offset;
ino_t inode;

vfd = open(argv[0], O_RDONLY);
...

1) 我不知道如何从 NASM 程序集调用这个 infact 函数,这是我在 virus.asm 文件中尝试的

extern infect
main:
call infect

程序运行,但没有产生预期的效果。 infect.c 是一种 ELF 病毒,它会在 CWD 中寻找文件并感染它们。

2) 问题似乎是我在调用时没有正确处理的 int argc, char *const argv[], char *const envp[]

如何使用 argcargvvirus.asm 正确调用 infect.c 中的函数> 和 envp 是为了让程序正常工作而提供的?

最佳答案

您可以在 asm 文件中提供一个 _start 入口点。下面是在 AMD64 和 linux 内核上为 elf abi 设置 argc、argv 和 envp 的示例代码。它不适用于真实代码,因为它不执行通常的初始化过程,例如为 tls 设置 fs 段、初始化静态变量等...但它让您初步了解需要做什么!

备忘录 [argc -> %rdi ; argv -> %rsi ;环境 -> %rdx ]

.global _start
.type _start,@function
.align 16
_start:
.cfi_startproc
.cfi_undefined rip
/*nullify rbp as required by doc*/
xor %rbp, %rbp
/*move argc to rdi and advance rsp*/
popq %rdi
/*set argv*/
movq %rsp, %rsi
/*now envp is at rsp+8*argc+8*/
lea 8(%rsp, %rdi, 8), %rdx
/*realign stack*/
push %rdi
/*push rsp to the stack*/
callq main
/*call _exit at return*/
movq %rax,%rdi
mov $231, %rax
syscall
.cfi_endproc

关于c - 如何在正确提供 argc、argv、envp 的 NASM 中调用用 C 编写的链接可执行文件中的主要函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56098695/

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