用VC獲取其它程序的命令行參數(shù)

字號(hào):

我們都知道,在程序里獲取命令行參數(shù)很簡單,WinMain函數(shù)會(huì)以參數(shù)的形式傳遞給我們,或者可以調(diào)用API GetCommandLine 獲取。但是GetCommandLine函數(shù)不接受參數(shù),獲取的只是自己程序的命令行參數(shù)。那么如果我們想獲取別的應(yīng)用程序的命令行參數(shù)應(yīng)該怎么辦呢?
    有的同學(xué)說,既然GetCommandLine只能獲取本程序的命令行參數(shù),我們可以在其它進(jìn)程里插入一個(gè)Dll,在那個(gè)進(jìn)程的地址空間調(diào)用GetCommandLine函數(shù),然后傳回來就可以了。這樣好像有點(diǎn)兒不太友好。讓我們想想還有沒有別的辦法。
    我們想,自己的命令行參數(shù)既然隨時(shí)都可以獲取到,那么在該進(jìn)程里一定有一個(gè)地方存放它。那么在哪兒呢?看一下GetCommandLine函數(shù)的反匯編代碼,我們發(fā)現(xiàn),原來世界是如此的美好!
    以下是WinXP系統(tǒng)的GetCommandLine函數(shù)反匯編代碼:
    .text:7C812C8D GetCommandLineA proc near
    .text:7C812C8D mov eax, dword_7C8835F4 //dword_7C8835F4 就是命令行參數(shù)字符串的地址
    //該指令機(jī)器碼為 A1 F4 35 88 7C,從第2個(gè)字節(jié)開始的4個(gè)字節(jié)就是我們要的地址
    .text:7C812C92 retn
    .text:7C812C92 GetCommandLineA endp
    既然知道了放在哪兒了,我們自己去拿就可以了。因?yàn)镚etCommandLine函數(shù)的地址在各個(gè)進(jìn)程內(nèi)都是一樣的,所以可以直接用我們進(jìn)程里的地址。 win2000/xp系統(tǒng)很簡單,98下稍微麻煩一點(diǎn)兒,需要進(jìn)行一些簡單的計(jì)算。 以下是GetCommandLine函數(shù)在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