GetProcAddress под отладкой в вижле 2008

Тема в разделе "WASM.WIN32", создана пользователем multiarc, 18 июл 2009.

  1. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    Собственно вот такое было замечено : addr = GetProcAddress(kernel32,"GetProcAddress");
    в общем возвращаются адреса не принадлежащие kernel32 фактически, т.е. похереная таблица экспорта в памяти конкретного процесса, ну который отлаживается. в другом процессе, в любом другом, не под отладкой в вижле всё ок и возвращаются адреса больше 0x758F0000. А конкретно в том что-то в районе 0x66000000, та недалеко от BaseAddress. Ну и естественно такой адрес уже в другом процессе недействителен, ибо там кернел под тем же 0x758F0000 загружен, а вот функция ну никак не находиться около 0x66000000. Вот собственно и вопрос : как проще чем просмотр таблицы экспорта самого файла kernel32.dll найти нормальный адрес этой функции вот в таком процессе под отладкой в вижле. Все эти танцы с бубном нужны для того, чтобы вызвать GetProcAddress удалённо, т.е. в другом процессе.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ктоже её испортил ?
    Адрес в пределах модуля не может быть меньше его базы.
    Чтожле ?
     
  3. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Может я чего не понял... как-то все оригинально сформулировано :)
    Если тебе нужен адрес какой-либо функции в kernel32 а в памяти экспорт кто-то похерил то открываешь kernel32 через OpenFile(или как больше нравится находишь оригинал), определяешь RVA функции которая тебе требуется и добавляешь к kernel32_base там где нужно(где похерилась таблица экспорта)... Все собссна :)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Wizard109
    Файл не нужно трогать, есть ведь секция в директории \KnownDlls.
    Если в памяти этот модель испорчен, то можно(и следует) использовать LdrGetProcedureAddress(), а в лучшем случае использовать сторонний код для поиска экспорта.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Скорее всего, Visual Studio 2008. =\
     
  6. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Clerk
    Кроме шуток, не понял.
    Насколько я знаю цепочка выглядит так GetProcAddress->LdrGetProcedureAddress->LdrpGetProcedureAddress. В чем смысл работы с LdrGetProcedureAddress ? (посмотрел, там просто переходник для LdrpGetProcedureAddress, последнюю не разбирал. Много кода, а смысла не увидел).
     
  7. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Все, молчу.
    kernel32.dll расковырял :)
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Wizard109
    Не понял вопроса. Что там увидеть хотите ?
    Код для поиска экспорта по имени:
    Код (Text):
    1. {
    2. 0x55, 0x8B, 0xEC, 0x83, 0xC4, 0xF4, 0x53, 0x56, 0x57, 0x55,
    3. 0xE8, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x24, 0xA8, 0x00,
    4. 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x24,
    5. 0x58, 0x01, 0x00, 0x00, 0x64, 0xFF, 0x35, 0x00, 0x00, 0x00,
    6. 0x00, 0x64, 0x89, 0x25, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x5D,
    7. 0x08, 0x8D, 0x45, 0xF8, 0x50, 0x53, 0xE8, 0xC3, 0x00, 0x00,
    8. 0x00, 0x85, 0xC0, 0x8B, 0x55, 0xF8, 0x0F, 0x85, 0x81, 0x00,
    9. 0x00, 0x00, 0x8B, 0x42, 0x78, 0x85, 0xC0, 0x74, 0x7A, 0x03,
    10. 0xC3, 0x89, 0x45, 0xFC, 0x8B, 0x70, 0x20, 0x85, 0xF6, 0x74,
    11. 0x75, 0x8B, 0x40, 0x18, 0x85, 0xC0, 0x74, 0x6E, 0x89, 0x45,
    12. 0xF4, 0x03, 0xF3, 0x33, 0xFF, 0x8B, 0x06, 0x03, 0xC3, 0x50,
    13. 0xFF, 0x75, 0x0C, 0xE8, 0x61, 0x00, 0x00, 0x00, 0x0B, 0xC0,
    14. 0x74, 0x2E, 0x8B, 0x4D, 0xFC, 0x8B, 0x41, 0x24, 0x03, 0xC3,
    15. 0x0F, 0xB7, 0x3C, 0x78, 0x2B, 0x79, 0x10, 0x47, 0x8B, 0x71,
    16. 0x1C, 0x03, 0xF3, 0x8B, 0x04, 0xBE, 0x85, 0xC0, 0x8B, 0x5D,
    17. 0x14, 0x74, 0x30, 0x83, 0x7D, 0x10, 0x01, 0x75, 0x03, 0x03,
    18. 0x45, 0x08, 0x89, 0x03, 0x33, 0xC0, 0xEB, 0x0E, 0x83, 0xC6,
    19. 0x04, 0x47, 0xFF, 0x4D, 0xF4, 0x75, 0xB8, 0xB8, 0x7A, 0x00,
    20. 0x00, 0xC0, 0xF8, 0x64, 0x8F, 0x05, 0x00, 0x00, 0x00, 0x00,
    21. 0x8D, 0x64, 0x24, 0x0C, 0x5F, 0x5E, 0x5B, 0xC9, 0xC2, 0x10,
    22. 0x00, 0xB8, 0x7B, 0x00, 0x00, 0xC0, 0xEB, 0xE6, 0xB8, 0xFF,
    23. 0x00, 0x00, 0xC0, 0xEB, 0xDF, 0x55, 0x8B, 0xEC, 0x56, 0x8B,
    24. 0x4D, 0x08, 0x8B, 0x55, 0x0C, 0x33, 0xF6, 0x8A, 0x04, 0x0E,
    25. 0x3A, 0x04, 0x16, 0x75, 0x0E, 0x46, 0x84, 0xC0, 0x75, 0xF3,
    26. 0x8D, 0x44, 0x0E, 0xFF, 0x2B, 0x45, 0x08, 0xEB, 0x02, 0x33,
    27. 0xC0, 0x5E, 0xC9, 0xC2, 0x08, 0x00, 0x55, 0x8B, 0xEC, 0x55,
    28. 0xE8, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x24, 0x5B, 0x00,
    29. 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x24,
    30. 0x5E, 0x00, 0x00, 0x00, 0x64, 0xFF, 0x35, 0x00, 0x00, 0x00,
    31. 0x00, 0x64, 0x89, 0x25, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x55,
    32. 0x08, 0xB8, 0x7B, 0x00, 0x00, 0xC0, 0x66, 0x81, 0x3A, 0x4D,
    33. 0x5A, 0x75, 0x2A, 0x03, 0x52, 0x3C, 0x81, 0x3A, 0x50, 0x45,
    34. 0x00, 0x00, 0x75, 0x1F, 0x66, 0x81, 0x7A, 0x14, 0xE0, 0x00,
    35. 0x75, 0x17, 0x66, 0x81, 0x7A, 0x04, 0x4C, 0x01, 0x75, 0x0F,
    36. 0x66, 0xF7, 0x42, 0x16, 0x00, 0x01, 0x74, 0x07, 0x8B, 0x4D,
    37. 0x0C, 0x33, 0xC0, 0x89, 0x11, 0xF8, 0x64, 0x8F, 0x05, 0x00,
    38. 0x00, 0x00, 0x00, 0x8D, 0x64, 0x24, 0x0C, 0xC9, 0xC2, 0x08,
    39. 0x00, 0x8B, 0x64, 0x24, 0x08, 0xB8, 0x01, 0x00, 0x00, 0xC0,
    40. 0x8B, 0x6C, 0x24, 0x0C, 0xF9, 0xFF, 0x64, 0x24, 0x08};
    41.  
    42. NTSTATUS
    43. QueryImageEntry(
    44.     IN PVOID ImageBase,
    45.     IN PSTR EntryName,
    46.     IN BOOLEAN RVAOrVA,
    47.     OUT PVOID *Entry
    48.     );
     
  9. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    вижле - Visual Studio 2008, под отладкой она хучит видимо GetProcAddress подменой в таблице экспорта. Вот вопрос в том, как кроме как чтением из файла получить RVA на функцию GetProcAddress. GetProcAddress->LdrGetProcedureAddress->LdrpGetProcedureAddress, ну так дело то не в том, вот енто вот чудо возвращает адрес чутка больший базы, т.е. больше 0x66000000. Без отладки всё ок, т.е. если сбилдить релиз, то получает RVA нормыльный, больше 0x758F0000.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв