Сейчас на форуме: _MBK_, Adler (+6 невидимых)

 eXeL@B —› Вопросы новичков —› IAT в Olly Dbg
Посл.ответ Сообщение


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 29 октября 2011 09:33
· Личное сообщение · #1

Если посмотреть на IAT в Olly Dbg можно увидеть что-то вроде такого:
004013FE .-FF25 84314000 JMP DWORD PTR DS:[<&USER32.KillTimer>] ; USER32.KillTimer
или вот такого:
0040140A $-FF25 8C314000 JMP DWORD PTR DS:[<&USER32.LoadCursorA>] ; USER32.LoadCursorA
Может кто-нибудь обьяснить, что именно означает current location counter ($) в данном случае?
Ведь по-идее мы говорим:
FF25 8C314000 == прыгай на адрес 40318С, там будет адрес USER32.LoadCursorA
Что значат "$-" or "$+" and ".-"? Для чего они в opcode для unconditional jump?
Заранее спасибо!

-----
Give me a HANDLE and I will move the Earth.





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 29 октября 2011 09:40 · Поправил: Nightshade
· Личное сообщение · #2

& -означает адрес
т е &USER32.LoadCursorA - адрес функции LoadCursorA в библиотеке USER32
plutos пишет:
Ведь по-идее мы говорим:FF25 8C314000 == прыгай на адрес 40318С, там будет адрес USER32.LoadCursorA

Нет. Мы говорим прыгает на указатель по адресу 40318С(это иат) в котором содержится "адрес функции LoadCursorA в библиотеке USER32"
$означает что сюда есть прыжки(точнее несколько). Они написаны ниже кода. Можешь нажать правой кнопкой на списке и посмотреть там код.

| Сообщение посчитали полезным: plutos


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 29 октября 2011 10:09 · Поправил: plutos
· Личное сообщение · #3

"$означает что сюда есть прыжки(точнее несколько)."
Понял! Спасибо! Вот это собственно и был мой вопрос.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 29 октября 2011 10:32
· Личное сообщение · #4

Это означает, что есть вызовы этой функции в самой библиотеке, ехе тут ни при чем




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

Создано: 29 октября 2011 10:33 · Поправил: PE_Kill
· Личное сообщение · #5

Что то вы тут собрали всё подряд.

IAT - Import Adress Table
Таблица адресов импортируемых функций.

& - в OllyDbg означает указатель.

FF25 (JMP) - используется для оптимизации размера кода.
Т.е. если везде, где нужно вызвать API генерировать FF15 (CALL), то код будет 6 байт, если сделать один переходник FF25 (JMP) и вызывать его через CALL (E8), то код будет 5 байт.

$- FF25 - означает, что переходник как раз и вызывается напрямую через CALL (E8)

.- FF25 - означает, что адрес переходника где то считывается, например

@L: jmp dword ptr [<&USER32.KillTimer>]

mov eax, offset @L
call eax

PS Поправил, натупил.

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


| Сообщение посчитали полезным: plutos


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 29 октября 2011 11:21 · Поправил: plutos
· Личное сообщение · #6

& -означает адрес

& - в OllyDbg означает указатель

Т.е. "pointer"?

А вообще: большое спасибо за ответы! Понемногу проясняется картина.

-----
Give me a HANDLE and I will move the Earth.





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

Создано: 29 октября 2011 12:34
· Личное сообщение · #7

plutos пишет:
Т.е. "pointer"?

Ну да.

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





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 30 октября 2011 06:18
· Личное сообщение · #8

"если сделать один переходник..."
Уважаемый PE_Kill!
Хочу убедиться, что правильно Вас понял.
Когда Вы говорите про "один переходник", Вы имеете ввиду вот это:

By using the pointer table, the loader does not need to fixup all of the places in the code that want to use the api call, all it has to do is add the pointer to a single place in a table and its work is done.

-----
Give me a HANDLE and I will move the Earth.





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

Создано: 30 октября 2011 08:34
· Личное сообщение · #9

Ну да. Допустим у нас по адресу 401020 лежит адрес функции CreateFileA. Мы пишем программу по работе с файлами и постоянно вызываем эту функцию. Если компилятор будет вызывать ее через указатель 401020, то будет много таких вызовов:

call dword ptr [401020]
call dword ptr [401020]
call dword ptr [401020]
call dword ptr [401020]

т.е. FF15 ADDR, а это каждый раз 6 байт, 2 байта на опкод FF15, и 4 байта на адрес.

Если вместо этого где то в начале или в конце, компилятор сгенерирует jmp dword ptr [401020], то можно уже не вызывать API через адрес 401020, а вызывать именно через этот jmp, например:

401000: jmp dword ptr [401020]

call 401000
call 401000
call 401000
call 401000
call 401000

Т.е. теперь API вызывается с помощью короткого CALL (E8 OFFSET) и занимает 5 байт, 1 байт на опкод E8 и 4 байта на смещение. Ну и как ты сам упоминул при таком подходе используется относительная адресация через смещение, а не через адрес, поэтому загрузчику не нужно исправлять адреса в коде, как при первом варианте, тут ему нужно будет поправить адрес только в инструкции jmp dword ptr [401020]. Т.е. применить fixup если файл загрузился не по своей базе.

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


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


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