eXeL@B —› Вопросы новичков —› Как внутри DllMain, определить возврата из загрузки длл в основной код? |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 24 сентября 2016 18:42 · Поправил: Kuzya69 · Личное сообщение · #1 Пропустил в названии слово "адрес" возврата. Не знаю как исправить на этом форуме. Пишу длл. Внутри ее DllMain, выполняю необходимую работу. Но по выходу из загрузки этой длл хочу удалить ее из памяти процесса. Т.е. если знать адрес возврата в основной код, то туда можно поместить код удаления этой длл, и загрузки оригинальной. Что я и делаю сейчас, поэтому приходится постоянно искать вручную адрес возврата , и задавать принудительно. Но хочется находить этот адрес автоматически внутри самой, загружаемой длл. Так вот, можно - ли каким-то образом узнать этот адрес? Изыскания в стеке с помощью ebp, не подходят. Некоторые протекторы рвут связанную цепочку кадров вызова фукций. Да и нет уверенности, что вложенность ф-ций будет постоянной на разных ОС и программах. |
|
Создано: 26 сентября 2016 02:34 · Поправил: Kuzya69 · Личное сообщение · #2 dosprog пишет: Иногда другого выхода нет, тем более, что такие "тупые методы" тоже работают. difexacaw пишет: есть апи для получения стека, RtlWalkFrameChain() etc. А вот еще вопрос (прошу прощения за безграмотность, но поэтому и пишу в разделе для начинающих). А базу стека кто определяет? Вернее от чего зависит смена места в памяти выделенная под стек. Например я начну искать адрес возврата методом связанных кадров (через ebp). И наткнусь на разрушенную связь. Работая-то в отладчике, это сразу видно. А вот как быть коду, который пока не видит "глазами". То-есть, как мне определить, что в этом месте разрыв? Ведь ebp наверное может выйти за границы памяти выделенной под стек, не только по причине разрыва связей из-за протектора. Или внутри одного и того-же файла, стек всегда находится в одном и том-же диапазоне? |
|
Создано: 26 сентября 2016 02:44 · Личное сообщение · #3 Kuzya69 Есть есчо метод фаззинга, это перебор адресов с их проверкой, но это по дефолту вроде отключено. Границы стека описаны в TEB. Система при получении стека вызовов использует карту, в которой отображаются проецированные регионы. Далее обычная защита загрузчик не трогает, по крайней мере я такого не видел. По нормальному если делать, то нужно описать код, через который вызывается загрузчик и далее пролистать стек и найти адрес. ----- vx |
|
Создано: 26 сентября 2016 02:48 · Поправил: dosprog · Личное сообщение · #4 какой такой "разрыв"?.. Code:
|
|
Создано: 26 сентября 2016 02:52 · Поправил: Kuzya69 · Личное сообщение · #5 difexacaw пишет: По нормальному если делать, то нужно описать код, через который вызывается загрузчик и далее пролистать стек и найти адрес. Тут немного попонятнее, как для первоклассника, можно написАть? А то я ничерта не понял, особенно про код, который нужно описАть. И кстати, как вызывается эта фукция RtlWalkFrameChain(), с какими параметрами? А то чего-то про нее в поисковиках не видно. dosprog пишет: cmp ecx,2 ;<------ 2 или другое число, надо определить А если протектор сметит версию? Или например, помимо того, что он делает копии длл-ок, он еще и избранные апи-шки (тот-же самый LoadLibraryW например) начнет под ВМ протектить? А разрыв, я имел ввиду, когда идешь по стеку вниз(в Олли), типа ebp, [ebp],[[ebp]], и на каком-то этапе этот ebp начинает смотреть в небо, за пределы стека. Все, цепочка закончилась. |
|
Создано: 26 сентября 2016 03:05 · Поправил: dosprog · Личное сообщение · #6 |
|
Создано: 26 сентября 2016 03:07 · Личное сообщение · #7 |
|
Создано: 26 сентября 2016 03:11 · Поправил: Kuzya69 · Личное сообщение · #8 dosprog пишет: На это и не надо расчитывать. А есть гарантия, что если в WinXP, для программы, пусть одной версии, это число (в вашем коде 2), будет равно например 3, то и в Win10, это число тоже будет 3 ? dosprog пишет: тогда - <jmp @@error:> Вот и я про это. А адрес возврата-то, есть. И его надо искать. Значит по идее надо увеличивать ту двойку до трех, и продолжать. Но с таким подходом нарвемся на разрыв в стеке вызовов. |
|
Создано: 26 сентября 2016 03:13 · Поправил: dosprog · Личное сообщение · #9 Kuzya69 пишет: А есть гарантия, что если в WinXP, для программы, пусть одной версии, это число (в вашем коде 2), будет равно например 3, то и в Win10, это число тоже будет 3 ? 2 там потому, что LoadLibraryA() это "обёртка" для "LoadLibraryExA()". Раз начали костылять, то надо тогда проверить на всей линейке. Впрочем, по-любому, универсальным этот способ не будет. Задача, полагаю, так и не стоИт. Kuzya69 пишет: (в вашем коде 2) Это не от фонаря, а в стеке при чистом вызове LoadLibrary() у меня в системе. А уже оттуда 2 попало в код. Надо проверять, короче. |
|
Создано: 26 сентября 2016 03:21 · Поправил: Kuzya69 · Личное сообщение · #10 А вот кстати вспомнил, почему я не хотел с ebp-методом связываться. Метод рушился на двух одинаковых ОС WinXPsp3, только в одной была установлена программа Unlocker, а в другой нет. Вот и получалось ваше число на единицу различалось. И я думаю, это не одна такая программа, которая "вклинивается" в стек, перед загрузкой каких-то модулей-библиотек и прочего. |
|
Создано: 26 сентября 2016 03:23 · Личное сообщение · #11 |
|
Создано: 26 сентября 2016 03:23 · Личное сообщение · #12 Kuzya69 пишет: типа ebp, [ebp],[[ebp]], и на каком-то этапе этот ebp начинает смотреть в небо, за пределы стека. Все, цепочка закончилась Kuzya69 пишет: Вот и получалось ваше число на единицу различалось так ebp тут никто и не трогает предоставленный dosprog код по сути просто поднимается по стэку в поисках числа в диапазоне 401000h .. 0fFFffFFh ecx в этом случае - счётчик найденных подходящих чисел по идее, внутри вызова "LoadLibrary и так далее" это число встречаться не должно (разве что может остаться после конвертации ANSI в unicode), поэтому и предполагается что найдётся хоть что-то |
|
Создано: 26 сентября 2016 03:28 · Поправил: dosprog · Личное сообщение · #13 |
|
Создано: 26 сентября 2016 03:36 · Поправил: Kuzya69 · Личное сообщение · #14 -=AkaBOSS=- пишет: так ebp тут никто и не трогает Да, действительно, dosprog прошу прощения. Просто разговор был про поиск по кадрам стека, вот я и взглянул бегло на код, даже не разбирал его "по полочкам". Надо было успевать отвечать в топике. Вот я и подумал, что код про это-же. Щас пригляделся к коду. Смысл понял. Но, то что я писАл про Unlocker, тоже разрушит логику поиска по вашему алгоритму, точно так-же как и в случае поиска по ebp. PS Хотя наверное нет, сравнение с диапазоном 401000..0fffffff, не даст посчитать ненужное. Чужие длл-ки , то будут с другими адресами возврата, не с адресами основного ехе. Еще бы быть уверенным, что на других ОС база загрузки ехе, по адресу 400000. Но действительно, костыль, ничего не гарантирующий. Хотя наверное нужно подрезать диапазон адресов, не конкретными значениями 401000..0fffffff. А например значениями региона загрузки файла ехе, который можно взять из связанных списков загруженных модулей, в LdrData. |
|
Создано: 26 сентября 2016 03:45 · Поправил: dosprog · Личное сообщение · #15 |
|
Создано: 26 сентября 2016 03:50 · Поправил: difexacaw · Личное сообщение · #16 |
|
Создано: 26 сентября 2016 03:56 · Личное сообщение · #17 Kuzya69 пишет: Чужие длл-ки , то будут с другими адресами возврата, не с адресами основного ехе. ну знач надо их базу брать, и определять для новой цели какой-то диапазон Kuzya69 пишет: что на других ОС база загрузки ехе, по адресу 400000 в 99.9999% случаях база загрузки ехе по адресу указанному в поле ImageBase хидера Kuzya69 пишет: Но действительно, костыль, ничего не гарантирующий. это с самого начала был костыль, и им он и останется. главное задачу решить, а универсальное решение на всё случаи жизни напишешь как-нибудь в другой раз |
|
Создано: 26 сентября 2016 04:07 · Поправил: Kuzya69 · Личное сообщение · #18 -=AkaBOSS=- пишет: а универсальное решение на всё случаи жизни напишешь как-нибудь в другой раз Да мне этого раза уже на пол жизни хватило. Я же в основном только одной программой и занимаюсь, только разных версий, для себя. Хотя занятие-то конечно интересное. Это не за столом сидеть и пьяные разговоры слушать. Вот так занятие я себе придумал. Но я рад честно говоря, что есть чем свободное после работы время занять. Ладно, до завтра (вернее до сегодня). Пойду мысли в кучу собирать. Спасибо, ребята, за ликбез. Пойду отдыхать. |
|
Создано: 26 сентября 2016 11:40 · Личное сообщение · #19 Kuzya69 Собрал маленький семпл(не существенные детали опущены, типо выделения тлс, отдельной сборки дллки етц). 90b3_26.09.2016_EXELAB.rU.tgz - StkWalk.rar ----- vx |
|
Создано: 26 сентября 2016 11:43 · Поправил: reversecode · Личное сообщение · #20 |
|
Создано: 27 сентября 2016 00:54 · Поправил: Kuzya69 · Личное сообщение · #21 |
|
Создано: 27 сентября 2016 00:58 · Поправил: dosprog · Личное сообщение · #22 Kuzya69 пишет: А в Си я Там ассемблер. Причём по стилю да, что-то очень знакомое Kuzya69 пишет: Для какого это компиллятора (МАСМ, ТАСМ ...). В смысле, что из оболочек качать, чтоб проект туда засунуть, и не было ошибок при открытии? -=AkaBOSS=- дальше написал. Но критичное там прилинковывается в двоичном виде. |
|
Создано: 27 сентября 2016 01:05 · Личное сообщение · #23 |
|
Создано: 27 сентября 2016 02:55 · Личное сообщение · #24 |
|
Создано: 27 сентября 2016 15:31 · Личное сообщение · #25 -=AkaBOSS=- пишет: строки...подсказок не дают? Вроде понял. Но что-то не могу разобраться, как это все в куче загрузить в МАСМ32. Ладно, пока изучаю справку по МАСМ. Я с асмом на уровне отладчика знаком, а высокоуровневые команды, приходится изучать пока. -=AkaBOSS=- пишет: там ведь есть уже бинарник собранный Но бинарник-то мне зачем?. Мне готовое не надо. Я должен суть понять. И если пойму в свой проект на Делфи перепишу. Вот только я не совсем понял, это что, это проект длл-ки с экспортными функциями типа GpInSnapPointer, xLog, xReturn....? Т.е. код, сам, ничего не делает? Не нашел знакомого слова "start" или "end start" . |
|
Создано: 28 сентября 2016 02:02 · Поправил: difexacaw · Личное сообщение · #26 |
<< . 1 . 2 . |
eXeL@B —› Вопросы новичков —› Как внутри DllMain, определить возврата из загрузки длл в основной код? |