process.communicate 和 getche() 失败

2023-12-03

我正在尝试自动执行用 C++ 编写的交互式命令行工具。

启动时,二进制文件等待字母 S、Q 或 P(状态、退出或暂停)。它使用非标准 msvcrt 函数“getche”来获取击键(而不是例如 gets()),而无需用户按 Enter 键。

我尝试以标准方式与进程通信(写入 stdin 并使用 process.communicate[]),但它没有获取输入。经过几个小时的尝试不同的事情后,我在 Visual Studio 中创建了两个小示例项目来复制该问题并确保我头脑清醒。

这是用于调用二进制文件的 python 脚本:

import subprocess
import time

cmd = ["test-getch.exe"]
process = subprocess.Popen(cmd, stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
i = process.stdin
#msvcrt.ungetch('s')
i.write("S\n")
print process.communicate()[0]
i.close()
time.sleep(3)
print "DONE"

这是两个二进制文件。我可以与之交流的第一个:

#include "stdafx.h"
#include <conio.h>


int _tmain(int argc, _TCHAR* argv[])
{
    char response [2];
    printf("Enter \"s\":\n");
    gets(response);
    printf("You entered %s", response);
    return 0;
}

我无法与之沟通的人:

#include "stdafx.h"
#include <conio.h>


int _tmain(int argc, _TCHAR* argv[])
{
    int response;
    printf("Enter \"a\":\n");
    response = getche();
    printf("You entered %c", response);
    return 0;
}

看来 getche() 不监听标准输入,并且可能监听某种键盘事件。有人知道如何处理这个问题吗?

EDIT:我还应该提到我发现了使用 IDA Pro 捕获输入的方法。我没有编写我试图自动化的原始二进制文件。它是一个闭源工具,因此我无法在不修补二进制文件的情况下重写它接受输入的方式。

我实际上选择了一个相当疯狂的有效解决方案...我非常了解 pydbg,并且似乎通过流程仪表附加到流程并调用我需要的函数是可行的。这完全是多余的,但之后我可以脱离这个过程。并让它正常运行。

[1]Pydbg:http://pedram.redhive.com/PyDbg/docs/


如果您可以修改被调用程序的行为,亚当·罗森菲尔德的答案是一个明智的方法。否则,如果您确实需要写入控制台输入缓冲区,请尝试 PyWin32 的 win32console 模块。也就是说,我不确定如何在标准输出通过管道传输时使字符回显部分正常工作。它最终打印到行的开头。

C:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int response;
    printf("Enter \"a\": ");
    response = getche();
    printf("\nYou entered \"%c\" ", response);
    return 0;
}

/* gcc test_getch.c -o test_getch.exe */

Python:

import subprocess
import win32console

def make_buf(c):
    buf = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
    buf.KeyDown = 1
    buf.RepeatCount = 1
    buf.Char = c
    return buf

con_in = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)

cmd = ["test_getch.exe"]
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)

buf = make_buf('a')
con_in.WriteConsoleInput([buf])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

process.communicate 和 getche() 失败 的相关文章

随机推荐

  • 在 C# 中使用 cmd 将文件从一个目录复制到另一个目录

    我需要将文件从一个目录复制到另一个目录并对该文件执行某些操作 我需要复制它cmd 而不是File Copy 因为我需要将副本作为ProcessStartInfo 您可以使用此代码并更改startInfo Arguments but C应该
  • ChromeDriver 仅支持 Chrome 版本 89

    使用 Azure DevOps 不知何故管道停止工作 并且在运行时无法完成测试ng lint ng e2e ng test watch false 这在本地运行时有效 16 43 25 I launcher Running 1 instan
  • as3 从另一个类调用 Main.as 文档类中的函数

    我确信这是一个受欢迎的问题 但我找不到我需要的确切答案 我只需要访问在 Main as 文档类中创建的一个或多个函数 我尝试了几种方法 但似乎都不起作用 这是我尝试过的一个例子 anotherClass as 这需要访问函数Main as
  • 交互失败discord.py按钮

    client command async def button ctx await ctx message delete await ctx send Support Tickets components Button label Gene
  • 将包含 ASCII 的字符串转换为 Unicode

    我从 HTML 页面获取一个字符串到我的 Java HTTPServlet 中 根据我的要求 我得到了显示汉字的 ASCII 代码 可以告诉我 没有空格 我怎样才能把这个字符串转换成Unicode HTML 代码
  • 从 HTML 按钮运行 Python 脚本

    P 我正在尝试实现一个将运行 Python 脚本的按钮forward py 让我的机器人前进 使用 Lighttpd Web 服务器 PHP 7 0 Python 脚本在终端窗口中执行时工作正常 但是当我尝试通过单击按钮运行它时 它不起作用
  • 推送到 GitHub 时出现 403 错误

    我正在尝试将一个新的本地分支 名为 haystack 推送到我的 github 存储库 git push u origin haystack 但我收到错误 错误 访问时请求的 URL 返回错误 403https github com Gra
  • 使用 jQuery 验证单选按钮

    在我的表单上有一组单选按钮 这是标记 div class optionHolder p class optionName Format p div class option checked div div
  • AsyncTask 从不执行 onPostExecute

    我正在尝试执行以下 AsyncTask private class TimeUpdateTask extends AsyncTask
  • Sklearn LinearSVC库中惩罚参数和损失参数的区别

    我对 SVM 理论不太熟悉 我在 python 中使用这个 LinearSVC 类 http scikit learn org stable modules generated sklearn svm LinearSVC html skle
  • 嵌入式系统上的 C++ 动态代码注入

    我正在寻找以下问题的解决方案 开发了在嵌入式设备上运行的 C 软件模块 无法使用基于文件的函数 dlopen 来加载共享库 当模块运行时 它应可通过动态程序代码进行扩展 动态代码在PC系统上编写 接口功能的实现 和交叉编译 gcc 然后通过
  • 如何用两种颜色填充 JavaFX 球体

    如何用像 2d 圆一样的线性渐变填充 JavaFX 3D 球体 我使用 JavaFX 场景生成器 正如 mohsenmadi 所指出的 漫反射颜色不允许您使用除一种单一颜色之外的其他颜色 但是 通过使用图像作为漫反射贴图 您可以在球体上拥有
  • 为什么我没有收到“分段错误”? [复制]

    这个问题在这里已经有答案了 可能的重复 当我写入超出数组末尾时 为什么不会出现分段错误 这段代码编译并运行没有任何错误 但如何呢 include
  • Django ModelChoiceField 使用来自一个模型属性的不同值

    所以我正在开发一个 Django 应用程序 其中有一个模型事件 每个事件都有一些属性 其中之一是 主机名 我将在整个过程中使用它作为示例 我需要实现搜索功能 用户可以搜索具有主机名 some value 的所有事件 例如主机名 myhost
  • 使用 JDBC 驱动程序连接 MATLAB 和 MySQL

    我买了 Yair Altmam 写的 Undocumented MATLAB 一书 在本书的第 2 2 章中 他讨论了数据库连接以及使用 JDBC 连接到数据库 我按照书上的步骤和文字进行操作 我下载了 mysql connector ja
  • 特定文件夹的错误报告

    有没有办法设置error reporting E ALL 对于特定目录而不是将其包含在每个文件中 我想为我的 beta mysite com 启用错误报告 您可以在 Apache 中使用 htaccess 文件 只需添加这一行 php va
  • 使用龙卷风网络服务器运行 hello world 时出现问题(Python 2.5,Windows 7)

    我在 Windows 7 64 位 上使用 Python 2 5 我安装了 pycurl 7 15 5 1 带有 win 二进制文件 和tornado 使用 pip 当我运行以下 hello world 代码时 import tornado
  • C++ 文件处理:ios::app 和 ios::ate 之间的区别?

    有什么区别ios ate and ios app写入文件时 在我看来 ios app使您能够在文件中移动 而ios ate它只能在文件末尾读 写 它是否正确 事实恰恰相反 什么时候ios ate设置后 初始位置将是文件末尾 但此后您可以自由
  • Graphics.DrawString 打印文档宽度的中心

    我正在尝试将字符串放在打印文档的中心 我已经对图像执行了以下操作 它可以工作 但对于字符串似乎不起作用 这是我用来使图像居中的代码 e Graphics DrawImage logo e MarginBounds Width 2 logo
  • process.communicate 和 getche() 失败

    我正在尝试自动执行用 C 编写的交互式命令行工具 启动时 二进制文件等待字母 S Q 或 P 状态 退出或暂停 它使用非标准 msvcrt 函数 getche 来获取击键 而不是例如 gets 而无需用户按 Enter 键 我尝试以标准方式