运行期间的NASM链接库

我遇到的有关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);

适用于Linux和Windows的Shellcoding

在MASM32中,一个仅包含库和dll,但我不知道NASM是否也是这种情况,我尝试使用RadAasm包含kernel32.lib但出现错误。

未定义的睡眠参考。

我的问题是:一个人如何在不知道GetProcAddress之类的任何函数的确切地址的情况下调用NASM中的Sleep函数。

注意:即使是其他示例,他也提供了功能的绝对地址。

米卡·拉米(Mika Lammi)

您可以使用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版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章