Сейчас на форуме: Rio (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Вопрос - по импорту функций
Посл.ответ Сообщение

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

Создано: 06 августа 2008 16:11
· Личное сообщение · #1

Здравствуйте.
Хочу чётко понять и поэтому хочу спросить знающих, как происходит импорт.
Если я буру например простую прогу, (шаблон для keygen, я её прикрепляю) и открываю её в W32DSM
И пытаюсь понять например как происходит импорт функции GetModuleHandleA из kernel32.dll то я вижу, что сначала делается
Call 0040118C
А внутри функции которая начинается по адресу 0040118C я вижу
Jmp dword prt [00402000] тоесть кудато происходит Jmp, только непойму как он работает.
Почему при Jmpe на 00402000 я оказываюсь в kernel32.dll, если я делаю debugging.

Объясните пожалуйста ктонибудь как это всё работает поподробней, буду очень благодарен .

ae95_06.08.2008_CRACKLAB.rU.tgz - keygen.exe



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 06 августа 2008 16:40
· Личное сообщение · #2

tent пишет:
Почему при Jmpe на 00402000 я оказываюсь в kernel32.dll

Потому что джамп происходит на адрес, который лежит по адресу 00402000. Т.е. адрес 00402000 является указателем на функцию GetModuleHandleA
Об этом красноречиво говорят квадратные скобки. Посмотри свой кейген лучше под отладчиком (OllyDbg). Там все наглядно увидишь.



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

Создано: 07 августа 2008 19:25 · Поправил: tent
· Личное сообщение · #3

А почему сначала происходит вызов функции при помощи CALL в внутри которой происходит jmp на уже саму функцию из kernel32.dll GetModuleHandleA.
В смысле почему не сразу делается call функции GetModuleHandleA? (зачем такие конструкции )




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 августа 2008 19:57
· Личное сообщение · #4

Бывает и сразу Call и Call на Jmp. Второе удобней, когда прыжков много, экономится байт. От компиля зависит это.



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

Создано: 08 августа 2008 09:39
· Личное сообщение · #5

Ок понятно. Я ещё хотелбы узнать.
Когда происходит Call GetModuleHandle например в моём кейгене, допустим
Call 0040118C
и после происходит Jmp
Jmp dword prt [00402000]
То jmp происходит на адрес 00402000 который находится (насколько я понимаю) вне адресного пространства сегмента кода, но при этом я попадаю при jmpе на адрес 7C80B529.
Вот этот момент я неособо понимаю, расскажите пожалуйста как это работает.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

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

В ячейке 00402000 лежит RVA на данные 0000,'GetModuleHandleA',0 При запуске загрзчик вычисляет адрес GetModuleHandleA и вписывает его в ячейку 00402000.

А вообще тебе надо сначала асм поучить а не импорт. Т.к.
tent пишет:
Jmp dword prt [00402000]
То jmp происходит на адрес 00402000


Эта команда не может переходить на адрес 00402000. Она переходит на адрес, который лежит в ячейке 00402000.

-----
Yann Tiersen best and do not fuck




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

Создано: 08 августа 2008 14:10 · Поправил: tent
· Личное сообщение · #7

>При запуске загрзчик вычисляет адрес GetModuleHandleA и вписывает его в ячейку 00402000.
А откуда он эти данные берёт, из таблицы импорта?
И как происходит вычисление этого адреса? (Вроде в разных системах может быть разный адрес этой функции в kernel32.dll)



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

Создано: 08 августа 2008 14:37 · Поправил: Errins
· Личное сообщение · #8

Загрузчик берет эти данные из таблицы экспорта библиотеки, в которой находится функция. Там лежат RVA функций библиотеки, он добавляет к этим значениям ImageBase библиотеки и пишет их в таблицу импорта файла.
Вообще с такими вопросами почитай про формат PE (например, тут http://www.exelab.ru/art/?action=view&id=146), там вся необходимая информация есть.


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


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