如何獲取其它程式的命令列引數

2021-04-13 08:05:19 字數 2360 閱讀 2494

如何獲取其它程式的命令列引數

整理:ackarlix

開發環境:

vc6 windows xp

測試環境:

windowsxp

我們都知道,在程式裡獲取命令列引數很簡單,

winmain

函式會以引數的形式傳遞給我們,或者可以呼叫

api getcommandline

獲取。但是

getcommandline

函式不接受引數,獲取的只是自己程式的命令列引數。那麼如果我們想獲取別的應用程式的命令列引數應該怎麼辦呢?

有的同學說,既然

getcommandline

只能獲取本程式的命令列引數,我們可以在其它程序裡插入乙個

dll,在那個程序的位址空間呼叫

getcommandline

函式,然後傳回來就可以了。這樣好像有點兒不太友好。讓我們想想還有沒有別的辦法。

我們想,自己的命令列引數既然隨時都可以獲取到,那麼在該程序裡一定有乙個地方存放它。那麼在哪兒呢?看一下

getcommandline

函式的反彙編**,我們發現,原來世界是如此的美好!

以下是winxp

系統的getcommandline

函式反彙編**:

.text:7c812c8d getcommandlinea proc near

.text:7c812c8d mov eax, dword_7c8835f4     //dword_7c8835f4

就是命令列引數字串的位址 //

該指令機器碼為 a1 f4 35 88 7c,從第2個位元組開始的4個位元組就是我們要的位址

.text:7c812c92 retn

.text:7c812c92 getcommandlinea endp

既然知道了放在哪兒了,我們自己去拿就可以了。因為

getcommandline

函式的位址在各個程序內都是一樣的,所以可以直接用我們程序裡的位址。

win2000/xp

系統很簡單,

98下稍微麻煩一點兒,需要進行一些簡單的計算。

以下是getcommandline

函式在win98

下的彙編**:

.text:bff8c907 getcommandlinea proc near

.text:bff8c907 mov eax, dword_bffcade4

.text:bff8c90c mov ecx, [eax]

.text:bff8c90e mov eax, [ecx+0c0h]

.text:bff8c914 test eax, eax

.text:bff8c916 jnz short locret_bff8c91e

.text:bff8c918 mov eax, [ecx+40h]

.text:bff8c91b mov eax, [eax+8] //

算到這兒,才是我們想要的位址

.text:bff8c91e

.text:bff8c91e locret_bff8c91e: ; code xref: getcommandlinea+f.

.text:bff8c91e retn

這樣,我們就可以呼叫

openprocess

函式開啟其它程序,然後用

readproces**emory

讀取相應的資料即可。

示例**:

dword g_getcmdline(dword dwpid,tchar* pcmdline,dword dwbuflen)

dword dwret = -1;

dword dwaddr = *(dword*)((dword)getcommandline + 1);//

第2個位元組開始才是我們要讀的位址

tchar tcbuf[buffer_len] = ;

dword dwread = 0;

//判斷平台

dword dwver = getversion();

try

}         }

else                        // windows 95/98/me    and win32s

_tcsncpy(pcmdline,tcbuf,dwbuflen);    //

最好檢查一下dwread和dwbuflen的大小,使用較小的那個

dwret = 0;

break; }

} }

catch(...)

closehandle(hproc);

return dwret; }

如何獲取其它程式的命令列引數

我們都知道,在程式裡獲取命令列引數很簡單,winmain函式會以引數的形式傳遞給我們,或者可以呼叫api getcommandline 獲取。但是getcommandline函式不接受引數,獲取的只是自己程式的命令列引數。那麼如果我們想獲取別的應用程式的命令列引數應該怎麼辦呢?有的同學說,既然get...

VC6獲取其它程式的命令列引數

開發環境 vc6 windows xp 測試環境 windowsxp 我們都知道,在程式裡獲取命令列引數很簡單,winmain函式會以引數的形式傳遞給我們,或者可以呼叫api getcommandline 獲取。但是getcommandline函式不接受引數,獲取的只是自己程式的命令列引數。那麼如果...

獲取其他程序的命令列

type unicode string packed record length word maximumlength word buffer pwidechar end punicode string unicode string type process parameters packed re...