Сейчас на форуме: ut2004, vsv1 (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Как узнать имя WinApi-функции по ее "приблизительному" адресу?
Посл.ответ Сообщение

Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 августа 2006 12:07 · Поправил: Sawamura
· Личное сообщение · #1

Прога использует неявный вызов какой-то системной функции таким образом:

push регистр
..строки кода..
add esp, столько-то
ret


Как можно узнать по адресу, на котором я буду находиться после выполнения этого кода, имя Api-фунцкии (если такое можно)? Причем, я не знаю, оказался я на самом начале этой функции, или уже нет (начало не похоже на стандартные заголовоки).



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

Создано: 03 августа 2006 12:19
· Личное сообщение · #2

Поставь бряк на push регистр и Оля сама покажет какая процедура вызывается



Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 августа 2006 12:31
· Личное сообщение · #3

Veliant
Я наверное недостаточно хорошо описал вопрос.
1) Очень желательно дать подсказку для Софт-айса, так как именно его я сейчас осваиваю.
2) насчет "push регистр" - это приблизительно. Там может быть и более хитрое вычисление адреса. К тому же, я не знаю - будет ли прыжок на начало Апи-функции или, к примеру, в середину (или Оля даже такие случаи разбирает?).




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 03 августа 2006 13:40
· Личное сообщение · #4

Sawamura пишет:
Очень желательно дать подсказку для Софт-айса

Можно использовать команду:
WHAT address
...и если у отладчика есть необходимые символы,то он выведет информацию об этом адресе,к примеру,название функции.И там,если не ошибаюсь,будет всё равно -- начало это или середина функции.

-----
the Power of Reversing team




Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 августа 2006 13:52
· Личное сообщение · #5

DillerInc
Большое спасибо, это именно то, что я искал!
Сразу возник небольшой и несколько наивный вопрос по полученному результату. SoftIce мне выдал: user32!GetDC+0072. А зачем прога может ломиться в середину этой функции? При том, что в самом коде проги предыдущие команды этой функции (то есть до адреса 72) не выполняются? Наверное, глупо такое спрашивать, но может тут есть какая стандатрная особенность. Если нет, значит нет, буду думать




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 03 августа 2006 18:19
· Личное сообщение · #6

Sawamura пишет:
А зачем прога может ломиться в середину этой функции?

...а пёс её знает.
В любом случае читай документацию по командам SoftIce.Наример,книга Айрапетяна "Отладчик SoftIce Подробный справочник" от издательства "Солон".

-----
the Power of Reversing team




Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 августа 2006 18:54
· Личное сообщение · #7

DillerInc
А электронной версии этой книги нет? Просто у нас в городе такую литературу тяжко найти. Единственное, что удалось приобрести - "Техника отладки программ без исходных текстов" Криса Касперски. С нее и начал свой путь А вот подробной документации по СофтАйсу с хорошим описанием, увы, не встречал. Правда, на Кряклабе есть перевод документации к SoftIce'у, но только к древней версии и описательных моментов там немного.



Ранг: 17.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 04 августа 2006 03:50
· Личное сообщение · #8

Sawamura пишет:
А зачем прога может ломиться в середину этой функции

а символы от того сервайспака который установлен? если бы я был программистом я бы к середине функции не обращался иначе работать будет только на конкретной оси с конкретным сервайспаком.



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

Создано: 04 августа 2006 09:08
· Личное сообщение · #9

f0ma пишет:
я бы к середине функции не обращался

Опыта у тебя еще маловато. В Виндах каждая функция имеет несколько входов : один легальный - для компиляторов и куча "нелегальных" - для разработчиков. Если покопаться, то можно понять для чего каждый из них предназначен.



Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 августа 2006 10:58
· Личное сообщение · #10

f0ma
Да нет, как tundra37 уже верно заметил, вполне можно обратиться и не к началу функции и все будет работать. Вообще, защиту того файла, что я исследовал, я уже успешно разобрал. Касаемо защитного механизма - там все понятно. Неясным остался вопрос все тот же вопрос, зачем проге ломиться в середину функции GetDC ? Меня смутили следующие моменты:
1) Если прога вызывает Апи-функцию не сначала, то где-то в самой проге должно было бы выполниться ее начало, или, во всяком случае, каким-то образом сэмулировать это начало (например, вручную высчитать, что в этом начале функции будет выполняться, и самим внести изменения). Разве не так? Но в коде я не нашел ничего, чтобы указывало на это (может плохо искал). Просто прыжок по адресу такому-то и все.
2) Я не понимаю логики разработчиков Они в открытом виде вызывают функции GetWindowText и GetWindowTextLength (которое считывают пароль и его длину соответственно), но прячут вызов GetDC Зачем? К тому моменту, как этот GetDC вызывается, защита уже свое отработала и идет просто процедура прорисовки текста "Обломись, пароль неверный". Может этот скрытый вызов GetDC выполняет не защитное, а еще какое-нить назначение? Мне просто стало любопытно.
3) Зачем вызывать GetWindowTextLength, а затем сразу же GetWindowText? Ведь GetWindowText тоже возвращает количество прочитанных символов? Это какая-то особенность компиляторов или разработчики просто стормозили? Не похоже, чтобы это было сделано для того, чтобы запутать крякеров, ибо дальше это никак не обыгрывается.

Если у кого возникнет желание посмотреть сам код, то для этого прикрепляю саму прогу. С защитой я уже разобрался, меня интересует только неявный вызов GetDC (почему так и зачем это надо). Он находится по адресу 4204C3.

5f5b_04.08.2006_CRACKLAB.rU.tgz - registrator.zip



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

Создано: 04 августа 2006 13:51
· Личное сообщение · #11

Sawamura пишет:
Он находится по адресу 4204C3.

По этому адресу RETN 10 стоит(смотрел в олли). Функция GetDC достаточно быстро ( в ВИН2000) вызывает INT 2E и поэтому +72 - это совсем другая функция. Естественно в импорте и в виде текстовой константы GetDC отсутствует.
Опять же выскажусь по поводу DillerInc пишет: ...и если у отладчика есть необходимые символы,
При наличии неправильных символов это только запутает. По мне лучше EXP USER32.DLL



Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 августа 2006 21:59
· Личное сообщение · #12

tundra37
Елы-палы, я и сказал, что там неявный вызов какой-то системной функции, предположительно GetDC. А как там может быть другая функция? Если отдизассемблировать user32.dll, то видно, что эта вызываемая функция находится между GetDC и еще какой-то. Функции ведь прилегают друг к другу плотно, так? Значит, прога вызывает GetDC, но не сначала. Или я что-то недопонимаю?



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

Создано: 05 августа 2006 09:47
· Личное сообщение · #13

Sawamura пишет:
Елы-палы,

Пардон, я просто коротко написал. Но надеялся, что ты все-таки кусок команд покажешь, а не только адрес. Олли ( у меня сборка shadow) подсвечивает все входы в user32.dll, но проверить твои слова не могу, т.к. по адресу который ты указал стоит retn 10, а прога вылетает, т.к. нет файла registrator.ini
Поэтому вопрос : у тебя там(по адресу 4204C3) тоже retn 10 ? Тогда это не вызов середины user32, а наоборот возврат из юзер-функции, обрабатывающей какое-то событие и предыдущая команда в user32 - call. Если у тебя по этому адресу не retn 10, то надо выяснять почему и нужна, либо работающая программа, либо кусок команд, чтобы можно найти их в олли.



Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 августа 2006 12:14 · Поправил: Sawamura
· Личное сообщение · #14

tundra37
Ух, что-то я запутался в твоем пояснении. Ты имеешь ввиду, что сначало что-то вызывается из user32, потом управление передается в прогу, а потом по ret 10 продолжается выполнение чего-то там в user32? Если не трудно, опиши ситуацию подробнее.

Извиняюсь, я и вправду забыл некотоые файлы прикрепить. По --> этой <-- http://www4.rapidupload.com/d.php?file=dl&filepath=19318 ссылке лежат недостающие (349KB).



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

Создано: 05 августа 2006 14:23
· Личное сообщение · #15

Sawamura пишет:
Ты имеешь ввиду, что сначало что-то вызывается из user32, потом управление передается в прогу, а потом по ret 10 продолжается выполнение чего-то там в user32?

Именно так. И это как раз, так называемая, WindProc - процедура, которая события в окне юзера разгребает. Попадают в нее из служебной подпрограммы User32.dll(она не экпортируется), а вызывается эта подпрограмма (смотрю в олли и в wdasm) в TranslateMessageEx, DefWindowProcW и еще в нескольких местах - лень смотреть. Первый вызов, видимо, сообщает что создано окно - сразу после этого окно появляется.



Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 августа 2006 15:02 · Поправил: Sawamura
· Личное сообщение · #16

tundra37
То есть, это работает примерно так ?

call TranslateMessageEx -> поподаем в user32.dll
..что-то там делаем в User32.. -> возвращаемся в процедуру обработки сообщений


Я правильно понимаю?



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

Создано: 06 августа 2006 11:15
· Личное сообщение · #17

Sawamura пишет:
То есть, это работает примерно так ?

Ну да. Только это был вызов другой функции.

Sawamura пишет:
возвращаемся в процедуру

Ты опять за свое. Система эту процедуру вызывает командой CALL. "Возвращаемся" нельзя говорить.
Я эту кухню слабо представляю, поэтому читай литературу. Начни с описания DefWindowProcA.
На самом деле основная твоя проблема, что ты мыслишь программу, как линейную. WindowProc - асинхронная часть. Т.е. программа сама по себе и по ходу вызывают WindowProc. Но естественно ничто не мешает обе части связать по данным. Можно и программно, но тогда мы должны это учитывать - это длинная песня.



Ранг: 3.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 августа 2006 14:16
· Личное сообщение · #18

tundra37
Спасибо за комментарии.


 eXeL@B —› Вопросы новичков —› Как узнать имя WinApi-функции по ее "приблизительному" адресу?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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