NASM在运行时链接库

时间:2014-09-08 19:28:08

标签: assembly nasm shellcode

我遇到的关于Windows shellcoding的这篇文章展示了如何为位于kernel32.dll中的Sleep函数创建一个简单的shellcode。我理解代码,但似乎你不能在不知道库中函数的确切地址的情况下调用函数,你必须使用arwin32.exe作者提供的函数这篇文章。

;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中是否是相同的情况,我试图使用RadAasm包含kernel32.lib但是出错了。

未定义的睡眠参考。

我的问题是:如果在不知道任何函数的确切地址的情况下如何调用NASM中的Sleep函数,而不知道GetProcAddress等。

注意:即使是其他例子,他也提供了函数的绝对地址。

1 个答案:

答案 0 :(得分: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

如果您需要其他库中的函数而不使用extern,则可能必须使用带有硬编码地址的GetProcAddress。 kernel32.dll会自动加载到每个进程的相同地址,因此Sleep(和其他kernel32函数)应具有常量地址。因此,您必须使用某个工具来获取所需函数的地址,然后将其用作硬编码值(如示例中所示)。我实际上很久以前尝试过它并且它有效,但我怀疑这取决于Windows版本。