c语言中 #include文件头除了能限制机器输出时间,还有什么用途?
的有关信息介绍如下:是windows.h吧。这个头文件里有好多函数。你确定你都想知道么。下面就是啦:有关进程系统权限类1:函数OpenProcessToken( HANDLE ProcessHandle,//进程的句柄 DWORD DesiredAccess,//对进程的访问描述 PHANDLE TokenHandle//打开进程令牌的句柄指针); 这个函数的作用是打开进程令牌2: 函数LookupPrivilegeValue( LPCTSTR lpSytemName,//系统名称 LPCTSTR lpName,//特权名称 PLUID lpluid//本地系统唯一的ID号)这个函数将返回一个本地系统内独一无二的ID,来用于系统权限的更改,它的第一个参数是系统名,nil表示本系统。第2个参数是特权的名字。第3个参数用来接收函数返回的ID。3.函数AdjustTokenPrivileges(HANDLE TokenHandle, //更改权限的令牌环句柄BOOL DisableAllPrivileges, //是否修改所有权限的标志位PTOKEN_PRIVILEGES NewState, //新的系统权限信息DWORD BufferLength, //上一个参数的长度PTOKEN_PRIVILEGES PreviousState, // 返回更改系统特权以前的权限PDWORD ReturnLength //上一个参数的长度);这个函数用于更改进程的系统权限 ,第1个参数是要更改权限的令牌环句柄。第2个参数如果为true表示更改所有的系统权限 ,false表示更改部分。第3个参数是要更改的系统特颤绝权的值。第4个参数是第3个参数的大小。第5个参数返回更改系统特权以前的权限,我们不需要就设为nil。第6个参数是第5个参数的大小。 OpenProcess( DWORD dwDesiredAccess,//访问标志 BOOL bInheritHandle,//继承句柄标志 DWORD dwProcessId //进程Id) 这个函数用于修改我们宿主进程的一些属性,这些属性放在第一个参数里面比如说PROCESS_VM_OPEARTION就是允许远程VM操作,即允许VirtualProtectEx和WriteProcessMemory函数操作本进程内存空间。PROCESS_VM_WRITE就是允许远程VM写,即允许WriteProcessMemory函数访问本进程的内存空间。第二个参数是一个标志参数,用来确定返回的句柄是否可以被新的进程继承。我们的程序中设为False。第三个参数需要操作的进程Id,也就是我们的宿主进程的ID。2:函数VirtualAllocEx( HANDLE hProcess,//要进行操作的进程句柄,当然是我们的宿主了 LPVOID lpAddress,//分配空间的开始地址 DWORD dwSize,//分配空间的大小 DWORD flAllocationType,//分配空间的类型 DWOrd flProtect//访问保护类型) 我们使用VirtualAllocEx函数在宿主进程中开辟一块内存空间,用于存放dll的文件名,VirtualAllocEx的第一参数是要操作的进程,第二个是开始地址,第三个是长度,第4,5个是操作参数。其中MEM_COMMIT表示本函数分配的物理内存或者是内存的页面文件,PAGE_READWRITE表示分配的区伏洞嫌域内允许读写 函数WriteProcessMemory( HANDLE hProcess,//所要操作的线程的句柄 LPVOID lpBaseAddress,//开始进行操作的起始地址 LPVOID lpBuffer,//所要写入的Bytes数 LPDWORD lpNuberofBytersWriteen//世纪写入的Bytes数) 前面的函数在宿主内存中创建号空间后,现在往里面写入dll的名称,而我们的WriteProcessMemory函数就可以胜任这一项工作,WriteProcessMemory函数的第一个参数是需要往内存里面写入缺手dd的进程句柄,第二个参数是 “要进行写操作”的目标内存起始地址,第三个参数是 “需要被写入的数据”的地址,第四个参数是准备要写入的长度,第五个参数是实际操作中写的长度,这个参数是被函数输出的。到这里我们就已经能成功把dll的路径名称写进了宿主的内存空间。 GetProcAddress(HMODULE hModule, //dll模块的句柄LPCSTR lpProcName // 函数名称 );我们用这个函数主要想得到kernel32.dll中的函数LoadLibraryW的入口地址,所以GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW')就可以了,当然有些细节得符合程序编译器的要求,VC下使用就要改成GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW")的形式。CreateRemoteThread (HANDLE hProcess, //要进行操作的进程句柄,也就是我们的宿主句柄 LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性的指针 DWORD dwStackSize, //初始化堆(stack)的大小LPTHREAD_START_ROUTINE lpStartAddress,//新建线程函数的指针,或叫做地址LPVOID lpParameter, //新建线程函数的参数 DWORD dwCreationFlags, //标志位LPDWORD lpThreadId //线程返回值);这个函数就是本文的点睛之笔了,我们之前所做所有的一切,都是在为它做准备工作,它的功能就是在其他任何进程中创建新的线程,让其他的程序或进程附加执行我们的代码。CreateRemoteThread函数的第一个参数是要操作的宿主进程句柄;第二个参数为线程安全参数的指针,这里设为nil;第三个参数为初始化堆(stack)的大小,这里设0;第四个参数为新建线程函数的指针或叫做地址或叫入口;第五个参数为新建线程函数的参数,这里就是我们的dll路径名称;第六个参数是标志位,这里设0;第七个参数是线程返回值。