代码改变世界

windows.h下几个函数的使用

2008-02-17 16:53  cppguy  阅读(4357)  评论(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;第七个参数是线程返回值。