![]() |
eXeL@B —› Вопросы новичков —› Как узнать имя WinApi-функции по ее "приблизительному" адресу? |
Посл.ответ | Сообщение |
|
Создано: 03 августа 2006 12:07 · Поправил: Sawamura · Личное сообщение · #1 Прога использует неявный вызов какой-то системной функции таким образом: push регистр
Как можно узнать по адресу, на котором я буду находиться после выполнения этого кода, имя Api-фунцкии (если такое можно)? Причем, я не знаю, оказался я на самом начале этой функции, или уже нет (начало не похоже на стандартные заголовоки). ![]() |
|
Создано: 03 августа 2006 12:19 · Личное сообщение · #2 |
|
Создано: 03 августа 2006 12:31 · Личное сообщение · #3 Veliant Я наверное недостаточно хорошо описал вопрос. 1) Очень желательно дать подсказку для Софт-айса, так как именно его я сейчас осваиваю. 2) насчет "push регистр" - это приблизительно. Там может быть и более хитрое вычисление адреса. К тому же, я не знаю - будет ли прыжок на начало Апи-функции или, к примеру, в середину (или Оля даже такие случаи разбирает?). ![]() |
|
Создано: 03 августа 2006 13:40 · Личное сообщение · #4 Sawamura пишет: Очень желательно дать подсказку для Софт-айса Можно использовать команду: WHAT address ...и если у отладчика есть необходимые символы,то он выведет информацию об этом адресе,к примеру,название функции.И там,если не ошибаюсь,будет всё равно -- начало это или середина функции. ----- the Power of Reversing team ![]() |
|
Создано: 03 августа 2006 13:52 · Личное сообщение · #5 DillerInc Большое спасибо, это именно то, что я искал! Сразу возник небольшой и несколько наивный вопрос по полученному результату. SoftIce мне выдал: user32!GetDC+0072. А зачем прога может ломиться в середину этой функции? При том, что в самом коде проги предыдущие команды этой функции (то есть до адреса 72) не выполняются? Наверное, глупо такое спрашивать, но может тут есть какая стандатрная особенность. Если нет, значит нет, буду думать ![]() ![]() |
|
Создано: 03 августа 2006 18:19 · Личное сообщение · #6 |
|
Создано: 03 августа 2006 18:54 · Личное сообщение · #7 DillerInc А электронной версии этой книги нет? Просто у нас в городе такую литературу тяжко найти. Единственное, что удалось приобрести - "Техника отладки программ без исходных текстов" Криса Касперски. С нее и начал свой путь ![]() ![]() |
|
Создано: 04 августа 2006 03:50 · Личное сообщение · #8 |
|
Создано: 04 августа 2006 09:08 · Личное сообщение · #9 |
|
Создано: 04 августа 2006 10:58 · Личное сообщение · #10 f0ma Да нет, как tundra37 уже верно заметил, вполне можно обратиться и не к началу функции и все будет работать. Вообще, защиту того файла, что я исследовал, я уже успешно разобрал. Касаемо защитного механизма - там все понятно. Неясным остался вопрос все тот же вопрос, зачем проге ломиться в середину функции GetDC ? Меня смутили следующие моменты: 1) Если прога вызывает Апи-функцию не сначала, то где-то в самой проге должно было бы выполниться ее начало, или, во всяком случае, каким-то образом сэмулировать это начало (например, вручную высчитать, что в этом начале функции будет выполняться, и самим внести изменения). Разве не так? Но в коде я не нашел ничего, чтобы указывало на это (может плохо искал). Просто прыжок по адресу такому-то и все. 2) Я не понимаю логики разработчиков ![]() ![]() 3) Зачем вызывать GetWindowTextLength, а затем сразу же GetWindowText? Ведь GetWindowText тоже возвращает количество прочитанных символов? Это какая-то особенность компиляторов или разработчики просто стормозили? Не похоже, чтобы это было сделано для того, чтобы запутать крякеров, ибо дальше это никак не обыгрывается. Если у кого возникнет желание посмотреть сам код, то для этого прикрепляю саму прогу. С защитой я уже разобрался, меня интересует только неявный вызов GetDC (почему так и зачем это надо). Он находится по адресу 4204C3. ![]() ![]() |
|
Создано: 04 августа 2006 13:51 · Личное сообщение · #11 Sawamura пишет: Он находится по адресу 4204C3. По этому адресу RETN 10 стоит(смотрел в олли). Функция GetDC достаточно быстро ( в ВИН2000) вызывает INT 2E и поэтому +72 - это совсем другая функция. Естественно в импорте и в виде текстовой константы GetDC отсутствует. Опять же выскажусь по поводу DillerInc пишет: ...и если у отладчика есть необходимые символы, При наличии неправильных символов это только запутает. По мне лучше EXP USER32.DLL ![]() ![]() |
|
Создано: 04 августа 2006 21:59 · Личное сообщение · #12 tundra37 Елы-палы, я и сказал, что там неявный вызов какой-то системной функции, предположительно GetDC. А как там может быть другая функция? Если отдизассемблировать user32.dll, то видно, что эта вызываемая функция находится между GetDC и еще какой-то. Функции ведь прилегают друг к другу плотно, так? Значит, прога вызывает GetDC, но не сначала. Или я что-то недопонимаю? ![]() |
|
Создано: 05 августа 2006 09:47 · Личное сообщение · #13 Sawamura пишет: Елы-палы, Пардон, я просто коротко написал. Но надеялся, что ты все-таки кусок команд покажешь, а не только адрес. Олли ( у меня сборка shadow) подсвечивает все входы в user32.dll, но проверить твои слова не могу, т.к. по адресу который ты указал стоит retn 10, а прога вылетает, т.к. нет файла registrator.ini Поэтому вопрос : у тебя там(по адресу 4204C3) тоже retn 10 ? Тогда это не вызов середины user32, а наоборот возврат из юзер-функции, обрабатывающей какое-то событие и предыдущая команда в user32 - call. Если у тебя по этому адресу не retn 10, то надо выяснять почему и нужна, либо работающая программа, либо кусок команд, чтобы можно найти их в олли. ![]() |
|
Создано: 05 августа 2006 12:14 · Поправил: Sawamura · Личное сообщение · #14 tundra37 Ух, что-то я запутался в твоем пояснении. Ты имеешь ввиду, что сначало что-то вызывается из user32, потом управление передается в прогу, а потом по ret 10 продолжается выполнение чего-то там в user32? Если не трудно, опиши ситуацию подробнее. Извиняюсь, я и вправду забыл некотоые файлы прикрепить. По --> этой <-- http://www4.rapidupload.com/d.php?file=dl&filepath=19318 ссылке лежат недостающие (349KB). ![]() |
|
Создано: 05 августа 2006 14:23 · Личное сообщение · #15 Sawamura пишет: Ты имеешь ввиду, что сначало что-то вызывается из user32, потом управление передается в прогу, а потом по ret 10 продолжается выполнение чего-то там в user32? Именно так. И это как раз, так называемая, WindProc - процедура, которая события в окне юзера разгребает. Попадают в нее из служебной подпрограммы User32.dll(она не экпортируется), а вызывается эта подпрограмма (смотрю в олли и в wdasm) в TranslateMessageEx, DefWindowProcW и еще в нескольких местах - лень смотреть. Первый вызов, видимо, сообщает что создано окно - сразу после этого окно появляется. ![]() |
|
Создано: 05 августа 2006 15:02 · Поправил: Sawamura · Личное сообщение · #16 |
|
Создано: 06 августа 2006 11:15 · Личное сообщение · #17 Sawamura пишет: То есть, это работает примерно так ? Ну да. Только это был вызов другой функции. Sawamura пишет: возвращаемся в процедуру Ты опять за свое. Система эту процедуру вызывает командой CALL. "Возвращаемся" нельзя говорить. Я эту кухню слабо представляю, поэтому читай литературу. Начни с описания DefWindowProcA. На самом деле основная твоя проблема, что ты мыслишь программу, как линейную. WindowProc - асинхронная часть. Т.е. программа сама по себе и по ходу вызывают WindowProc. Но естественно ничто не мешает обе части связать по данным. Можно и программно, но тогда мы должны это учитывать - это длинная песня. ![]() |
|
Создано: 06 августа 2006 14:16 · Личное сообщение · #18 |
![]() |
eXeL@B —› Вопросы новичков —› Как узнать имя WinApi-функции по ее "приблизительному" адресу? |