个人笔记,做的不是很好,大家尽管把口水和唾沫喷向我~~
资料老了,但是还是学习吧!!
老鸟飘过~~~
菜鸟~~是我~~*
参考资料来自网络和MSDN部分是自己写的。
从DuplicateHandle函数学习到的知识。
其实我们在使用函数GetCurrentProcess获得的句柄值是虚假的句柄值。如果我们需要在进程之间通信使用这些句柄的话,就需要将其转换。
下边的是MSDN上面的解释:
The pseudo handle need not be closed when it is no longer needed. Calling the CloseHandle function with a pseudo handle has no effect. If the pseudo handle is duplicated by DuplicateHandle, the duplicate handle must be closed.
这个伪句柄在不再使用的时候是不需要关闭的,使用CloseHandle函数来关闭伪句柄是没有作用的。如果伪句柄被DuplicateHandle函数复制,那么复制的句柄就必须被关闭。
所以我们在使用GetCurrentProcess/GetCurrentThread得到的句柄只适合进程或者线程内部使用。
在系统中,对象被分为两类:内核对象和用户对象,如进程对象,线程对象,文件映射对象都是内核对象;而窗口菜单等,都是用户对象。
两者之间的区别:
用于标识用户对象的句柄是系统唯一的,这也就是为什么一个进程可以对另外一个的用户对象句柄进行操作。
内核对象是为了加强内核系统的稳定性,因此,内核对象句柄的进程相关的,在每一个 进程中,都有一个内核对象表,每一个对象的索引(不完全是)作为内核对象的句柄。
由于DuplicateHandle复制的句柄和源句柄的对象指向的是同一个对象,所以,任何对复制句柄的改变都会影响到源句柄和目的句柄。
文件占坑代码:
#include <windows.h>
BOOL OccupyFile( LPCTSTR lpFileName );
int main()
{
OccupyFile("c:\\aaa111.txt");
return 0;
}
void RaiseToDebugP() //提升进程权限
{
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
TOKEN_PRIVILEGES tkp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
}
CloseHandle(hToken);
}
}
BOOL OccupyFile( LPCTSTR lpFileName )
{
BOOL bRet;
RaiseToDebugP();
HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4); //打开system进程
if ( hProcess == NULL )
{
hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);
if ( hProcess == NULL )
return FALSE;
}
HANDLE hFile;
HANDLE hTargetHandle;
hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);//创建文件
if ( hFile == INVALID_HANDLE_VALUE )
{
CloseHandle( hProcess );
return FALSE;
}
bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
CloseHandle( hProcess );
return bRet;
}
相关的测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void main()
{
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,3852);
unsigned long ulHandle = (unsigned long)handle;
HANDLE lhandle = GetCurrentProcess();
HANDLE lhandlethread = GetCurrentThread();
printf("0x%08x\n",ulHandle);
printf("0x%08x\n",(unsigned long)lhandle);
printf("0x%08x\n",(unsigned long)lhandlethread);
}
[课程]Android-CTF解题方法汇总!