¡¡¡¡ÎÒÃǶ¼ÖªµÀ£¬ÔÚ³ÌÐòÀï»ñÈ¡ÃüÁîÐвÎÊýºÜ¼òµ¥£¬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)
{
¡¡#define BUFFER_LEN 512 //reading buffer for the commandline
¡¡HANDLE hProc = OpenProcess(PROCESS_VM_READ,FALSE,dwPID);
¡¡if(hProc == NULL)
¡¡{
¡¡¡¡return GetLastError();
¡¡}
¡¡DWORD dwRet = -1;
¡¡DWORD dwAddr = *(DWORD*)((DWORD)GetCommandLine 1);//µÚ2¸ö×Ö½Ú¿ªÊ¼²ÅÊÇÎÒÃÇÒª¶ÁµÄµØÖ·
¡¡TCHAR tcBuf[BUFFER_LEN] = {0};
¡¡DWORD dwRead = 0;
¡¡//ÅÐ¶ÏÆ½Ì¨
¡¡DWORD dwVer = GetVersion();
¡¡try
¡¡{
¡¡¡¡if(dwVer < 0x80000000) // Windows NT/2000/XP
¡¡¡¡{
¡¡¡¡¡¡if(ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead))
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡if(ReadProcessMemory(hProc,(LPVOID)dwAddr,tcBuf,BUFFER_LEN,&dwRead))
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡_tcsncpy(pCmdLine,tcBuf,dwBufLen); //×îºÃ¼ì²éÒ»ÏÂdwReadºÍdwBufLenµÄ´óС£¬Ê¹ÓýÏСµÄÄǸö
¡¡¡¡¡¡¡¡¡¡dwRet = 0;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
¡¡¡¡}
¡¡¡¡else // Windows 95/98/Me and Win32s
¡¡¡¡{
¡¡¡¡¡¡while(true) //ʹÓÃwhileÊÇΪÁ˳ö´íʱ·½±ãÌø³öÑ»·
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡if(!ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead)) break;
¡¡¡¡¡¡¡¡if(!ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead)) break;
¡¡¡¡¡¡¡¡if(!ReadProcessMemory(hProc,(LPVOID)(dwAddr 0xC0),tcBuf,BUFFER_LEN,&dwRead)) break;
¡¡¡¡¡¡¡¡if(*tcBuf == 0)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡if(!ReadProcessMemory(hProc,(LPVOID)(dwAddr 0x40),&dwAddr,4,&dwRead)) break;
¡¡¡¡¡¡¡¡¡¡if(!ReadProcessMemory(hProc,(LPVOID)(dwAddr 0x8),&dwAddr,4,&dwRead)) break;
¡¡¡¡¡¡¡¡¡¡if(!ReadProcessMemory(hProc,(LPVOID)dwAddr,tcBuf,BUFFER_LEN,&dwRead)) break;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡_tcsncpy(pCmdLine,tcBuf,dwBufLen); //×îºÃ¼ì²éÒ»ÏÂdwReadºÍdwBufLenµÄ´óС£¬Ê¹ÓýÏСµÄÄǸö
¡¡¡¡¡¡¡¡dwRet = 0;
¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡}
¡¡¡¡}
¡¡}
¡¡catch(...)
¡¡{
¡¡¡¡dwRet = ERROR_INVALID_ACCESS; //exception
¡¡}
¡¡CloseHandle(hProc);
¡¡return dwRet;
}



