首页
社区
课程
招聘
[原创]Win 7下过盛*大,H*S驱动保护
发表于: 2013-7-20 23:06 22709

[原创]Win 7下过盛*大,H*S驱动保护

2013-7-20 23:06
22709

时间:2013年7月20日星期六
作者:绿林科技
QQ:1473656864

        大家调试的时候都可以知道,盛*大游戏(泡泡堂)的外壳是Themida,可以用OD创建进程,但不能附加游戏,本来想只用一个驱动文件来过保护的,但在Win 7的HOOK里判断进程名,会出问题,导致系统奔溃,而这在Win XP却不会,个人比较郁闷!

        所以用了另一个办法来判断指定进程,就是进程的PID,这个比较唯一。Ring 3创建进程,并挂起进程,然后安装驱动,向驱动传递游戏的进程PID,然后驱动就执行HOOK,通过进程PID来判断是否要跳转。

        功能,可以用CE打开进程,读取,修改进程,用CE的调试器附加进程。

        最后说明下,这个必须在Win 7下,且你的SSDT表是干净的,没有腾讯的QQProtect.sys这个驱动文件在执行,SSDT没有被HOOK。可以用安全工具把QQProtect.sys由系统引导启动设置成手动启动。

下面贴上代码:

Ring 3层的MFC程序:
安装驱动的函数:

void CDriverProtectDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	InstallCWinThread = AfxBeginThread(InstallDriverThread,this);
}
BOOL CDriverProtectDlg::LoadNTDriver(wchar_t* lpszDriverName, wchar_t* lpszDriverPath)
{
	wchar_t szDriverImagePath[256];
	::GetFullPathNameW(strPath,256,szDriverImagePath,NULL);
	BOOL bRet = FALSE;
	SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
	SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
	hServiceMgr = ::OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if( hServiceMgr == NULL )
	{
		m_DriverINFORMATION.SetWindowTextW(L"打开服务失败!");
		bRet = FALSE;
		goto BeforeLeave;
	}
	else
	{
		////OpenSCManager成功
		m_DriverINFORMATION.SetWindowTextW(L"OpenSCManager成功!");
	}
	//创建驱动所对应的服务
	hServiceDDK = CreateServiceW(hServiceMgr,lpszDriverName,lpszDriverName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,szDriverImagePath,NULL,NULL,NULL,NULL,NULL);
	DWORD dwRtn;
	//判断服务是否失败
	if (hServiceDDK == NULL)
	{
		dwRtn = GetLastError();
		if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS)
		{
			//由于其他原因创建服务失败
			strError.Format(L"%d",dwRtn);
			m_DriverINFORMATION.SetWindowTextW(L"由于其他原因创建服务失败!" + strError);
			bRet = FALSE;
			goto BeforeLeave;
		}
		else
		{
			m_DriverINFORMATION.SetWindowTextW(L"服务创建失败,是由于服务已经创立过!");
		}
		// 驱动程序已经加载,只需要打开  
		hServiceDDK=::OpenServiceW(hServiceMgr,lpszDriverName, SERVICE_ALL_ACCESS);
		if( hServiceDDK == NULL )  
		{
			//如果打开服务也失败,则意味错误
			dwRtn = GetLastError();  
			strError.Format(L"%d",dwRtn);
			m_DriverINFORMATION.SetWindowTextW(L"如果打开服务也失败,则意味错误!" + strError);
			bRet = FALSE;
			goto BeforeLeave;
		}
		else
		{
			m_DriverINFORMATION.SetWindowTextW(L"打开服务成功!");
		}
	}
	else  
	{
		m_DriverINFORMATION.SetWindowTextW(L"创建服务成功!");
	}
	bRet= ::StartServiceW( hServiceDDK, NULL, NULL );  
	if( !bRet ) 
	{
		DWORD dwRtn = GetLastError();
		if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )  
		{  
			strError.Format(L"%d",dwRtn);
			m_DriverINFORMATION.SetWindowTextW(L"开启此项服务失败!");
			bRet = FALSE;
			goto BeforeLeave;
		}  
		else
		{
			if( dwRtn == ERROR_IO_PENDING )  
			{  
				//设备被挂住
				m_DriverINFORMATION.SetWindowTextW(L"设备被挂住!");
				bRet = FALSE;
				goto BeforeLeave;
			} 
			else  
			{  
				//服务已经开启
				m_DriverINFORMATION.SetWindowTextW(L"打开服务失败,因为服务已经开启!");
				bRet = TRUE;
				goto BeforeLeave;
			}  
		}
	}
	bRet = TRUE;
BeforeLeave:
	//离开前关闭打开的句柄
	if(hServiceDDK)
	{
		CloseServiceHandle(hServiceDDK);
	}
	if(hServiceMgr)
	{
		CloseServiceHandle(hServiceMgr);
	}
	return bRet;
}

// 安装驱动的线程函数
UINT __cdecl CDriverProtectDlg::InstallDriverThread(LPVOID pParam)
{
	CDriverProtectDlg* pDlg = NULL;
	pDlg = (CDriverProtectDlg*)pParam;
	pDlg->UpdateData(TRUE);
	if (pDlg->strPath.IsEmpty())
	{
		AfxMessageBox(L"请选择驱动路径!");
		return 0;
	}
	if (pDlg->strrGamePath.IsEmpty())
	{
		AfxMessageBox(L"请选择游戏路径!");
		return 0;
	}
	if (!pDlg->LoadNTDriver(L"HelloDDK",pDlg->strPath.GetBuffer()))
	{
		pDlg->UnloadNTDriver(L"HelloDDK");
		pDlg->LoadNTDriver(L"HelloDDK",pDlg->strPath.GetBuffer());
	}
	HANDLE hDevice = 
		::CreateFileW(L"\\\\.\\HelloDDK",
		GENERIC_READ | GENERIC_WRITE,
		0,		// share mode none
		NULL,	// no security
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL );		// no template
	if (hDevice == INVALID_HANDLE_VALUE)
	{
		pDlg->m_DriverINFORMATION.SetWindowTextW(L"打开驱动错误!");
		return 1;
	}
	DWORD Pid = pDlg->TransferProcessID(pDlg->strrGamePath.GetBuffer());
	int a = (int)Pid;
	UCHAR* InputBuffer = new UCHAR[a];
	UCHAR* OutputBuffer= new UCHAR[a];
	BOOL bRet;
	DWORD dwOutput;
	//输入缓冲区作为输入,输出缓冲区作为输出
	bRet = DeviceIoControl(hDevice, IOCTL_TEST1, InputBuffer, a, OutputBuffer, a, &dwOutput, NULL);
	if (bRet)
	{
		pDlg->m_DriverINFORMATION.SetWindowTextW(L"开启保护成功!");
	}
	CloseHandle(hDevice);
	delete []InputBuffer;
	delete []OutputBuffer;
	//AfxEndThread(0);
	ResumeThread(pDlg->ProcessMainThread);
	pDlg = NULL;
	return 0;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (18)
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Win  7的KiAttachProcess内核函数:

nt!KiAttachProcess:
81875b9c 8bff            mov     edi,edi
81875b9e 55              push    ebp
81875b9f 8bec            mov     ebp,esp
81875ba1 53              push    ebx
81875ba2 8b5d08          mov     ebx,dword ptr [ebp+8]
81875ba5 56              push    esi
81875ba6 8bf0            mov     esi,eax
81875ba8 8b4510          mov     eax,dword ptr [ebp+10h]
81875bab 57              push    edi
81875bac 8d7e40          lea     edi,[esi+40h]
81875baf 57              push    edi
81875bb0 e84d020000      call    nt!KiMoveApcState (81875e02)
81875bb5 8b4d10          mov     ecx,dword ptr [ebp+10h]
81875bb8 897f04          mov     dword ptr [edi+4],edi
81875bbb 893f            mov     dword ptr [edi],edi
81875bbd 8d4648          lea     eax,[esi+48h]
81875bc0 894004          mov     dword ptr [eax+4],eax
81875bc3 8900            mov     dword ptr [eax],eax
81875bc5 8d8670010000    lea     eax,[esi+170h]
81875bcb c6465400        mov     byte ptr [esi+54h],0
81875bcf c6465500        mov     byte ptr [esi+55h],0
81875bd3 c6465600        mov     byte ptr [esi+56h],0
81875bd7 3bc8            cmp     ecx,eax
81875bd9 7513            jne     nt!KiAttachProcess+0x52 (81875bee)
81875bdb 898668010000    mov     dword ptr [esi+168h],eax
81875be1 89be6c010000    mov     dword ptr [esi+16Ch],edi
81875be7 c6863401000001  mov     byte ptr [esi+134h],1
81875bee 6a08            push    8
81875bf0 58              pop     eax
81875bf1 8d5374          lea     edx,[ebx+74h]
81875bf4 f00fc102        lock xadd dword ptr [edx],eax
81875bf8 894508          mov     dword ptr [ebp+8],eax
81875bfb 8b4508          mov     eax,dword ptr [ebp+8]
81875bfe a807            test    al,7
81875c00 7510            jne     nt!KiAttachProcess+0x76 (81875c12)
81875c02 895e50          mov     dword ptr [esi+50h],ebx
81875c05 33c0            xor     eax,eax
81875c07 83c660          add     esi,60h
81875c0a f02106          lock and dword ptr [esi],eax
81875c0d ff7110          push    dword ptr [ecx+10h]
81875c10 eb55            jmp     nt!KiAttachProcess+0xcb (81875c67)
81875c12 8d7e60          lea     edi,[esi+60h]
81875c15 33c0            xor     eax,eax
81875c17 8bcf            mov     ecx,edi
81875c19 f02101          lock and dword ptr [ecx],eax
81875c1c 8bc3            mov     eax,ebx
81875c1e e84f4f0500      call    nt!KiInSwapSingleProcess (818cab72)
81875c23 83650800        and     dword ptr [ebp+8],0
81875c27 eb27            jmp     nt!KiAttachProcess+0xb4 (81875c50)
81875c29 ff4508          inc     dword ptr [ebp+8]
81875c2c 8b4508          mov     eax,dword ptr [ebp+8]
81875c2f 8505342b9781    test    dword ptr [nt!HvlLongSpinCountMask (81972b34)],eax
81875c35 7511            jne     nt!KiAttachProcess+0xac (81875c48)
81875c37 f6052c2b978140  test    byte ptr [nt!HvlEnlightenments (81972b2c)],40h
81875c3e 7408            je      nt!KiAttachProcess+0xac (81875c48)
81875c40 50              push    eax
81875c41 e865840600      call    nt!HvlNotifyLongSpinWait (818de0ab)
81875c46 eb02            jmp     nt!KiAttachProcess+0xae (81875c4a)
81875c48 f390            pause
81875c4a 8b07            mov     eax,dword ptr [edi]
81875c4c 85c0            test    eax,eax
81875c4e 75d9            jne     nt!KiAttachProcess+0x8d (81875c29)
81875c50 33c0            xor     eax,eax
81875c52 8bcf            mov     ecx,edi
81875c54 40              inc     eax
81875c55 8701            xchg    eax,dword ptr [ecx]
81875c57 85c0            test    eax,eax
81875c59 75ce            jne     nt!KiAttachProcess+0x8d (81875c29)
81875c5b 895e50          mov     dword ptr [esi+50h],ebx
81875c5e f02107          lock and dword ptr [edi],eax
81875c61 8b4510          mov     eax,dword ptr [ebp+10h]
81875c64 ff7010          push    dword ptr [eax+10h]
81875c67 53              push    ebx
81875c68 e89728ffff      call    nt!KiSwapProcess (81868504)
81875c6d 8a4d0c          mov     cl,byte ptr [ebp+0Ch]
81875c70 ff1558418181    call    dword ptr [nt!_imp_KfLowerIrql (81814158)]
81875c76 5f              pop     edi
81875c77 5e              pop     esi
81875c78 5b              pop     ebx
81875c79 5d              pop     ebp
81875c7a c20c00          ret     0Ch
81875c7d 90              nop
81875c7e 90              nop
81875c7f 90              nop
81875c80 90              nop
81875c81 90              nop
2013-7-20 23:23
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
日游戏的人果然精神...其实还有别的RING3办法!
2013-7-20 23:35
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
赶紧备一份,防止被和谐,我和我的小伙伴们一起顶楼主
2013-7-21 00:11
0
雪    币: 615
活跃值: (590)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
敢公布,能公布,愿意公布的人不多呀,顶顶顶,有方法,不公布,你就提也不要提了,
2013-7-21 08:05
0
雪    币: 63
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
搂主标题可以加个 Win7 x86吗
2013-7-21 09:06
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个可以保留
2013-7-21 09:43
0
雪    币: 390
活跃值: (768)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
Mark......
2013-7-21 10:57
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持。。。。共享精神很难得。。。。。。。。。。
2013-7-22 09:45
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
Win7 判斷進程會崩潰是因為PEB偏移不同吧?!
個人是直接使用PsGetProcessImageFileName
您可以參考看看
2013-7-29 23:41
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2 楼的 什么 ring3 办法?既然要保留,何必说出来
2013-7-30 10:17
0
雪    币: 43
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
马克顺便打酱油
2013-7-30 10:27
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
支持!…………
2013-7-30 13:28
0
雪    币: 140
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看到都头疼~~~~
2013-8-1 13:12
0
雪    币: 238
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
求解要是64位什么办法好呢
2013-8-1 23:37
0
雪    币: 211
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
自己实现ring3层的系统函数,然后DeviceIoControl进入ring0,再跳到系统驱动执行。
2013-8-5 15:33
0
雪    币: 2882
活跃值: (1279)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjd
17
我看成绿盟科技了-_-!!
2013-8-5 15:47
0
雪    币: 882
活跃值: (350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark!!
2013-10-19 11:51
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
剥离方法,自己写一个导出ehsvc函数序号的dll,并且每个函数均返回正确的返回值。
而且这个自己写的ehsvcdll必须作为一个自加载dl,而且必须在ehsvc加载之前加载。并且,启动时通过IAT/EAT hook loadlibrary 向程序返回自身的dll句柄。接下来游戏程序通过你的dll句柄查找函数,得到的返回值均是直接返回的正确结果,当遇到HS心跳函数时,直接转发到一个自己写的程序当中,自己的程序相当于一个中介,这个中介主动加载ehsvc.dll,并调用其中的算法,将计算结果返回给游戏,游戏再发送心跳包。

以上是剥离的基本流程。
2013-10-21 12:39
0
游客
登录 | 注册 方可回帖
返回
//