OpenProcess - некоторые неясности

Тема в разделе "WASM.WIN32", создана пользователем dead_body, 11 дек 2004.

  1. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Возникли некоторые непонятки с этой функцией...

    Return Values

    If the function succeeds, the return value is an open handle of the specified process.

    If the function fails, the return value is NULL. To get extended error information, call GetLastError.

    Я понял что если 0 - то ошибка, а если не 0 то это хэндл...



    А вот сам код:
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include kernel32.inc
    5. includelib kernel32.lib
    6. include user32.inc
    7. includelib user32.lib
    8.  
    9. .code
    10. form1   db  "%ld",0
    11. RtlAdjustPrivilege  db  "RtlAdjustPrivilege",0
    12. ntdll_name  db  "ntdll.dll",0
    13. SE_DEBUG_PRIVILEGE equ 20
    14. ADJUST_CURRENT_PROCESS equ 0
    15. STANDARD_RIGHTS_REQUIRED             equ 0F0000h
    16. PROCESS_ALL_ACCESS equ (STANDARD_RIGHTS_REQUIRED + SYNCHRONIZE + 0FFFh)
    17. SYNCHRONIZE                          equ 100000h
    18. start:
    19.     invoke LoadLibrary,addr ntdll_name
    20.     invoke GetProcAddress,eax,offset RtlAdjustPrivilege
    21.     push eax
    22.     push esp
    23.     push ADJUST_CURRENT_PROCESS
    24.     push 1
    25.     push SE_DEBUG_PRIVILEGE
    26.     Call eax   
    27.     pop eax
    28.     xor edi,edi
    29. proc1   proc
    30. LOCAL lazha:dword
    31. LOCAL str1[255]:byte
    32.     @@: invoke OpenProcess,PROCESS_ALL_ACCESS,0,edi
    33.     invoke GetLastError
    34.     .if eax != 57
    35.         xchg esi,eax
    36.             invoke CloseHandle,esi
    37.             .if eax != 0
    38.             invoke wsprintf,addr str1,addr form1,edi
    39.             invoke MessageBox,0,addr str1,0,0
    40.             .endif
    41.     .endif
    42.     inc edi
    43.     cmp edi,2710
    44.     jz @D
    45.     jmp @B
    46. @D: invoke MessageBox,0,0,0,0
    47.    
    48. proc1 endp
    49. invoke ExitProcess,00h
    50. end start




    Но после каждого пида он выдаёт что есть процесс с пидом как предыдущий но +2, никак не вьеду в связи с чем?

    OpenProcess return 74h- это хэндл процесса с пидом в 6?
     
  2. IceStudent

    IceStudent Active Member

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

    1. NTDLL.DLL уже загружена, поэтому проще вызывать GetModuleHandle.

    2. у тебя код после xor edi,edi "проваливается" в процедуру proc1 с созданием стекового фрейма и прочих последствий. Так не делают обычно.

    3. после @D:invoke MessageBox,0,0,0,0 куда попадёшь? Если я не ошибаюсь, то в код kernel32.



    И вообще странный у тебя код. Нужно проверять результат OpenProcess и только если он равен 0 получать код посл. ошибки.
     
  3. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    И вообще странный у тебя код.

    Это просто на скорую руку наклёпан, и я спросил почему OpenProcess возвращает лажу...

    с созданием стекового фрейма и прочих последствий.

    и какие здесь последствия?

    3. после @D:invoke MessageBox,0,0,0,0 куда попадёшь? Если я не ошибаюсь, то в код kernel32

    Это я сделал для того что бы видеть что мой процесс дожил до конца и всё

    и только если он равен 0 получать код посл. ошибки.

    если равно нулю, то GetLastError возвращает 57
     
  4. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    dead_body

    После вызова функции GetLastError у тебя затерается значение в регистре EAX, т.е. хэндла процесса в нем уже не будет...
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >




    До invoke ExitProcess,00h дело не дойдёт :derisive:



    >




    Наверное, 57h:

    87 The parameter is incorrect. ERROR_INVALID_PARAMETER





    Ты пытаешся открыть процесс с ID = 0 - System Idle Process ?
     
  6. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Но вы заметьте что

    invoke OpenProcess,PROCESS_ALL_ACCESS,0,edi

    invoke GetLastError

    .if eax != 57

    xchg esi,eax - сохраняем то что получили от GetLastError и закрываем хэндл на него(притом то что на всё существующие процессы это проходит)

    у меня в системе видит все процессы(ну по крайнемере так думаю я,ведь а в друг перехватывают)

    IceStudent

    а если сделать проверку на еах после OpenProcess то получаеться (лучше проверьте сами а то мой монитор показует реальный ПИД ,потом ПИД+1,ПИД+2,ПИД+3 и вроде ПИД+4) ну и конечно тогда нада поставить xchg eax,esi перед GetLastError....

    S_T_A_S_

    До invoke ExitProcess,00h дело не дойдёт :derisive:

    ДоХОДИТ! Сам раз 10 проверял
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    S_T_A_S_

    Наверное, 57h:


    а так выдает вообще билеберду...- хотя ты скорее всего прав по теории,но здесь на практике такое...

    Люди помогите разобраться с OpenProcess, что у него за глюки такие? вообще по идее на несуществующие 0 давать должен, да и Хэндл успешно на возв. значени GetLastError

    закрываться не должен...



    Или меня глючит по конкретному... Может потестить с Нативе АПИ и посмотреть что там будет?
     
  8. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Вот это, IMHO, должно работать нормально:


    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include kernel32.inc
    5. includelib kernel32.lib
    6. include user32.inc
    7. includelib user32.lib
    8.  
    9. .code
    10. form1   db  "%ld",0
    11. RtlAdjustPrivilege  db  "RtlAdjustPrivilege",0
    12. ntdll_name  db  "ntdll.dll",0
    13. SE_DEBUG_PRIVILEGE equ 20
    14. ADJUST_CURRENT_PROCESS equ 0
    15. STANDARD_RIGHTS_REQUIRED             equ 0F0000h
    16. PROCESS_ALL_ACCESS equ (STANDARD_RIGHTS_REQUIRED + SYNCHRONIZE + 0FFFh)
    17. SYNCHRONIZE                          equ 100000h
    18.  
    19. proc1   proc
    20. LOCAL lazha:dword
    21. LOCAL str1[255]:byte
    22.     invoke LoadLibrary,addr ntdll_name
    23.     invoke GetProcAddress,eax,offset RtlAdjustPrivilege
    24.     push eax
    25.     push esp
    26.     push ADJUST_CURRENT_PROCESS
    27.     push 1
    28.     push SE_DEBUG_PRIVILEGE
    29.     Call eax   
    30.     pop eax
    31.     xor edi,edi
    32.     @@: invoke OpenProcess,PROCESS_ALL_ACCESS,0,edi
    33.     .if eax
    34.         invoke CloseHandle,eax
    35.         .if eax
    36.             invoke wsprintf,addr str1,addr form1,edi
    37.             invoke MessageBox,0,addr str1,0,0
    38.         .endif
    39.     .else
    40.         invoke GetLastError
    41.     .endif
    42.     inc edi
    43.     cmp edi,2710
    44.     jz @D
    45.     jmp @B
    46. @D: invoke MessageBox,0,0,0,0
    47.     invoke ExitProcess,00h
    48. proc1 endp
    49. end proc1
     
  9. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    dead_body

    Ну как, работает?
     
  10. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Oleg_SK

    хуже чем моё,выдает пиды 4,5,6,7,180,181,182....

    а нада 4,180,....

    а хуже того,добавил:

    (еbx==esi==handle)

    invoke GetProcessWorkingSetSize,ebx,addr lazha,addr lazha

    .if eax != 0

    invoke CloseHandle,esi

    .if eax != 0

    invoke wsprintf,addr str1,addr form1,edi

    invoke MessageBox,0,addr str1,0,0

    .endif

    .endif

    и с GetProcessWorkingSetSize блин тоже остаеться ПИД,ПИД+2 ... ПИД,ПИД+2

    Значит загвоздка где-то в ОпенПроцесс...
     
  11. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    А теперь вообще глюК Полнейший,вот кусок

    КУСОК:

    proc1 proc

    LOCAL lazha:dword

    LOCAL str1[255]:byte

    @@: invoke OpenProcess,PROCESS_ALL_ACCESS,0,edi

    xchg ebx,eax

    invoke GetLastError

    .if eax != 57

    xchg eax,esi

    invoke GetProcessWorkingSetSize,ebx,addr lazha,addr lazha

    .if eax != 0

    invoke CloseHandle,esi

    .if eax != 0

    invoke wsprintf,addr str1,addr form1,edi

    invoke MessageBox,0,addr str1,0,0

    .endif

    .endif

    .endif

    inc edi

    cmp edi,5710

    jz @D

    jmp @B

    @D:invoke MessageBox,0,0,0,0

    proc1 endp



    А теперь добавим после МессагеВох"а

    invoke CloseHandle,ebx

    .if eax == 0

    invoke MessageBox,0,0,0,0

    .endif

    и узнаем что хэндлы завершаются неудачно на "правильные пиды" а на "пид+2"-всё оК.
     
  12. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    dead_body

    На www.rsdn.ru есть статья: "Как получить список запущенных процессов?" (правда, примеры в ней написаны на C++, но, я думаю, что это не проблема).
     
  13. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Oleg_SK

    да получать процессы я умею, ты мне лучше обьясни поведение АПИ и как такой код может работать?
     
  14. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    dead_body

    А почему до сих пор не заменил 57 на 57h, и не оформил код тегами?
     
  15. IceStudent

    IceStudent Active Member

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

    Ну сколько можно. Тег code для чего предназначен?
     
  16. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    IceStudent

    звини, теперь буду делать как нужно

    Oleg_SK

    а ты скомпиль так и так и увидишь:)
     
  17. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    dead_body

    Посмотри, ты снова забыл, что после вызова функции GetLastError значение регистра EAX (которое ты передаешь в регистр ESI) будет затерто. Следовательно при последующем вызове функции invoke CloseHandle,esi будет (возможно) закрыт какой-то "левый" хэндл.
     
  18. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Далее, ты все таки сделай нормальную проверку значения, которое возвращает функция OpenProcess. GetLastError нужно вызывать ТОЛЬКО В ТОМ СЛУЧАЕ, если OpenProcess вернула ноль. Вспомни, что GetLastError возвращает код ПОСЛЕДНЕЙ ошибки, а не результат выполнения предыдущей функции...
     
  19. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    dead_body

    "...и узнаем что хэндлы завершаются неудачно на "правильные пиды" а на "пид+2"-всё оК."

    Это происходит, скорее всего, из-за кучи ошибок (на которые тебе уже указывали) в твоем коде. Во всяком случае, у меня все открытые хэндлы закрываются нормально.



    Что касается функции OpenProcess, то в ее работе действительно не все понятно...
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Для системы не существенны 2 младших бита ID процесса!

    По крайней мере, так на XPSP2:
    Код (Text):
    1.  
    2. ExpLookupHandleTableEntry:
    3. 805643C1                 mov     edi, edi
    4. 805643C3                 push    ebp
    5. 805643C4                 mov     ebp, esp
    6. 805643C6                 and     dword ptr [ebp+0Ch], 0FFFFFFFCh ; !
    7. 805643CA                 mov     eax, [ebp+0Ch]
    8. 805643CD                 mov     ecx, [ebp+8]
    9. 805643D0                 mov     edx, [ebp+0Ch]
    10. 805643D3                 shr     eax, 2
    11. 805643D6                 cmp     edx, [ecx+38h]
    12. 805643D9                 jnb     8056C8D6
    13. 805643DF                 push    esi
    14. 805643E0                 mov     esi, [ecx]
    15. 805643E2                 mov     ecx, esi
    16. 805643E4                 and     ecx, 3
    17. 805643E7                 and     esi, 0FFFFFFFCh
    18. 805643EA                 sub     ecx, 0
    19. 805643ED                 jnz     80564EA4
    20. 805643F3                 lea     eax, [esi+eax*8]
    21. 805643F6                 pop     esi
    22. 805643F7                 pop     ebp
    23. 805643F8                 retn    8