写windows的shellcode在很长时间是一件秘密的事。问题是,它不像Unix的shellcode, 你没有已知的系统调用API。而是,进程要加载函数指针到外部函数,比如CreateProcess或者ReadFile到内存的不同地方。
但是你不知道在内存的哪里发生。早期的shellcode只是假设它们在一个确定的地方或者猜测它们在一些地方。但是这意味着每次你创建一个利用时,你都要根据不同的windows安装包或者可执行文件来修改。
编写可信和可重用的shellcode的技巧是Windows储存了一个指针指向了进程的环境块,在一个已知的位置,FS:[0X30]。加上0Xc是load order模块指针。
现在,你有了一个可链接的模块,可以查看kernel32.dll。从那里,你可以找到LoadLibrary和GetProcAddress函数,它们会允许你加载任何需要的dll和找到任何需要的函数的地址。
这样的技术导致了大的shellcode,因为它的复杂性。那就是说,在最近这些年,技术在发展为使shellcode更小。