常见的加载方式
1.内联汇编加载
使用内联汇编只能加载32位程序的ShellCode,因为64位程序不支持写内联汇编
#pragma comment(linker, "/section:.data,RWE") //将data段的内存设置成可读可写可执行
#include <Windows.h>
//ShellCode部分
unsigned char buf[] = "";
void main() {
__asm {
lea eax,buf // 将buf的地址加载到eax寄存器
call eax // 使用call指令跳转到eax寄存器指向的地址(即buf),开始执行shellcode
}
}2.使用函数指针加载
如下代码所示,(void(*)(void))是一个函数指针类型的强制转换, 该函数指针指向一个没有参数且返回值类型为void的函数,也就是说这行代码将 buf 的地址转换为一个函数指针,然后调用该指针所指向的函数,其实这种方法和上述加载方式原理是一样的,只不过这种方法还能用于加载64位的ShellCode
3.创建线程加载
上述两种方法都需要将data节的内存设置成可读可写可执行, 以下这段代码的主要作用是在内存中分配一段可执行的内存空间,将buf数组中的内容复制到该内存空间,并创建一个新线程来执行这段内存中的代码
下述是申请内存加载的python版本代码:
4.通过堆加载
这段代码首先创建了一个具有执行权限的堆,然后在堆中分配内存并将shellcode复制到内存中。最后,代码通过直接调用存储在内存中的shellcode来执行它
5.基于资源节加载
导入资源
使用MSF生成bin文件,随后点击添加资源->导入,并选择生成的bin文件

然后自定义bin文件的资源类型, 此处我自定义的类型为"shellcode",当然你也可以定义成其它的名字

添加完资源后会在当前项目生成一个resource.h, 代码如下所示,这里只需注意这段代码#define IDR_SHELLCODE1 101
实现代码
以下是完整shellcode加载器代码:
最后更新于