【发布时间】:2020-06-05 22:40:32
【问题描述】:
所以我正在尝试编写一个类似cd 的程序,该程序可以使用 cmd 执行,并且在它退出调用 cmd 进程的工作目录后应该更改。
现在,在这篇文章被标记为重复之前:我知道 this 和 this question 被要求解决几乎这个确切的问题,但使用 Linux 而不是 Windows,并且非常广泛和不具体,我我知道类似的限制也适用于 Windows(更改我的进程的工作目录不会更改父进程的工作目录)。
实际上有一个有效的solution to this for linux。但是它为此使用gdb,我想只使用内置的Windows实用程序(WinAPI、dotNET、等)来完成这个任务。
到目前为止我所尝试的
我确实设法使用 Cheat Engine 和 OpenProcess() / WriteProcessMemory() WinAPI 函数成功覆盖了 cmd 的工作目录。然而,这个解决方案让人感觉草率且效果不佳(或者至少需要投入更多的工作。)
我的问题
在 Windows 上是否有不同的(可能更简单?)方法来实现这一点?就像一种调用/注入代码到 cmd 进程以直接执行cd whatever\directory\I\want 而不覆盖其内存的方法?我已经看到了 CreateRemoteThread() 函数,但是我没有设法找到使用它们的方法。
仅供参考:我主要使用 C#,但 C/C++ 解决方案也应该有所帮助,只要它们基于本地 Microsoft 库。
【问题讨论】:
-
Why does each drive have its own current directory? 这对你来说意味着你必须修改 Windows 命令解释器的内部逻辑。没有公共 API 可以可靠地做到这一点。您将不得不以一种或另一种方式破解事物。或者做显而易见的事情:使用
cd。既然你还没有说清楚,为什么不使用cd,这个问题似乎不是一个实际的编程问题。 -
那么,您想从正在运行的可执行文件中以编程方式更改目录位置,然后从新位置执行其他任务? (例如:
cd <someNewLocation> && someProgram.exe) -
@ryyker:您在哪里看到目录更改后运行其他任务的请求?
-
可能这样:获取父窗口hwnd Win32指针,然后使用user32.dll API的
SendInput发送按键序列:) -
@aep:为什么你需要一个窗口句柄来调用SendInput?