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

2021-10-09 08:08:00 字數 1884 閱讀 3913

開發環境: 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函式開啟其它程序,然後用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...

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

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

VC6命令列編譯工程方法

查msdn找到下面的命令 msdevfilename make projectname c onfigname all rebuild clean norecurse out logfile useenv 引數你可以自己查msdn,具體使用時可以使用很少的引數 msdev 工作區檔案 dws mak...