Гайз, я пишу курсач, в ходе которого мне нужно идти по секции кода бинарника и записывать в лог вызываемые функции. Алгоритм таков:
1) идём по коду, видим инструкцию вызова
2) вычисляем адрес перехода, который указывает на инструкцию jmp (0xFF25), которая указывает на адрес в структуре _IMAGE_IMPORT_DESCRIPTOR в таблице импорта
3) читаем из этой структуры имя импортируемой функции
выглядит это так:
вызов функции ExitProcess из секции кода программы
0040100C E8 73000000 CALL <JMP.&kernel32.ExitProcess> ; Jump to KERNEL32.ExitProcess
=> ведёт на промежуточный jmp
00401084 - FF25 08204000 JMP DWORD PTR [<&kernel32.ExitProcess>]
=> который уже прыгает на нужный адрес из таблицы импорта (который заменяется загрузчиком при старте программы)
ExitProce 55 PUSH EBP ; KERNEL32.ExitProcess(ExitCode)
Этих промежуточных инструкций jmp в конце секции кода полным полно - целая таблица, причём это не зависит от компилятора, хоть я пишу на си в VS или CodeBlocks, хоть компилирую masm32.
Зачем она нужна? Есть подробный материал описывающий эту таблицу?
Был бы до жути признателен
1) идём по коду, видим инструкцию вызова
2) вычисляем адрес перехода, который указывает на инструкцию jmp (0xFF25), которая указывает на адрес в структуре _IMAGE_IMPORT_DESCRIPTOR в таблице импорта
3) читаем из этой структуры имя импортируемой функции
выглядит это так:
вызов функции ExitProcess из секции кода программы
0040100C E8 73000000 CALL <JMP.&kernel32.ExitProcess> ; Jump to KERNEL32.ExitProcess
=> ведёт на промежуточный jmp
00401084 - FF25 08204000 JMP DWORD PTR [<&kernel32.ExitProcess>]
=> который уже прыгает на нужный адрес из таблицы импорта (который заменяется загрузчиком при старте программы)
ExitProce 55 PUSH EBP ; KERNEL32.ExitProcess(ExitCode)
Этих промежуточных инструкций jmp в конце секции кода полным полно - целая таблица, причём это не зависит от компилятора, хоть я пишу на си в VS или CodeBlocks, хоть компилирую masm32.
Зачем она нужна? Есть подробный материал описывающий эту таблицу?
Был бы до жути признателен