2014-09-08 4 views
1

Это сообщение о шелкографии Windows, с которым я столкнулся, показывает, как сделать простой шелл-код для функции сна, который находится в kernel32.dll. Я понимаю код, но кажется, что вы не можете вызвать функцию, не зная точного адреса функции в библиотеке, для которой вы должны использовать arwin32.exe, предоставленную автором сообщения.Библиотеки NASM, связывающие библиотеки во время выполнения

;sleep.asm 
[SECTION .text] 

global _start 


_start: 
     xor eax,eax 
     mov ebx, 0x77e61bea ;address of Sleep 
     mov ax, 5000  ;pause for 5000ms 
     push eax 
     call ebx  ;Sleep(ms); 

Shellcoding for Linux and Windows

В MASM32, один просто включает в себя библиотеки и библиотеки DLL, но я не знаю, если это тот же случай в NASM, я попытался включить kernel32.lib с помощью RadAasm, но получил сообщение об ошибке.

Неопределенная ссылка на сон.

Мой вопрос: как вызвать функцию сна в NASM, не зная точного адреса какой-либо из функций, ни GetProcAddress, ни тому подобное.

ПРИМЕЧАНИЕ. Даже в других примерах он предоставляет абсолютные адреса для функций.

+0

Я не знаком с nasm на окнах, но вы попробовали 'nasm -f bin source.asm'? (или win32 для окон) –

ответ

3

Ключевое слово extern.

Например:

section .text 

extern Sleep 

global Start 
Start: 
    push ebp 
    mov ebp, esp 
    push 2000 
    call Sleep 
    mov esp, ebp 
    pop ebp 
    ret 

Вы должны связать скомпилированный объектный файл с kernel32.dll. Вот как это делается с GoLink:

nasm -f win32 sleep.asm -o sleep.obj 
GoLink /files /console sleep.obj kernel32.dll 

Вы можете найти GoLink здесь: www.godevtool.com/Golink.zip

Вы, вероятно, придется использовать GetProcAddress с закодированного адреса, если вам нужно функций из других библиотек без использования EXTERN вообще. kernel32.dll автоматически загружается на тот же адрес для каждого процесса, поэтому Sleep (и другие функции kernel32) должен иметь постоянный адрес. Поэтому вам нужно использовать какой-либо инструмент, чтобы получить адрес требуемой функции, а затем использовать его как жестко закодированное значение (как в примере). Я действительно пробовал это давным-давно, и это сработало, но я подозреваю, что это зависит от версии Windows.

+0

К сожалению, я новичок в asm, поэтому, если его не так много, чтобы спросить, прокомментируйте свой код. :) Я понимаю ту часть, где вы вызываете сон с параметром push 2000, но другие 2 выше, которые являются новыми. – Hawk

+0

и у меня нет GoLink, стоит ли его скачать? – Hawk

+0

Добавлена ​​ссылка на GoLink, чтобы ответить. Строки выше 'push' и ниже' call' - это просто базовые вещи фрейма стека, которые в этом случае не нужны (вы можете больше узнать о фреймах стека и вызовах здесь: [http://www.unixwiz.net/techtips /win32-callconv-asm.html](http://www.unixwiz.net/techtips/win32-callconv-asm.html)) –

Смежные вопросы