windows.h下几个函数的使用
2008-02-17 16:53 cppguy 阅读(4388) 评论(0) 编辑 收藏 举报
有关进程系统权限类
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;第七个参数是线程返回值。
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;第七个参数是线程返回值。