如何獲取其它程式的命令列引數
整理: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...