Список процессов

Тема в разделе "WASM.WIN32", создана пользователем prus, 15 май 2008.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Все привет.
    Подскажите, как с помощью прямого вызова sysenter для XP и 2Eh для 2000 получить список процессов?
    Код (Text):
    1. DWORD WINAPI SyscallQueryInfo(...) {
    2.    asm{
    3.       pop ebp
    4.       mov eax,0x00AD
    5.       mov ebx,esp
    6.       sysenter
    7.       ret 0x10
    8.    }
    9. }
    10. Это по аналогии попытался сделать, как у MS-Rem'a в статье написано, но не работает.
    11. Что не так?
    12. Подскажите плз... В Builder'e делаю.
    13. Заранее благодарен.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    это только вызов системного сервиса. нужно ещё обработать информацию в буфере, заполненном после вызова сервиса.
     
  3. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    Сделать сначала получение списка процессов через NtQuerySystemInformation, а потом NtQuerySystemInformation заменить на её syscall-аналог, примерно как ты написал
     
  4. Blind

    Blind New Member

    Публикаций:
    0
    Регистрация:
    12 май 2008
    Сообщения:
    6
    Ммм.. По моему достаточно одного вызова NtQuerySystemInformation(5, x, y, NULL) :0)
     
  5. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Спасибо за ответы...
    Вот приведу полностью, как делаю:
    Код (Text):
    1. DWORD WINAPI XpSystemcallZwQuerySystemInformation(UINT uiInfoType, PVOID pvBuffer, ULONG ulBufferSize, PULONG pulReturn) {
    2.  
    3.    asm{
    4.       pop ebp
    5.       mov eax,0x00AD
    6.       mov ebx,esp
    7.       sysenter
    8.       ret 0x10
    9.    }
    10.  
    11. }
    12.  
    13. DWORD GetSystemCallProcessesList() {
    14.  
    15. ...
    16. ...
    17.  
    18.     do {
    19.  
    20.         pvBuffer = (PVOID)VirtualAlloc(NULL, ulBufferSize, MEM_COMMIT, PAGE_READWRITE);
    21.         if( pvBuffer == NULL )
    22.             goto END;
    23.  
    24.         ntStatus = XpSystemcallZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
    25.                                                         pvBuffer,
    26.                                                         ulBufferSize,
    27.                                                         NULL);
    28.  
    29.         if( ntStatus == STATUS_INFO_LENGTH_MISMATCH ) {
    30.             VirtualFree(pvBuffer, 0, MEM_RELEASE);
    31.             ulBufferSize *= 2;
    32.         }
    33.         else if( !NT_SUCCESS(ntStatus) ) {
    34.             goto END;
    35.         }
    36.  
    37.     } while( ntStatus == STATUS_INFO_LENGTH_MISMATCH );
    38.  
    39. ...
    40. ...
    41.        
    42. }
    В XpSystemcallZwQuerySystemInformation при sysenter вылетает ошибка.
    Помогите плз разобраться.
     
  6. Blind

    Blind New Member

    Публикаций:
    0
    Регистрация:
    12 май 2008
    Сообщения:
    6
    Ни знаю на кой черт тебе какой то sysenter если всё делается оч просто:

    Код (Text):
    1. DWORD piBuf = 65536; //а лучше 0x20000 или 0x40000
    2. LPVOID lpBuf = NULL;
    3. PSYSTEM_PROCESS_INFORMATION pInfo = NULL;
    4. DWORD ProcessCount=0;
    5. LPWSTR lpName = NULL;
    6.  
    7. lpBuf = malloc(piBuf);
    8. NtQuerySystemInformation(5, lpBuf, piBuf, NULL);
    9. pInfo = (PSYSTEM_PROCESS_INFORMATION)lpBuf;
    10.  
    11. for (;;)
    12.   {
    13.     ProcessCount++;
    14.        
    15.     lpName = pInfo->ProcessName.Buffer;
    16.     if (lpName==NULL)
    17.     lpName = L"Idle";
    18.  
    19.     wprintf(L"> %ls\n", lpName);
    20.     wprintf(L"\n");
    21.     wprintf(L"ID\t %d\n", pInfo->ProcessId);
    22.     wprintf(L"Threads\t %d\n", pInfo->ThreadCount);
    23.     wprintf(L"Handles\t %d\n", pInfo->HandleCount);
    24.     wprintf(L"______________________________\n\n");
    25.  
    26.     if (pInfo->NextEntryDelta == 0) break;
    27.  
    28.     pInfo = (PSYSTEM_PROCESS_INFORMATION)(((DWORD)pInfo) + pInfo->NextEntryDelta);
    29.  
    30. }
    31.  
    32. free(lpBuf);
    вся любовь :0)
     
  7. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Может так:
    Код (Text):
    1. DWORD WINAPI XpSystemcallZwQuerySystemInformation(UINT uiInfoType, PVOID pvBuffer, ULONG ulBufferSize, PULONG pulReturn) {
    2.  
    3.    asm{
    4.       pop ebp
    5.       mov eax,0x00AD
    6.       mov [b]edx[/b],esp
    7.       sysenter
    8.       ret 0x10
    9.    }
    10.  
    11. }
    и поиск по форуму
    http://wasm.ru/forum/viewtopic.php?id=10962&p=1
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prus
    Вот мне интересно, зачем тебе это юзать ?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1.       mov ebx,esp
    2.       sysenter
    3.       ret 0x10
    это по-любому круто. с учетом, что sysenter управления не возвращает
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    +1
    prus
    Модель вызова:
    [esp+4*(N+1)]: Параметр N
    ...
    [esp+0C]: Параметр 2
    [esp+8]: Параметр 1
    [esp+4]: XXX
    [esp]: Адрес возврат из sysenter

    Регистр Edx указавает на адрес возврата в стеке, в регистре Eax номер сервиса.
    После возврата управление передаётся на адрес возврата, а регистр Esp увеличивается на 4.
     
  11. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Приветствую!
    Я не силен в asm, но по вашим ответам сворганил такое:
    Код (Text):
    1. DWORD WINAPI XpSystemcallZwQuerySystemInformation(UINT uiInfoType, PVOID pvBuffer, ULONG ulBufferSize, PULONG pulReturn) {
    2.  
    3.    asm{
    4.       pop ebp
    5.       mov eax,0x00AD
    6.       mov edx,esp
    7.       sysenter
    8.       ret 0x10
    9.    }
    10.  
    11. }
    12.  
    13. DWORD GetSystemCallProcessesList() {
    14.  
    15. ...
    16. ...
    17.  
    18.     do {
    19.  
    20.         pvBuffer = (PVOID)VirtualAlloc(NULL, ulBufferSize, MEM_COMMIT, PAGE_READWRITE);
    21.         if( pvBuffer == NULL )
    22.             goto END;
    23.  
    24.         ntStatus = XpSystemcallZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
    25.                                                         pvBuffer,
    26.                                                         ulBufferSize,
    27.                                                         NULL);
    28.  
    29.         if( ntStatus == STATUS_INFO_LENGTH_MISMATCH ) {
    30.             VirtualFree(pvBuffer, 0, MEM_RELEASE);
    31.             ulBufferSize *= 2;
    32.         }
    33.         else if( !NT_SUCCESS(ntStatus) ) {
    34.             goto END;
    35.         }
    36.  
    37.     } while( ntStatus == STATUS_INFO_LENGTH_MISMATCH );
    38.  
    39. ...
    40. ...
    41.        
    42. }
    Но почему-то XpSystemcallZwQuerySystemInformation возвращяет ошибочный статус.
    Не поможите плз еще немного :)?
     
  12. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Оно должно выглядеть так:
    Код (Text):
    1. Function XpZwQuerySystemInfoCall(ASystemInformationClass: dword;
    2.                                  ASystemInformation: Pointer;
    3.                                  ASystemInformationLength: dword;
    4.                                  AReturnLength: pdword): dword; stdcall;
    5. asm
    6.  pop ebp
    7.  mov eax, $AD
    8.  call @SystemCall
    9.  ret $10
    10.  @SystemCall:
    11.  mov edx, esp
    12.  sysenter
    13. end;
    А у тебя на стеке совсем не то, что ожидает увидеть sysenter.
     
  13. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    prus,

    сказали же уже:
    sysenter - не возвращает управления

    Какой именно?

    Код NtQuerySystemInformation в нтдлл состоит из пары инструкций, неужели нельзя их посмотреть? )

    Код (Text):
    1. 7C90E1AA >/$  B8 AD000000   mov eax,0AD
    2. 7C90E1AF  |.  BA 0003FE7F   mov edx,7FFE0300
    3. 7C90E1B4  |.  FF12          call dword ptr ds:[edx] -- mov edx, esp/sysenter
    4. 7C90E1B6  \.  C2 1000       retn 10
     
  14. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Twister
    Спасиб, я по этому примеру и пытался сделать:
    Код (Text):
    1. asm {
    2.  pop ebp
    3.  mov eax, 0x00AD
    4.  call SystemCall
    5.  ret 0x10
    6.  SystemCall:
    7.  mov edx, esp
    8.  sysenter
    9. }
    но у меня Builder'овский компилятор ругается на строчку "call SystemCall" (Undefined symbol "SystemCall").
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prus
    Спрошу ещё раз. Мне очень интересно, для чего тебе вызывать сервисы через sysenter ?
     
  16. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Clerk
    Это один из способов получить список процессов. То, про что говорите Вы, уже реализовано, спасиб!
     
  17. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Clerk
    Я тут под дебагером поглядел, что там в стеке происходит и все очень похоже на то, что Вы описали. Делаю так:
    Код (Text):
    1. asm {
    2.    //INT 3
    3.    POP EBP
    4.    MOV EAX, 0x00AD
    5.    MOV EDX, ESP
    6.    SYSENTER
    7. }
    В итоге выполнения вызова EAX = 0xC0000003 (STATUS_INVALID_INFO_CLASS). Т.е., насколько понимаю, не совсем прально параметры в стеке лежат.
    Что не так опять?
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prus
    Можно так,
    Код (Text):
    1. SystemCall:
    2.     mov edx,esp
    3.     sysenter
    4. CallService:
    5.     mov eax,0ADh
    6.     call SystemCall
    7.     ret 10h     ;add esp,4
    Или так.
    Код (Text):
    1.     mov eax,0ADh
    2.     push edx        ;Esp-4
    3.     Call Delta 
    4. Delta:
    5.     sub dword ptr [esp],(offset Delta - offset Return)  ;ptr Return
    6.     mov edx,esp
    7.     sysenter
    8. Return:
    9.     add esp,4*4+4
     
  19. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    2prus
    Вообще жёстко зашитые номера сервисов - зло.
     
  20. wasm_test

    wasm_test wasm test user

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

    PUCHAR pQuerySysInfo = (PUCHAR) GetProcAddress (GetModuleHandle("ntdll.dll"), "ZwQuerySystemInformation"));

    тогда *(PULONG)&pQuerySysInfo[1] - номер сервиса