如何包装可执行文件以强制某些命令行参数?

如何包装可执行文件以强制某些命令行参数?

我有一个可执行文件:foo.exe

另一个进程foo.exe使用某些命令行参数执行。我无法修改执行的进程foo.exe,也无法更改其执行的文件名。

我想-bar向该调用添加一个附加命令行参数()。

最终结果将是:foo.exe -bar <args_passed_by_process>

你知道有什么办法可以做到这一点吗?

答案1

我知道这是一篇老帖子,但我今天遇到了同样的问题。

基本上,第三方应用程序启动的 JxBrowser 实例在应该打开登录窗口时返回了 http 错误 401。这种情况发生在我们所有域 PC 上,提供商在寻找解决方案方面没有提供太多帮助。由于我基本上是靠自己,我需要将 --remote-debugging-port 参数传递给 chromium 可执行文件,这样我才能真正解决这个问题

无论如何,这是我想到的解决方案。虽然有点老套,但确实有效

我首先尝试创建一个 .bat 文件,该文件仅运行输入以及添加的参数,如下所示

> @echo off
> %* -bar

然后,我创建了一个调试器密钥,在“图像文件执行选项”中调用此 bat 文件,如下所示

> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\foo.exe" /v Debugger /t REG_SZ /d "C:\Path\To\This\batch\file.bat" /f

每次启动 Foo.exe 时,它​​实际上都会运行命令“"C:\Path\To\This\batch\file.bat" Foo.exe”,进而运行命令“Foo.exe -bar”。这意味着调用“Foo.exe -foobar”将导致调用“Foo.exe -foobar -bar”

我随后遇到的问题是,由于批处理脚本调用了 Foo.exe,它实际上会无限循环地调用自身,每次都会在命令中添加 -bar,因此最终运行的是“C:\Path\To\This\batch\file.bat” Foo.exe -foobar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar -bar 等等。”

我最终做的是修改脚本以在启动 foo.exe 之前删除调试器注册表项,然后重新添加它,如下所示:

> @echo off
> reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\foo.exe" /v Debugger /f
> %* -bar
> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\foo.exe" /v Debugger /t REG_SZ /d "C:\Path\To\This\batch\file.bat" /f

结果如下:

  1. 应用程序尝试启动“Foo.exe -foobar”
  2. 不会启动 Foo.exe,而是调用“"C:\Path\To\This\batch\file.bat" Foo.exe -foobar”
  3. 批处理脚本删除调试器注册表项
  4. 当在下一行调用 Foo.exe 时,它​​实际上会使用添加的 -bar 参数启动 foo.exe,而不是 .bat 文件
  5. 重新添加注册表项,以便下次启动 Foo.exe 时,它​​将再次通过批处理脚本运行它并添加 -bar 参数

(您可能必须编辑“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\foo.exe”键的权限,以便调用 foo.exe 的应用程序实际上有权编辑它)

我确信对此有更好的解决方案,但我无论如何也找不到。

答案2

尝试:将 foo.exe 重命名为其他名称(例如 foo1.exe),然后用一种可编译为 .exe 的语言(FreeBasic、C#、C,任何您喜欢的语言)编写一个简单的命令行程序。该语言必须具有“shell”命令或功能,即使用操作系统执行外部应用程序(新的 foo1.exe)。您编写的程序在编译后将成为新的 foo.exe。它将是一个相当简单的应用程序 - 它只接受其他进程发送给 foo.exe 的所有参数,将您的-bar参数添加到列表的前面,然后使用修改后的参数列表调用 foo1.exe。

如果您的调用进程等待 foo.exe 终止并返回退出代码,则可能需要复制该行为。

答案3


在注册表中设置图像文件执行选项,以便在应用程序运行或从启动它的任何其他应用程序或关联事件启动时包含它们

您还可以在一个巨大的管道链中附加参数,创建一个包含主 exe 参数的快捷方式 .lnk,foo1 -->“C:\users\test\Foo2.exe --bar”

你可以使用 hwnd 隧道

你可以钩住进程或者api

管道/sdout 输出到文件>>使用 findstr 然后将动态结果重新注入命令并返回到 foo2.exe

一些随机的想法

使用 cmd SET 命令引入环境通用变量,该变量默认包含在其路径中,这样您实际上就不需要文件的路径位置,并且可以从任何地方运行它并将其识别为默认的 Windows 服务/程序,因此您还可以将任何其他 cli 参数操作到其“路径”中

相关内容