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

2021-06-15 21:54:07 字數 1996 閱讀 5158

我們都知道,在程式裡獲取命令列引數很簡單,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函式開啟其它程序,然後用readprocessmemory讀取相應的資料即可。 示例**:

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;

}

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

如何獲取其它程式的命令列引數 整理 ackarlix 開發環境 vc6 windows xp 測試環境 windowsxp 我們都知道,在程式裡獲取命令列引數很簡單,winmain 函式會以引數的形式傳遞給我們,或者可以呼叫 api getcommandline 獲取。但是 getcommandli...

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...