我遇到的有关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);
在MASM32中,一个仅包含库和dll,但我不知道NASM是否也是这种情况,我尝试使用RadAasm包含kernel32.lib但出现错误。
未定义的睡眠参考。
我的问题是:一个人如何在不知道GetProcAddress之类的任何函数的确切地址的情况下调用NASM中的Sleep函数。
注意:即使是其他示例,他也提供了功能的绝对地址。
您可以使用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] 删除。
我来说两句