如何捕获其他程序产生的程序的std输出?

问题描述 投票:0回答:1
i有一个二进制可执行文件的Linux,例如“ myecho”,该二进制文件从命令行中读取其参数,并在标准输出上呼应它们。 然后,我在汇编器中写了另一个二进制可执行文件(没有“ libc”或其他c-libraries),称其名称为“ myprog”。我希望它使用内核函数

sys_execve
产生“ myecho” 我想将“ myecho”的标准输出捕获到文件“ messages.txt”以进行进一步处理。 我不知道如何告诉产卵的“ myecho”将其输出重定向到文件。 myprog program [.data] Par1 DB "Param1",0 Par2 DB "Param2",0 Par3 DB ">messages.txt",0 Env1 DB 0 ; Not used. Command DB "/path/to/myecho",0 Parameters DD Par1,Par2,Par3,0 Environment DD Env1 [.text] ; Execute "myecho" from "myprog": MOV EAX,11 ; Kernel # of "execve" in 32bit Linux. MOV EBX,Command ; MOV ECX,Parameters ; MOV EDX,Environment ; INT 0x80 我期望执行行是类似

/path/to/myecho Param1 Param2 >messages.txt
但似乎不是那样工作的。
“> Message.txt”被视为逐字化的第三个参数。
我试图用

>

^

逃脱重定向操作员
Esc

Par3    DB "^>messages.txt",0
Par3    DB 27,">messages.txt",0
但没有成功。
也许我需要用
fork
产生“ myecho” 而不是

execve
并使用
Tee

来管输出输出,但我不知道如何将“ myecho”的输出连接到“ TEE”的文件描述符。 如何运行“ myecho”内部“ myprog”,将其输出捕获到文件中,然后在“ myprog”中处理此输出? yes,我一直在寻找dup2

将标准输出重定向到文件句柄,正如

fuz所评论的那样。 我使用了Jester

提出的程序,现在可以正常工作。 谢谢你们,先生们!
linux assembly x86 io-redirection
1个回答
0
投票
myprog program [.data] Par1 DB "Param1",0 Par2 DB "Param2",0 Env1 DB 0 ; Not used. Command DB "/path/to/myecho",0 Parameters DD Command,Par1,Par2,0 Environment DD Env1 Messages DB "messages.txt",0 FdMessages DD 0 ; File descriptor of "messages.txt". [.text] LinAPI open, Messages, O_RDWR+O_CREAT, 777q MOV [FdMessages],EAX ; File descriptor of the text file (empty so far). LinAPI fork ; Divide the current process into two: child and parent. CMP EAX,0 JNZ Parent: ; I am in the child process which will be transformed to "myecho" soon. LinAPI dup2,[FdMessages],1 ; Replace child's stdandard output with FdMessages. LinAPI execve, Command, Parameters, Environment ; Child becomes "myecho". Parent: ; Continue with parent process "myprog". LinAPI waitpid, -1, 0, 0 ; Wait until the child terminates. LinAPI close, [FdMessages] ; The file "messages.txt" is written now and it can be analyzed.

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.