首页
社区
课程
招聘
[原创]年末知识分享 Windows 操作系统的安全性
发表于: 2018-2-5 15:43 5557

[原创]年末知识分享 Windows 操作系统的安全性

2018-2-5 15:43
5557

记录下学习进度,为了看这块内容,最好学会如何调试Ring3发起的那一次系统调用;

我这次调试的是nt!NtOpenProcess,这个函数很多线程都会去调用,那么如何固定到特定的Ring3进程的堆栈调用是很有技巧的~

测试代码很简单:
int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(procSnap == INVALID_HANDLE_VALUE)
	{

		printf("CreateToolhelp32Snapshot failed, %d ",GetLastError());
		return 0;
	}

	DWORD dwPid = 0;
	PROCESSENTRY32 procEntry = { 0 };
	procEntry.dwSize = sizeof(PROCESSENTRY32);
	BOOL bRet = Process32First(procSnap,&procEntry);
	while(bRet)
	{
		if (!_wcsicmp(procEntry.szExeFile, L"csrss.exe")) 
		{
			dwPid = procEntry.th32ProcessID;
			__asm int 3;
			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
			if (hProcess)
			{
				printf("open csrss.exe success dwPid:%d\r\n", dwPid);
				CloseHandle(hProcess);
			}
		}
		bRet = Process32Next(procSnap, &procEntry);
	}


	CloseHandle(procSnap);
	getchar();

	return 0;
}

这个int 3是用来让OpenProcess这次调用离第一次下 nt!NtOpenProcess 断点时机很近;保证下一次很大可能性可以拦住这个Ring3的调用堆栈
到断点的时候确认下 当前的eprocess是否为你的Ring3进程

紧接着 bd 这个断点,确保以后其他线程的调用不会被调试器捕获到,否则你会很难受~ 
再来还有一点,如果有循环语句,你企图绕过它,那么不要下断点哦,否则你又会跑到其他线程里去,也会很难受~,这个你就得自己想想办法啦,实在不行单步

本文给大家分享的是内核对象的安全性校验知识,不涉及多么牛逼的技术,希望对新手有所帮助,因为在学习这块内容的时候资料真少,希望大家不要走弯路~

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(procSnap == INVALID_HANDLE_VALUE)
	{

		printf("CreateToolhelp32Snapshot failed, %d ",GetLastError());
		return 0;
	}

	DWORD dwPid = 0;
	PROCESSENTRY32 procEntry = { 0 };
	procEntry.dwSize = sizeof(PROCESSENTRY32);
	BOOL bRet = Process32First(procSnap,&procEntry);
	while(bRet)
	{
		if (!_wcsicmp(procEntry.szExeFile, L"csrss.exe")) 
		{
			dwPid = procEntry.th32ProcessID;
			__asm int 3;
			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
			if (hProcess)
			{
				printf("open csrss.exe success dwPid:%d\r\n", dwPid);
				CloseHandle(hProcess);
			}
		}
		bRet = Process32Next(procSnap, &procEntry);
	}


	CloseHandle(procSnap);
	getchar();

	return 0;
}

这个int 3是用来让OpenProcess这次调用离第一次下 nt!NtOpenProcess 断点时机很近;保证下一次很大可能性可以拦住这个Ring3的调用堆栈

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 2435
活跃值: (725)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
看标题还以为老v又出来爆料了
2018-2-5 15:50
0
雪    币: 5039
活跃值: (2616)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
3
FANTASYING 看标题还以为老v又出来爆料了[em_13]
哈哈,模仿老V标题,吸引关注~~
2018-2-5 15:51
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
windbg不是可以直接调某个进程  源码级调试的吗
2018-2-5 16:48
0
雪    币: 3736
活跃值: (3867)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
666,感谢分享!
2018-3-29 17:25
0
雪    币: 10190
活跃值: (4336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢楼主分享,在楼主这里学到很多
2018-9-18 08:52
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享!
2018-9-24 20:56
0
游客
登录 | 注册 方可回帖
返回
//