![]() |
eXeL@B —› Программирование —› GetProcAddress под отладкой в вижле 2008 |
Посл.ответ | Сообщение |
|
Создано: 18 июля 2009 01:20 · Личное сообщение · #1 Собственно вот такое было замечено : addr = GetProcAddress(kernel32,"GetProcAddress"); в общем возвращаются адреса не принадлежащие kernel32 фактически, т.е. похереная таблица экспорта в памяти конкретного процесса, ну который отлаживается. в другом процессе, в любом другом, не под отладкой в вижле всё ок и возвращаются адреса больше 0x758F0000. А конкретно в том что-то в районе 0x66000000, та недалеко от BaseAddress. Ну и естественно такой адрес уже в другом процессе недействителен, ибо там кернел под тем же 0x758F0000 загружен, а вот функция ну никак не находиться около 0x66000000. Вот собственно и вопрос : как проще чем просмотр таблицы экспорта самого файла kernel32.dll найти нормальный адрес этой функции вот в таком процессе под отладкой в вижле. ![]() |
|
Создано: 18 июля 2009 01:41 · Личное сообщение · #2 |
|
Создано: 18 июля 2009 02:22 · Поправил: multiarc · Личное сообщение · #3 |
|
Создано: 18 июля 2009 08:19 · Личное сообщение · #4 Именно парсить руками. На неё тыкается заглушка из либы ShimEng. А эта либа ввиду ASLR релокабельна, поэтому и адрес в другом процессе другой. Стоит также иметь в виду, что по виртуальному адресу вообще нежелательно с другими процессами играться, на релокабельных либах всё это пахать не будет. Ищи сам базу, парси экспорт, ищи рва и складывай ручками для нужного процесса. ![]() |
|
Создано: 18 июля 2009 08:36 · Поправил: multiarc · Личное сообщение · #5 Адрес отличается от остальных только под отладкой в вижле. т.е. просто это такая пакостная мелочь, которая просто мешает нормально такое отладить, т.е. не под отладкой всё замечательно... ибо kernel грузиться по одному и тому же адресу на все процессы, если он там вообще как бы присутствует в импорте... ntdll аналогично, только независимо от присутсвия её в таблице... на счёт остальных как бы тоже должно всё так быть, но так не всегда... Но в общем случае конечно лучше всего парсить файл вручную... ![]() |
|
Создано: 18 июля 2009 11:04 · Личное сообщение · #6 |
|
Создано: 18 июля 2009 15:42 · Личное сообщение · #7 multiarc пишет: Адрес отличается от остальных только под отладкой в вижле. т.е. просто это такая пакостная мелочь, которая просто мешает нормально такое отладить, т.е. не под отладкой всё замечательно... ибо kernel грузиться по одному и тому же адресу на все процессы С появлением ASLR, не соответствует действительности. Может грузиться на любые адреса. ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 18 июля 2009 22:32 · Поправил: multiarc · Личное сообщение · #8 |
|
Создано: 19 июля 2009 22:51 · Поправил: multiarc · Личное сообщение · #9 Вопрос уже не совсем актуален, ибо использовал удалённый вызов LdrGetProcedureAddress. Но всё таки остаётся открытым). Т.е. что на самом деле происходит до конца не ясно) Что перекрывает таблицу экспорта kernel32. А точнее сказать кто и зачем. Именно в отладочном билде в Visual Studio 2008, т.е. это делает не сама среда, т.к. запуск просто отладочного билда даёт те же результаты, что и запуск под отладкой среды. ![]() |
|
Создано: 20 июля 2009 16:35 · Личное сообщение · #10 А отладочный билд никаких библиотек студийных (или дополнительных) не вызывает? multiarc пишет: Что перекрывает таблицу экспорта kernel32. А точнее сказать кто и зачем. Наверное перекрывает другая библиотека, наверное для каких-то удобств отладки\тестирования бинарника. ----- Я медленно снимаю с неё UPX... *FF_User* ![]() |
|
Создано: 21 июля 2009 00:52 · Личное сообщение · #11 |
![]() |
eXeL@B —› Программирование —› GetProcAddress под отладкой в вижле 2008 |