Size: a a a

Ассемблер

2021 May 01

M

Miroslav in Ассемблер
источник

s

s54816 in Ассемблер
Сложно читать текст, и с адресами не очень понятно, но ff 25 xx xx xx xx — это jmp, т.е., скорее всего, это thunk на импорт.

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

ДЦ

Дмитро Цимбалюк... in Ассемблер
с чего бы монтаж
источник

ДЦ

Дмитро Цимбалюк... in Ассемблер
в диспетчере десятки даже дум сделали
источник

M

Miroslav in Ассемблер
Да, вижу в коде jmp на, вроде как вот это ff25 0020 4000. (ImageBase установлен в 0x400000 как и принято)

Получается после прыжка ff25 0020 4000 оказываешься в начале .idata (а тут расположено IAT). Это очень хорошо, но дальше что?) В IAT же не код, а специальным способом закодированная инфа. Нужно как-то понять, что это не кода, а инфа и прочесть ее.

Или как это происходит?

P. S. А как можно удобнее это представлять? Я и сам, если честно, скоро запутаюсь в своих заметках
источник

M

Miroslav in Ассемблер
источник

M

Miroslav in Ассемблер
(вот если не понять, что там не код, то как objdump на скрине написал команды выйдут... )
источник

II

Ira Irina in Ассемблер
Вторые восемь байт тоже можно сказать часть iat. iat - это массив указателей на функции из импортируемой библиотеки. Соответственно вызов такой функции должен выглядеть как косвенный "call ds:[00402000]"
источник

II

Ira Irina in Ассемблер
Но некоторые линкеры оформляют непосредственно рядом с iat косвенный безусловный переход "jp ds:[00402000]" и тогда в основном коде вызов будет прямым "call 00402008". Вот у тебя такой вариант, поэтому следующие за iat восемь байт это эти самые косвенные безусловные переходы.
источник

M

Miroslav in Ассемблер
Получается в .text выполняется команда call 0x402008. По адресу 0x402008 записана команда jmp DWORD PTR ds:[0x402000]. Как она будет исполняться?

Возьмет смещение из 0x402000 (а туда загрузчик должен записать правильное смещение?) и перейдет по ds:<это вот смещение>?
источник

s

s54816 in Ассемблер
Да, по ds:402000 возьмёт адрес, и перейдёт по нему.
источник

II

Ira Irina in Ассемблер
Все правильно. В сыром pe файле 00402000 содержит rva-указатель на строку-имя импортируемой функции. Может содержать и непосредственно ее порядковый номер(ординал) в таблице экспорта соответствующей dll. Но после обработки загрузчиком 00402000 будет содержать актуальный адрес функции. Собственно в этом и заключается обработка импорта загрузчиком - пробежаться по iat, и заменить указатели на имена/ординалы актуальными адресами функций
источник

II

Ira Irina in Ассемблер
Только учитывай,что  вот этот вот jmp может отсутствовать в других pe-файлах. Там будет сразу из .text косвенный вызов call ds:[00402000]
источник

ИГ

Иван Гончаренко... in Ассемблер
Мужики, у меня проблемы. Я хотел запустить на NASM'е код "Hello, world!", но мне выдало ошибку 🥺😔😭 Это ОНА!😭
источник

ИГ

Иван Гончаренко... in Ассемблер
Кто ответит? 😭
источник

s

s54816 in Ассемблер
👍
источник

ИГ

Иван Гончаренко... in Ассемблер
Кому-то нравиться, кому-то нет 😔
источник

s

s54816 in Ассемблер
🙈
источник

s

s54816 in Ассемблер
Если что, этот хелловорлд — для линукса, а вокруг винда.
источник

ИГ

Иван Гончаренко... in Ассемблер
АААаааааааааа... я то думал. Спасибо🥺
источник