Сейчас на форуме: tyns777, cppasm, dutyfree, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как внутри DllMain, определить возврата из загрузки длл в основной код?
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 сентября 2016 18:42 · Поправил: Kuzya69
· Личное сообщение · #1

Пропустил в названии слово "адрес" возврата. Не знаю как исправить на этом форуме.
Пишу длл. Внутри ее DllMain, выполняю необходимую работу. Но по выходу из загрузки этой длл хочу удалить ее из памяти процесса. Т.е. если знать адрес возврата в основной код, то туда можно поместить код удаления этой длл, и загрузки оригинальной. Что я и делаю сейчас, поэтому приходится постоянно искать вручную адрес возврата , и задавать принудительно. Но хочется находить этот адрес автоматически внутри самой, загружаемой длл.
Так вот, можно - ли каким-то образом узнать этот адрес?
Изыскания в стеке с помощью ebp, не подходят. Некоторые протекторы рвут связанную цепочку кадров вызова фукций. Да и нет уверенности, что вложенность ф-ций будет постоянной на разных ОС и программах.



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 26 сентября 2016 02:34 · Поправил: Kuzya69
· Личное сообщение · #2

dosprog пишет:
Иногда другого выхода нет,
тем более, что такие "тупые методы" тоже работают.

difexacaw пишет:
есть апи для получения стека, RtlWalkFrameChain() etc.

А вот еще вопрос (прошу прощения за безграмотность, но поэтому и пишу в разделе для начинающих). А базу стека кто определяет? Вернее от чего зависит смена места в памяти выделенная под стек. Например я начну искать адрес возврата методом связанных кадров (через ebp). И наткнусь на разрушенную связь. Работая-то в отладчике, это сразу видно. А вот как быть коду, который пока не видит "глазами". То-есть, как мне определить, что в этом месте разрыв? Ведь ebp наверное может выйти за границы памяти выделенной под стек, не только по причине разрыва связей из-за протектора. Или внутри одного и того-же файла, стек всегда находится в одном и том-же диапазоне?




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 26 сентября 2016 02:44
· Личное сообщение · #3

Kuzya69

Есть есчо метод фаззинга, это перебор адресов с их проверкой, но это по дефолту вроде отключено. Границы стека описаны в TEB. Система при получении стека вызовов использует карту, в которой отображаются проецированные регионы. Далее обычная защита загрузчик не трогает, по крайней мере я такого не видел. По нормальному если делать, то нужно описать код, через который вызывается загрузчик и далее пролистать стек и найти адрес.

-----
vx




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 26 сентября 2016 02:48 · Поправил: dosprog
· Личное сообщение · #4

какой такой "разрыв"?..

Code:
  1. mov esi,esp
  2. xor  ecx,ecx
  3. @@next:
  4. cld
  5. lodsd
  6. cmp eax,401000h
  7. jb @@next
  8. cmp eax,0fFFffFFh
  9. ja @@next
  10. inc ecx
  11. cmp ecx, 10 ;<----------- например,10
  12. ja  @@error
  13. lodsd
  14. ... сравнить строку [eax]  с именем DLL
  15. ... если не равно - прыг в @@next
  16. cmp ecx,2   ;<------ 2 или другое число, надо определить
  17. jb @@next
  18. sub esi,4 * 2
  19. @@ok: ;---- ESI = искомый адрес возврата из LoadLibrary()
  20. ...
  21. @@error: ;---- ошибка, ничего найти не удалось.
  22. ...




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 26 сентября 2016 02:52 · Поправил: Kuzya69
· Личное сообщение · #5

difexacaw пишет:
По нормальному если делать, то нужно описать код, через который вызывается загрузчик и далее пролистать стек и найти адрес.

Тут немного попонятнее, как для первоклассника, можно написАть?
А то я ничерта не понял, особенно про код, который нужно описАть.
И кстати, как вызывается эта фукция RtlWalkFrameChain(), с какими параметрами? А то чего-то про нее в поисковиках не видно.
dosprog пишет:
cmp ecx,2   ;<------ 2 или другое число, надо определить

А если протектор сметит версию? Или например, помимо того, что он делает копии длл-ок, он еще и избранные апи-шки (тот-же самый LoadLibraryW например) начнет под ВМ протектить?
А разрыв, я имел ввиду, когда идешь по стеку вниз(в Олли), типа ebp, [ebp],[[ebp]], и на каком-то этапе этот ebp начинает смотреть в небо, за пределы стека. Все, цепочка закончилась.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 26 сентября 2016 03:05 · Поправил: dosprog
· Личное сообщение · #6

Kuzya69 пишет:
А если протектор смеНит версию?


тогда - <jmp @@error:>

Kuzya69 пишет:
типа ebp, [ebp],[[ebp]], и на каком-то этапе этот ebp начинает смотреть в небо, за пределы стека. Все, цепочка закончилась.


На это и не надо расчитывать.






Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 26 сентября 2016 03:07
· Личное сообщение · #7

Kuzya69

Тут прототипы имеются.

fd8a_26.09.2016_EXELAB.rU.tgz - stktrace.rar

-----
vx




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 26 сентября 2016 03:11 · Поправил: Kuzya69
· Личное сообщение · #8

dosprog пишет:
На это и не надо расчитывать.

А есть гарантия, что если в WinXP, для программы, пусть одной версии, это число (в вашем коде 2), будет равно например 3, то и в Win10, это число тоже будет 3 ?

dosprog пишет:
тогда - <jmp @@error:>

Вот и я про это. А адрес возврата-то, есть. И его надо искать. Значит по идее надо увеличивать ту двойку до трех, и продолжать. Но с таким подходом нарвемся на разрыв в стеке вызовов.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 26 сентября 2016 03:13 · Поправил: dosprog
· Личное сообщение · #9

Kuzya69 пишет:
А есть гарантия, что если в WinXP, для программы, пусть одной версии, это число (в вашем коде 2), будет равно например 3, то и в Win10, это число тоже будет 3 ?


2 там потому, что LoadLibraryA() это "обёртка" для "LoadLibraryExA()".

Раз начали костылять, то надо тогда проверить на всей линейке.

Впрочем, по-любому, универсальным этот способ не будет.
Задача, полагаю, так и не стоИт.

Kuzya69 пишет:
(в вашем коде 2)


Это не от фонаря, а в стеке при чистом вызове LoadLibrary() у меня в системе.
А уже оттуда 2 попало в код.

Надо проверять, короче.





Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 26 сентября 2016 03:21 · Поправил: Kuzya69
· Личное сообщение · #10

А вот кстати вспомнил, почему я не хотел с ebp-методом связываться. Метод рушился на двух одинаковых ОС WinXPsp3, только в одной была установлена программа Unlocker, а в другой нет. Вот и получалось ваше число на единицу различалось.
И я думаю, это не одна такая программа, которая "вклинивается" в стек, перед загрузкой каких-то модулей-библиотек и прочего.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 26 сентября 2016 03:23
· Личное сообщение · #11

Вполне ожидаемо.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 26 сентября 2016 03:23
· Личное сообщение · #12

Kuzya69 пишет:
типа ebp, [ebp],[[ebp]], и на каком-то этапе этот ebp начинает смотреть в небо, за пределы стека. Все, цепочка закончилась


Kuzya69 пишет:
Вот и получалось ваше число на единицу различалось


так ebp тут никто и не трогает
предоставленный dosprog код по сути просто поднимается по стэку в поисках числа в диапазоне 401000h .. 0fFFffFFh
ecx в этом случае - счётчик найденных подходящих чисел
по идее, внутри вызова "LoadLibrary и так далее" это число встречаться не должно (разве что может остаться после конвертации ANSI в unicode), поэтому и предполагается что найдётся хоть что-то



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 26 сентября 2016 03:28 · Поправил: dosprog
· Личное сообщение · #13

-=AkaBOSS=- пишет:
поэтому и предполагается что найдётся хоть что-то

И вдобавок уточняется строка-аргумент LoadLibrary().
То (выше) вполне работоспособный кусок кода. Дописать только сравнение строк по <rep cmpsb>.





Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 26 сентября 2016 03:36 · Поправил: Kuzya69
· Личное сообщение · #14

-=AkaBOSS=- пишет:
так ebp тут никто и не трогает

Да, действительно, dosprog прошу прощения. Просто разговор был про поиск по кадрам стека, вот я и взглянул бегло на код, даже не разбирал его "по полочкам". Надо было успевать отвечать в топике. Вот я и подумал, что код про это-же.
Щас пригляделся к коду. Смысл понял. Но, то что я писАл про Unlocker, тоже разрушит логику поиска по вашему алгоритму, точно так-же как и в случае поиска по ebp.
PS
Хотя наверное нет, сравнение с диапазоном 401000..0fffffff, не даст посчитать ненужное. Чужие длл-ки , то будут с другими адресами возврата, не с адресами основного ехе. Еще бы быть уверенным, что на других ОС база загрузки ехе, по адресу 400000.
Но действительно, костыль, ничего не гарантирующий.
Хотя наверное нужно подрезать диапазон адресов, не конкретными значениями 401000..0fffffff. А например значениями региона загрузки файла ехе, который можно взять из связанных списков загруженных модулей, в LdrData.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 26 сентября 2016 03:45 · Поправил: dosprog
· Личное сообщение · #15

Kuzya69 пишет:
Но, то что я писАл про Unlocker, тоже разрушит логику поиска по вашему алгоритму, точно так-же как и в случае поиска по ebp.


Надо пробовать, короче.

Kuzya69 пишет:
можно взять ..., в PEB.


Можно.






Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 26 сентября 2016 03:50 · Поправил: difexacaw
· Личное сообщение · #16

Цепочка есть вторая, которая в SEH-фреймах.

-----
vx





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 26 сентября 2016 03:56
· Личное сообщение · #17

Kuzya69 пишет:
Чужие длл-ки , то будут с другими адресами возврата, не с адресами основного ехе.

ну знач надо их базу брать, и определять для новой цели какой-то диапазон

Kuzya69 пишет:
что на других ОС база загрузки ехе, по адресу 400000

в 99.9999% случаях база загрузки ехе по адресу указанному в поле ImageBase хидера

Kuzya69 пишет:
Но действительно, костыль, ничего не гарантирующий.

это с самого начала был костыль, и им он и останется.
главное задачу решить, а универсальное решение на всё случаи жизни напишешь как-нибудь в другой раз



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 26 сентября 2016 04:07 · Поправил: Kuzya69
· Личное сообщение · #18

-=AkaBOSS=- пишет:
а универсальное решение на всё случаи жизни напишешь как-нибудь в другой раз


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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 26 сентября 2016 11:40
· Личное сообщение · #19

Kuzya69

Собрал маленький семпл(не существенные детали опущены, типо выделения тлс, отдельной сборки дллки етц).

90b3_26.09.2016_EXELAB.rU.tgz - StkWalk.rar

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 26 сентября 2016 11:43 · Поправил: reversecode
· Личное сообщение · #20

после этц, клерк опять спалился



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 27 сентября 2016 00:54 · Поправил: Kuzya69
· Личное сообщение · #21

difexacaw пишет:
Собрал маленький семпл...

Ух, штука может и хорошая, но я бы ее с удовольствием на Делфи поглядел. Ладно положу на полочку, можт позж въеду.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 27 сентября 2016 00:58 · Поправил: dosprog
· Личное сообщение · #22

Kuzya69 пишет:
А в Си я


Там ассемблер. Причём по стилю да, что-то очень знакомое


Kuzya69 пишет:
Для какого это компиллятора (МАСМ, ТАСМ ...). В смысле, что из оболочек качать, чтоб проект туда засунуть, и не было ошибок при открытии?

-=AkaBOSS=- дальше написал.
Но критичное там прилинковывается в двоичном виде.





Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 27 сентября 2016 01:05
· Личное сообщение · #23

Для какого это компиллятора (МАСМ, ТАСМ ...). В смысле, что из оболочек качать, чтоб проект туда засунуть, и не было ошибок при открытии?




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 27 сентября 2016 02:55
· Личное сообщение · #24

Kuzya69 пишет:
Для какого это компиллятора (МАСМ, ТАСМ ...)

строки типа
include \masm32\include\ntdll.inc
подсказок не дают?

там ведь есть уже бинарник собранный



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 27 сентября 2016 15:31
· Личное сообщение · #25

-=AkaBOSS=- пишет:
строки...подсказок не дают?

Вроде понял. Но что-то не могу разобраться, как это все в куче загрузить в МАСМ32. Ладно, пока изучаю справку по МАСМ. Я с асмом на уровне отладчика знаком, а высокоуровневые команды, приходится изучать пока.
-=AkaBOSS=- пишет:
там ведь есть уже бинарник собранный

Но бинарник-то мне зачем?. Мне готовое не надо. Я должен суть понять. И если пойму в свой проект на Делфи перепишу.
Вот только я не совсем понял, это что, это проект длл-ки с экспортными функциями типа GpInSnapPointer, xLog, xReturn....? Т.е. код, сам, ничего не делает? Не нашел знакомого слова "start" или "end start" .




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 28 сентября 2016 02:02 · Поправил: difexacaw
· Личное сообщение · #26

Kuzya69

> Но бинарник-то мне зачем?

Потому что по сурцу можите не понять, а вы с отладчиком знакомы ^. А если код не нужен, то и компилить его не надо, и дллка тоже не нужна. Такое только для рипа необходимо, но просто это взять себе не получится, как и вновь скомпилить

-----
vx



<< . 1 . 2 .
 eXeL@B —› Вопросы новичков —› Как внутри DllMain, определить возврата из загрузки длл в основной код?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати