Вопрос по получению имени процесса.

Тема в разделе "WASM.BEGINNERS", создана пользователем ZamDec, 28 сен 2007.

  1. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Драйвер режима ядра.

    Код (Text):
    1. //Ищет смещение для определения имени поцесса
    2. ULONG GetProcessNameOffset()
    3. {
    4.     PEPROCESS curproc = PsGetCurrentProcess();
    5.     ULONG name_ofs = 0;
    6.     int i;
    7.  
    8.     for(i = 0; i < 3*PAGE_SIZE; i++)
    9.     {
    10.         if(!strncmp("System", (PCHAR)curproc + i, strlen("System")))  
    11.             name_ofs = i;
    12.     }
    13.  
    14.     return name_ofs;
    15. }
    16.  
    17. GetName(char* CurrProcName)
    18. {
    19.     PEPROCESS process = PsGetCurrentProcess();
    20.  
    21.     if (EPROCESS_name & process)   //  EPROCESS_name - offset имени в процессе
    22.     __try
    23.     {
    24.         strncpy(CurrProcName, ((char*)((ULONG)process + EPROCESS_name)), 63);
    25.         CurrProcName[63] = 0;
    26.     }
    27.     __except(EXCEPTION_EXECUTE_HANDLER)
    28.     {
    29.         CurrProcName = "=exception=";
    30.         DbgPrint("DRIVER : GetName() - ERROR.");
    31.     }
    32. }
    Бывает что получаю обрезанные имена процессов... типо "lsass.ex" и т.п. Передаю в функцию всегда char MyStr[64]. Вроде длины хватает. но что не так, не пойму =\
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    почему бы не использовать структуру EPROCESS и не работать с ней по человечески. типа epr->ImageFileName.
    UCHAR ImageFileName[16]; // +0x154

    http://www.acc.umu.se/~bosse/ntifs.h
     
  3. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Копировал, вставлял структуру. Подключал модули которая она использует. Всеравно куча ошибок =\\\

    Код (Text):
    1. undocnt.h225) : error C2061: syntax error : identifier 'KPROCESS'
    2. undocnt.h(226) : error C2061: syntax error : identifier 'ProcessLock'
    3. undocnt.h(226) : error C2059: syntax error : ';'
    4. undocnt.h(229) : error C2061: syntax error : identifier 'RundownProtect'
    5. undocnt.h(229) : error C2059: syntax error : ';'
    6. undocnt.h(240) : error C2061: syntax error : identifier 'ObjectTable'
    7. undocnt.h(240) : error C2059: syntax error : ';'
    8. undocnt.h(241) : error C2061: syntax error : identifier 'Token'
    9. ....................................
    10. ...........................
    11. ....................
    12. .............
    13. .......
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. #include <ntddk.h>
    2. #include "ntifseg.h"
    3.  
    4. // Unload routine
    5. void DriverUnload(IN PDRIVER_OBJECT DriverObject)
    6. {
    7.     KdPrint(("[~] DriverUnload()\n"));
    8. }
    9.  
    10. // Driver entry point
    11. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    12. {
    13.     DriverObject->DriverUnload = DriverUnload;
    14.  
    15.     KdPrint(("[~] DriverEntry()\n"));
    16.     PEPROCESS epr=PsGetCurrentProcess();
    17.     KdPrint(("[+] processname %s", epr->ImageFileName));
    18.     KdPrint(("[+] Driver initialization successful\n"));
    19.     return STATUS_SUCCESS;
    20. }
    у меня нормально работает
     
  5. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    А у меня даже твой код не работает =\ Может компиляторы различаются... у тебя какой ?

    Ошибки по твоему коду ...
    Код (Text):
    1. 1>c:\WINDDK\2600\inc\ddk\wxp\ntifseg.h(6204) : error C2375: 'ObDereferenceSecurityDescriptor' : redefinition; different linkage
    2. 1>c:\WINDDK\2600\inc\ddk\wxp\ntddk.h(21302) : see declaration of 'ObDereferenceSecurityDescriptor'
    3. 1>c:\WINDDK\2600\inc\ddk\wxp\ntifseg.h(6233) : error C2375: 'ObLogSecurityDescriptor' : redefinition; different linkage
    4. 1>c:\WINDDK\2600\inc\ddk\wxp\ntddk.h(21295) : see declaration of 'ObLogSecurityDescriptor'
    5. 1>c:\WINDDK\2600\inc\ddk\wxp\ntifseg.h(6291) : error C2375: 'ObReferenceSecurityDescriptor' : redefinition; different linkage
    6. 1>c:\WINDDK\2600\inc\ddk\wxp\ntddk.h(21308) : see declaration of 'ObReferenceSecurityDescriptor'
    7. 1>c:\RECEIVER\driver.c(16) : error C2275: 'PEPROCESS' : illegal use of this type as an expression
    8. 1>c:\WINDDK\2600\inc\ddk\wxp\ntddk.h(84) : see declaration of 'PEPROCESS'
    9. 1>c:\RECEIVER\driver.c(16) : error C2146: syntax error : missing ';' before identifier 'epr'
    10. 1>c:\RECEIVER\driver.c(16) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
    11. 1>c:\RECEIVER\driver.c(16) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
    12. 1>c:\RECEIVER\driver.c(16) : error C2143: syntax error : missing ';' before 'identifier'
    13. 1>c:\RECEIVER\driver.c(16) : error C2065: 'epr' : undeclared identifier
    14. 1>c:\RECEIVER\driver.c(16) : warning C4047: '=' : 'int' differs in levels of indirection from 'PEPROCESS'
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    студия 2005.
     
  7. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    К сожалению таковой нет =\
    А Microsoft Visual C++ Toolkit 2003 не подойдет ?
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В PEB->PEB_LDR_DATA->InLoadOrderModuleList есть список всех модулей процесса. Первым идёт имя exe.
    Указатель на PEB можно выудить из ZwQueryInformationProcess+PROCESS_BASIC_INFORMATION

    Вот код, перечисляющий модули процесса. Правда оформлен как вызов WorkItem, но можно всё лишнее отрезать.
    Нужен только pid процесса.
    Ну и объявления структур добавить.
    с WINDDK\2600 компилируется нормально.

    Код (Text):
    1. NTSTATUS EnumProcessModules (PDEVICE_OBJECT DeviceObject,  WORKER_C* pContext){
    2.     NTSTATUS                        Status=STATUS_UNSUCCESSFUL;
    3.     PROCESS_BASIC_INFORMATION        ProcessInfo;
    4.     PEPROCESS                         pErocess;
    5.     HANDLE                            hProcess;
    6.     OBJECT_ATTRIBUTES                oAttr;
    7.     CLIENT_ID                        cid;
    8.     KAPC_STATE                         Apc;
    9.     UNICODE_STRING                    uStr;
    10.     ANSI_STRING                        aStr;
    11.     LIST_ENTRY                        ModuleList;
    12.     PCHAR                            pOutput;
    13.     PCHAR                            pNextLink,p;
    14.     PCHAR                            Ldr;
    15.     int                             cnt=0;
    16.     ULONG                            i,size;
    17.  
    18.     InitializeObjectAttributes (&oAttr, NULL, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
    19.     cid.UniqueProcess = (HANDLE) pContext->lParam;
    20.     cid.UniqueThread = 0;
    21.  
    22.     Status = CodeEntries.pZwOpenProcess (&hProcess, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, &oAttr, &cid);
    23.     if (Status != STATUS_SUCCESS) goto _ret;
    24.     Status = CodeEntries.pZwQueryInformationProcess(hProcess, 0, &ProcessInfo, sizeof(PROCESS_BASIC_INFORMATION), NULL);
    25.     if (Status != STATUS_SUCCESS) goto _close;
    26.     Status = ObReferenceObjectByHandle(hProcess, 0, NULL, KernelMode, &pErocess, NULL);
    27.     if (Status != STATUS_SUCCESS) goto _deref;
    28.  
    29.     KeStackAttachProcess(pErocess, &Apc);
    30.  
    31.     __try {
    32.         pOutput = (PCHAR)pContext->pBuffer;
    33.         pOutput +=8;
    34.         size = 8;
    35.         memcpy (&Ldr, (PCHAR)ProcessInfo.PebBaseAddress+0x0C, 4);
    36.         memcpy (&ModuleList, Ldr+0x0C, sizeof(LIST_ENTRY));
    37.         pNextLink = (PCHAR) ModuleList.Flink;
    38.         do {
    39.             if ((size + 256) > pContext->cbBuffer) {
    40.                 Status = STATUS_INFO_LENGTH_MISMATCH;
    41.                 break;
    42.             }
    43.             p = pNextLink+0x24;
    44.             memcpy (&uStr, p, sizeof(UNICODE_STRING));
    45.             Status = RtlUnicodeStringToAnsiString (&aStr, &uStr, TRUE);
    46.             if    (Status == STATUS_SUCCESS){
    47.                 memcpy (pOutput, aStr.Buffer, 256);
    48.                 //DbgPrint ("Len = %d, MaxLen = %d, Name = %s", uStr.Length, uStr.MaximumLength, pOutput);
    49.                 size +=256;
    50.                 pOutput +=256;
    51.                 RtlFreeAnsiString (&aStr);
    52.                 cnt++;
    53.             }
    54.             memcpy (&pNextLink, pNextLink, 4);
    55.         }while (pNextLink != (PCHAR) ModuleList.Flink);
    56.    
    57.     }__except(EXCEPTION_EXECUTE_HANDLER){}
    58.  
    59.     KeUnstackDetachProcess(&Apc);
    60.  
    61. _deref:
    62.     ObDereferenceObject(pErocess);
    63. _close:
    64.     ZwClose (hProcess);
    65. _ret:
    66.     p = (PCHAR)pContext->pBuffer;
    67.     *((DWORD*) p) = Status;
    68.     *((DWORD*) (p+4)) = cnt;
    69.     IoFreeWorkItem, pContext->pWorkItem;
    70.     KeSetEvent( &pContext->Event, IO_NO_INCREMENT, FALSE);
    71.    
    72.     return Status;
    73.  
    74. }
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ZamDec

    В аттаче полный вариант хидера.
    Подключайте;)
    У меня(VS2003 and DDK2600) работает:dntknw:
    Удачи

    А скорее всего с undocnt.h конфликтует - попробуйте её отключить(не использовать)...
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Эххх

    Потому что в структуре EPROCESS оно обрезанное. Ты тут не при чем

    FreeManCPM
    Это менее переносимый код будет

    Нужно там правильно прописать версию в хидере.
     
  11. pushick

    pushick New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2007
    Сообщения:
    95
    хоглундовский изврат.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    pushick
    изврат-не изврат, зато работает ведь)
    Предложишь способ лучше? Жесткое забивание оффсетов, анализ асм кода ядра, а уж тем более прописывание структур не предлагать.
     
  13. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    pushick
    ну не знаю, я этот код из драйвера руссиновича вытащил, не помню точно какого
    только у меня _strnicmp(...)
    по-моему отличное решение, вполне в логике и стиле винды
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Решение кривое, и не в стиле винды, а в стиле неряхи.
    У винды все разложено по полочкам, нужно пройти к нужной полочке и взять готовое (см.#8).
    Вместо этого перебирается всё подряд, устраивается неразбериха, в которой разобраться не удаётся и получаем результаты, соответствующие методам их получения (lsass.ex).
     
  15. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    cresta
    передал твои слова марку :)
    у меня лично все имена идеально правильные, как в таскманагере
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    лучше дергать из файлового объекта, подробнее у Four-F есть.
     
  17. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    если есть два процесса: some_cool_executable_1.exe и some_cool_executable_2.exe, что покажет твой супер метод? Не более, чем "some_cool_execut". И попробуй определить, который из двух определён :)))
    А ещё говорите, что не кривой метод. Ха-ха...
     
  18. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    cresta
    ладно, уговорил, действительно режет длинные имена, 16 байтов считая 0 в конце максимум
    но твой метод с фиксированными оффсетами мне значительно меньше нравится
    значит нету идеально ровного метода
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    афаир как раз там ascii- а не asciiz- строка.
    метод в моем посте не подходит?
     
  20. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    z0mailbox

    Не нравится, что указано число 0x0C, а не член структуры? Никто не мешает написать так:

    PEB *pPeb = ProcessInfo.PebBaseAddress;
    memcpy (&Ldr, pPeb->Ldr, 4);

    и избавишься от ненавистного числа 0x0C :)))))

    P.S.
    Требование к коду, чтобы он не содержал констант и объявлений структур, выглядит несколько странно...