Python中如何改變父程序cmd的目錄?

時間 2021-06-01 21:15:59

1樓:

以 Windows 為例,程序執行期間,會有乙個 PEB 結構,PEB structure (Windows) 微軟給出的 PEB 並沒有更多的細節,檢視 ReactOS 原始碼 reactos/winternl.h at ebe75f395e0d94a034010dda946d95f84a6af4f5 · reactos/reactos · GitHub

可以看到 PEB 更多的細節。

在 ReactOS 原始碼中,reactos/path.c at ebe75f395e0d94a034010dda946d95f84a6af4f5 · reactos/reactos · GitHub 可以看到如何取得當前程序目錄。

設定當前目錄是:

reactos/path.c at ebe75f395e0d94a034010dda946d95f84a6af4f5 · reactos/reactos · GitHub

實際上設定目錄,也就是將 PEB 對應的 CurrentDirectory 重新 Copy 乙份。

RtlCopyMemory

(CurDir

->DosPath

.Buffer

,FullPath

.Buffer

,FullPath

.Length

+sizeof

(WCHAR

));CurDir

->DosPath

.Length

=FullPath

.Length

;#define NtCurrentPeb() (NtCurrentTeb()->Peb)

上面的 PEB 結構中有 ProcessParameters 指標,型別為 RTL_USER_PROCESS_PARAMETERS , MSDN 介紹: RTL_USER_PROCESS_PARAMETERS structure (Windows)

typedef

struct

_RTL_USER_PROCESS_PARAMETERS

RTL_USER_PROCESS_PARAMETERS,*

PRTL_USER_PROCESS_PARAMETERS

;實際上,在 ReactOS 原始碼中, 此結構體有這個簡化版,也有詳細版。reactos/rtltypes.h at eb9115e533db9bbfd1dd7efc4cc9f82f454e2a21 · reactos/reactos · GitHub

typedef

struct

_RTL_USER_PROCESS_PARAMETERS

RTL_USER_PROCESS_PARAMETERS,*

PRTL_USER_PROCESS_PARAMETERS

;二者轉換一下:

typedef struct _RTL_USER_PROCESS_PARAMETERS RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

RTL_USER_PROCESS_PARAMETERS

要修改的就是 CurrentDirectoryName, 只要拿到對應程序的 PID, 並取得 PEB, 然後寫入到對應的 PEB 即可修改程序的當前目錄。

修改指定程序的當前目錄可以使用 WriteProcessMemory 寫到指定的程序,我這裡只有個讀取指定程序 CommandLine 的例子,指定程序的指令架構必須和當前程序一致。

svnsrv/daemonize_win.inl at master · fcharlie/svnsrv · GitHub

這樣搞了以後,還得用 py 封裝, 在 Windows 上 python x86 和 x64 都得有。

如果是 linux, 修改 /proc/pid/cwd 這個不知道可行不。

2樓:

簡單說,cd是shell內建的。

Unux Shell:> type catcat is /bin/cat

> type ls

ls is /bin/ls

> type

cdcd is a shell builtinWindows PS:

PS C:\> cd -?

Name

Set-Location

順便,Windows下好多內建命令,CMD和PS下的實現都不一樣。

所以要用Python指令碼實現cd,就需要做一些hack。首先得獲取父程序PID(os.getppid,Windows下大概要打乙份程序列表?),然後注入進去呼叫chdir。

Linux中父程序呼叫pid fork ,建立的子程序是不是也呼叫了上述語句並返回pid 0

shuyong.chen 這個問題有點意思。如果你了解了轉殖 clone 的概念,對於 建立的子程序是不是也呼叫了上述語句並返回pid 0?這個問題,就會有不同的理解。這個轉殖和我們常說的轉殖生物很類似。我們可以用乙個科幻一點的例子做比喻。對於應用來說,系統呼叫就是進入了乙個小黑屋,有進就有出,但是...

python 多程序如何終止或重啟子程序

Brian BIRK loveProLife 來自這個博主 1.主程序和子程序的程序組ID是一樣的,通過殺死程序組ID使主程序和子程序都退出 import os,signal print term current pid is s,group id is s os.getpid os.getpgrp...

C 父類物件中能否存放子類物件指標 父類物件中能否呼叫派生類物件函式?

張強 這是可以的哦,不過必須借助前向宣告和強制轉換或者多型。SalesMan salesMan SalesMan SalesManager salesManager SalesManager salesMan.salesManager void salesManager SalesManager s...