Command Line запущеной программы

Тема в разделе "WASM.WIN32", создана пользователем volosatiy2006, 19 май 2007.

  1. volosatiy2006

    volosatiy2006 New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    17
    Господа! Как получить параметры с которыми была вызвана программа?
    ProcessExplorer как это делает? Я в мсдне не нашёл - может плохо искал?
    Направте!
    Спасибо.
     
  2. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    GetCommandLine?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кажется это в PEB есть
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    PEB + ReadProcessMemory
     
  5. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    стоит ли отдавать однозначное предпочтение тому или иному методу?
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    хочу попутно задать вопрос: а как узнать, где в соседней программе находится PEB? А то очень интересует, как Олли затирает флаг отладки в отлаживаемом приложении
     
  7. volosatiy2006

    volosatiy2006 New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    17
    Спасибо.
    Одно НО - если GetCommandLine - для, своего
    а для другого процесса?
    я в инете встречал способ - типа инжект, а там уже GetCommandLine
    Насколько я понял стандартно нельзя, т.е. через АПИ.
    А тогда не подскажители описание структуры PEB, и как же её прочитать из чужого процесса.

    К тому же на всё это ругается фаервол ...
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. typedef struct _PEB
    2. {
    3.     BYTE InheritedAddressSpace;
    4.     BYTE ReadImageFileExecOptions;
    5.     BYTE BeingDebugged;
    6.     BYTE SpareBool;
    7.     void* Mutant;
    8.     void* ImageBaseAddress;
    9.     struct _PEB_LDR_DATA* Ldr;
    10.     struct _RTL_USER_PROCESS_PARAMETERS* ProcessParameters;
    11.     void* SubSystemData;
    12.     void* ProcessHeap;
    13.     void* FastPebLock;
    14.     void* FastPebLockRoutine;
    15.     void* FastPebUnlockRoutine;
    16.     DWORD EnvironmentUpdateCount;
    17.     void* KernelCallbackTable;
    18.     DWORD SystemReserved[2];
    19.     struct _PEB_FREE_BLOCK* FreeList;
    20.     DWORD TlsExpansionCounter;
    21.     void* TlsBitmap;
    22.     DWORD TlsBitmapBits[2];
    23.     void* ReadOnlySharedMemoryBase;
    24.     void* ReadOnlySharedMemoryHeap;
    25.     void** ReadOnlyStaticServerData;
    26.     void* AnsiCodePageData;
    27.     void* OemCodePageData;
    28.     void* UnicodeCaseTableData;
    29.     DWORD NumberOfProcessors;
    30.     DWORD NtGlobalFlag;
    31.     LARGE_INTEGER CriticalSectionTimeout;
    32.     DWORD HeapSegmentReserve;
    33.     DWORD HeapSegmentCommit;
    34.     DWORD HeapDeCommitTotalFreeThreshold;
    35.     DWORD HeapDeCommitFreeBlockThreshold;
    36.     DWORD NumberOfHeaps;
    37.     DWORD MaximumNumberOfHeaps;
    38.     void** ProcessHeaps;
    39.     void* GdiSharedHandleTable;
    40.     void* ProcessStarterHelper;
    41.     DWORD GdiDCAttributeList;
    42.     void* LoaderLock;
    43.     DWORD OSMajorVersion;
    44.     DWORD OSMinorVersion;
    45.     WORD OSBuildNumber;
    46.     WORD OSCSDVersion;
    47.     DWORD OSPlatformId;
    48.     DWORD ImageSubsystem;
    49.     DWORD ImageSubsystemMajorVersion;
    50.     DWORD ImageSubsystemMinorVersion;
    51.     DWORD ImageProcessAffinityMask;
    52.     DWORD GdiHandleBuffer[34];
    53.     void* PostProcessInitRoutine;
    54.     void* TlsExpansionBitmap;
    55.     DWORD TlsExpansionBitmapBits[32];
    56.     DWORD SessionId;
    57.     ULARGE_INTEGER AppCompatFlags;
    58.     void* pShimData;
    59.     void* AppCompatInfo;
    60.     UNICODE_STRING CSDVersion;
    61.     void* ActivationContextData;
    62.     void* ProcessAssemblyStorageMap;
    63.     void* SystemDefaultActivationContextData;
    64.     void* SystemAssemblyStorageMap;
    65.     DWORD MinimumStackCommit;
    66. } PEB;
    67.  
    68. typedef struct _RTL_USER_PROCESS_PARAMETERS
    69. {
    70.     ULONG               AllocationSize;
    71.     ULONG               Size;
    72.     ULONG               Flags;
    73.     ULONG               DebugFlags;
    74.     HANDLE              hConsole;
    75.     ULONG               ProcessGroup;
    76.     HANDLE              hStdInput;
    77.     HANDLE              hStdOutput;
    78.     HANDLE              hStdError;
    79.     UNICODE_STRING      CurrentDirectoryName;
    80.     HANDLE              CurrentDirectoryHandle;
    81.     UNICODE_STRING      DllPath;
    82.     UNICODE_STRING      ImagePathName;
    83.     UNICODE_STRING      CommandLine;
    84.     PWSTR               Environment;
    85.     ULONG               dwX;
    86.     ULONG               dwY;
    87.     ULONG               dwXSize;
    88.     ULONG               dwYSize;
    89.     ULONG               dwXCountChars;
    90.     ULONG               dwYCountChars;
    91.     ULONG               dwFillAttribute;
    92.     ULONG               dwFlags;
    93.     ULONG               wShowWindow;
    94.     UNICODE_STRING      WindowTitle;
    95.     UNICODE_STRING      Desktop;
    96.     UNICODE_STRING      ShellInfo;
    97.     UNICODE_STRING      RuntimeInfo;
    98.     RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];
    99. } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
     
  9. serpenter

    serpenter New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    3
    cresta
    Ох СПАСИБО!
    А вот описание :)
    где-то ты же взял эту структуру ... :)
    спасибо
     
  10. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    фаервол скорее всего аутпост и ругается он именно на внедрение в другой процесс а не обнаружение коммандной строки )
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Нет у меня описания. По названиям параметров можно понять, что и где лежит.
    Получаешь указатель на EProcess через IoGetCurrentProcess(), далее из EProcess получаешь указатель на PEB, из которого получаешь указатель на RTL_USER_PROCESS_PARAMETERS, в котором сидит искомый CommandLine в виде UNICODE_STRING.

    Это из драйвера через IoGetCurrentProcess() получается EProcess. Как из юзера - не знаю, подозреваю, что никак не получается для чужого процесса (где-то читал такое).
    Для своего процесса указатель на PEB получается так:

    assume fs:nothing
    mov eax,FS:[00000030h]
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    GetThreadSelectorEntry - получаешь базу FS. (Селектор FS одинаковый у всех юзермодных прог).
    Далее берешь эту базу и делаeшь ReadProcessMemory / WriteProcessMemory. Структура PEB описана выше
    GetThreadSelectorEntry
     
  13. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Посмотри исходники EzProcess (EzProcess.v1.82_src) там ассемблер и все легко найти.
    Правда нужный тебе функционал в библиотеке ProcHlpr.lib, а исходников нет. Но дизассемблер в руки и все на ура найдешь. Функиция GetProcessEBDataA

    invoke GetProcessEBDataA,dProcessID,pBuffer,dBuffSize,PEB_GET_CMD_LINE

    Алгоритм:
    OpenProcess
    ZwQueryInformationProcess
    ReadProcessMemory
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    GMax
    Не проще GetThreadSelectorEntry для FS'а сделать?
     
  15. Slavic

    Slavic New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    14
    Для чужого процесса PEB можно получить из user mode вызовом NtQueryInformationProcess. Для этого нужен только дескриптор чужого процесса. Структура PEB (если я правильно понял Руссиновича&Соломона) находится в пользовательском адресном пространстве процесса. Далее ReadProcessMemory. В этом случае инжект не нужен.
    Но я могу ошибаться, потому как сам этого не делал. Но если мысль пригодится - пожалуйста.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. program GetProcCmdLine;
    2.  
    3. uses
    4.  Windows;
    5.  
    6. function NtQueryInformationProcess(hProcess: THandle; ProcessInfoClass: Integer; ProcessInfoBuffer: Pointer;
    7.  ProcessInfoBufferLength: Cardinal; BytesReturned: PCardinal): integer; stdcall; external 'ntdll.dll';
    8.  
    9. function GetCommandLine(pID: DWORD): PWChar;
    10. label err;
    11. var
    12.  pbi: array [0..5] of DWORD;
    13.  hProc: THandle;
    14.  pProcParams: DWORD;
    15.  wCmdLen: WORD;
    16.  pCmdLine: DWORD;
    17.  br: DWORD;
    18. begin
    19.  result := nil;
    20.  hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, pID);
    21.  if NtQueryInformationProcess(hProc, 0, @pbi, $18, nil) <> 0 then goto err;
    22.  if not ReadProcessMemory(hProc, Pointer(pbi[1] + $10), @pProcParams, 4, br) then goto err;
    23.  if not ReadProcessMemory(hProc, Pointer(pProcParams + $40), @wCmdLen, 2, br) then goto err;
    24.  if not ReadProcessMemory(hProc, Pointer(pProcParams + $44), @pCmdLine, 4, br) then goto err;
    25.  result := GetMemory(wCmdLen);
    26.  if result = nil then goto err;
    27.  if not ReadProcessMemory(hProc, Pointer(pCmdLine), result, wCmdLen, br) then
    28.   begin
    29.    FreeMemory(result);
    30.    result := nil;
    31.   end;
    32. err:
    33.  CloseHandle(hProc);
    34. end;
    35.  
    36. begin
    37.  MessageBoxW(0, GetCommandLine(1028), 'Command line is:', 0);
    38. end.
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Правильно понял ) Адрес можно найти в EPROCESS или в FS:[0]->Self в юзермоде
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1.     const DWORD FS = 0x3B;
    2.     DWORD ownerProcessId = 38056;
    3.  
    4.     // Open process
    5.     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ownerProcessId);
    6.     if(!hProcess)
    7.         return printf("Cannot open process\n");
    8.  
    9.     // Find thread
    10.     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    11.     THREADENTRY32 te = {sizeof(te)};
    12.     Thread32First(hSnapshot, &te);
    13.     DWORD threadId = 0;
    14.     do
    15.     {
    16.         if(te.th32OwnerProcessID == ownerProcessId)
    17.             threadId = te.th32ThreadID;
    18.     }
    19.     while(Thread32Next(hSnapshot, &te));
    20.     if(!threadId)
    21.         return printf("No threads for specified process id\n");
    22.  
    23.     // Get FS base
    24.     HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, 0, threadId);
    25.     if(!hThread)
    26.         return printf("Cannot open thread\n");
    27.  
    28.     LDT_ENTRY fs_entry;
    29.     GetThreadSelectorEntry(hThread, FS, &fs_entry);
    30.  
    31.     DWORD fs_base = fs_entry.BaseLow | (fs_entry.HighWord.Bytes.BaseMid<<16) | (fs_entry.HighWord.Bytes.BaseHi<<24);
    32.  
    33.     // Read modules list
    34.     TEB teb;
    35.     DWORD read;
    36.     if(!ReadProcessMemory(hProcess, (LPCVOID) fs_base, &teb, sizeof(teb), &read))
    37.         return printf("Can't read process memory for TEB, %d bytes read\n", read);
    38.  
    39.     PEB peb;
    40.     if(!ReadProcessMemory(hProcess, (LPCVOID) teb.Peb, &peb, sizeof(peb), &read))
    41.         return printf("Can't read process memory for PEB, %d bytes read\n", read);
     
  19. serpenter

    serpenter New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    3
    Наконец добрался до инета.
    Спасибо ВАМ огромное - буду разбираться!