EnumProcessModules (winapi) в asm

Тема в разделе "WASM.BEGINNERS", создана пользователем cdump, 13 янв 2010.

  1. cdump

    cdump New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2010
    Сообщения:
    5
    Не могу разобраться что тут не так: мне нужно вызвать функцию EnumProcessModules. Удалив весь не имеющий отношения к этому выводу код я получил то, что вы можете увидеть ниже:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include C:\masm32\include\windows.inc
    6. include C:\masm32\include\shlwapi.inc
    7. include C:\masm32\include\kernel32.inc
    8. includelib C:\masm32\lib\kernel32.lib
    9. include C:\masm32\include\user32.inc
    10. includelib C:\masm32\lib\user32.lib
    11. include \masm32\include\masm32.inc
    12. includelib \masm32\lib\masm32.lib
    13. include c:\masm32\include\psapi.inc
    14. includelib c:\masm32\lib\psapi.lib
    15.  
    16. pid dd 0
    17. mzm dd 0
    18. need dd 0
    19.  
    20. .code
    21.  
    22. start:
    23.  
    24.  
    25. invoke LocalAlloc,NULL,1024
    26. mov mzm,eax
    27.  
    28. invoke GetCurrentProcess
    29. mov pid,eax
    30.  
    31. invoke EnumProcessModules,pid,mzm,10,need
    32.  
    33. cmp eax,0
    34. jnz @exit
    35. invoke MessageBox,NULL,NULL,NULL,MB_OK
    36.  
    37.  
    38. @exit:
    39. ret
    40. end start
    В OllyDBG все выглядит нормально, но после вызова EnumProcessModules вижу ERROR_NOACCESS.
    В MSDN написано, что GetCurrentProcess возращает "виртуальный" хэндл текущего процесса "с максимальными привелегиями". Аналогичный код на Си работает нормально. Отладчик запускается под администратором, ОС: Windows 7 Pro, ассемблер: masm32
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    cdump
    Я не силён в масме, но подозреваю, что ".data", где должны быть объявлены переменные, а также взятие адреса при передаче need в ф-ию, удалять всё-таки не стоило. К тому же маловероятно, что функции хватит десяти байт, чтобы записать все хэндлы (видимо "24" после "10" тоже удалили за иррелевантностью...).
     
  3. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    cdump
    Первый параметр - хэндл процесса. Для текущего это -1(локальный псевдохэндл). Второй параметр это ссылка на массив, в который возвращается список баз загруженных модулей. У вас передаётся ноль. Память в первой странице не выделена, возникает сепшен и возвращается ошибка. Пользовательские коды ошибок малоинформативны, используйте при проблемах системные через вызов RtlGetLastNtStatus(). Необходимо задать массив как например ModuleList DD 128 DUP (?) и загружать его смещение addr MuduleList. Последний параметр это ссылка на переменную принимающую размер возвращённой инфы в буфер, размер которого задаётся в 3-м параметре.
     
  4. cdump

    cdump New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2010
    Сообщения:
    5
    Да, ".data" там действительно должна быть (и есть, удалил случайно при вставке сюда).
    Насчет 10 - в msdn сказано, что нужно сравнить то, что она запишет в 4й параметр (сколько реально прочитала) и если мы запросили меньше, то вызвать ф-цию заново с бОльшим размером.
    p.s. в "реальных условиях" там было аж около 10 кб
     
  5. cdump

    cdump New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2010
    Сообщения:
    5
    CrystalIC
    Спасибо вам за подсказку с addr!
    Замена need на addr need решила проблему с ошибкой. Пошел дальше разбираться..
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    CrystalIC
    Думаю, Ваше альтерэго вряд ли бы с Вами согласилось. :) Там из кучи память выделяется.
    cdump
    А смысл задавать 10 байт, если целый килобайт выделен?
    Интересненько... 10k/4 = 2,5k модулей. Что ж это за процесс такой? О_О Даже для 64-битной тачки (т.е. 1,25k модулей) многовато.
    Читали бы внимательнее, заметили бы "подсказку" про "взятие адреса при передаче need в ф-ию".
     
  7. cdump

    cdump New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2010
    Сообщения:
    5
    Пропустил этот момент, когда "удалял все лишнее", чтобы разобраться конкретно в этом моменте.

    Задал "с запасом", когда еще не знал sizeof(HMODULE) и предположил о проблеме нехватки памяти для записи. Я всегда потом стараюсь подогнать под реальные условия (и 2.5к модулей я бы конечно не оставил..)

    Угу, пропустил :dntknw:
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    l_inc
    Ну да, верно, я забыл про это. Тогда сепшен на последнем параметре. Это смысла не меняет. Более того я против этой функи, её не следует юзать.