过QQ游戏大厅的SX保护

早些时间看郁金香的教程,写过qq游戏练练看的挂,那时候CE附加QQ游戏大厅的时候貌似是没有任何保护的,昨天舍友让做个斗地主的记牌器,但是,我用CE附加的时候,被检测到了,其实不附加也会被检测,所以猜测可能只是检测窗口进程或是模块名称啥的吧,被检测到的时候主程序会退出,但是那个对话框还在,就是那个SX什么什么的,所以如果是QQgame启动了某个线程来检测非法的话,在主程序退出其他线程对象都释放掉的时候,那个检测的线程对象还是存在的(提示SX非法的对话框别关掉!)。借助pt很容易就找到了这个线程。

未开CE前线程状态:


开了CE被检测到后的线程状态:


然后该怎么办就不用说了吧,干掉这个线程就OK了。

若是嫌麻烦每次都要开pt找线程的话,可以写个结束这个模块内线程的程序

  1. #include "stdafx.h"   
  2. #include "windows.h"   
  3. #include "TlHelp32.h"   
  4. const TCHAR QQ_GAME[] = _T("QQGame.exe");  
  5. const TCHAR QQ_THREAD_DLL[] = _T("TenSLX.dll");  
  6.   
  7.   
  8. typedef   enum   _THREADINFOCLASS   {   
  9.     ThreadBasicInformation,   
  10.     ThreadTimes,   
  11.     ThreadPriority,   
  12.     ThreadBasePriority,   
  13.     ThreadAffinityMask,   
  14.     ThreadImpersonationToken,   
  15.     ThreadDescriptorTableEntry,   
  16.     ThreadEnableAlignmentFaultFixup,   
  17.     ThreadEventPair_Reusable,   
  18.     ThreadQuerySetWin32StartAddress,   
  19.     ThreadZeroTlsCell,   
  20.     ThreadPerformanceCount,   
  21.     ThreadAmILastThread,   
  22.     ThreadIdealProcessor,   
  23.     ThreadPriorityBoost,   
  24.     ThreadSetTlsArrayAddress,   
  25.     ThreadIsIoPending,   
  26.     ThreadHideFromDebugger,   
  27.     ThreadBreakOnTermination,   
  28.     MaxThreadInfoClass   
  29. }   THREADINFOCLASS;  
  30.   
  31. typedef LONG (__stdcall *_pfnZwQueryInformationThread) (  
  32.     IN   HANDLE   ThreadHandle,   
  33.     IN   THREADINFOCLASS   ThreadInformationClass,   
  34.     OUT   PVOID   ThreadInformation,   
  35.     IN   ULONG   ThreadInformationLength,   
  36.     OUT   PULONG   ReturnLength   OPTIONAL   
  37.     );  
  38.   
  39. HANDLE m_GameProcessHandle;  
  40. //记录QQ_THREAD_DLL信息   
  41. BYTE  * m_pmodBaseAddr;   
  42. DWORD   m_dwmodBaseSize;  
  43. _pfnZwQueryInformationThread m_pfnZwQueryInformationThread;  
  44.   
  45. BOOL StartPatch();//PATCHQQ主函数   
  46. DWORD EnablePrivilege (LPCTSTR name);//提权函数   
  47. BOOL ListProcessModules(DWORD dwPID);//枚举指定进程的模块   
  48. BOOL ListProcessThreads( DWORD dwOwnerPID);//枚举指定进程创建的线程,并结束掉QQ保护线程   
  49. PVOID ShowThreadInfo(DWORD tid);//获取线程的起始地址   
  50.   
  51. int _tmain(int argc, _TCHAR* argv[])  
  52. {  
  53.     m_pfnZwQueryInformationThread =(_pfnZwQueryInformationThread)\  
  54.         GetProcAddress   (LoadLibrary(_T("ntdll.dll")),"ZwQueryInformationThread");  
  55.   
  56.     if (StartPatch())  
  57.     {  
  58.         printf("可以CE附加QQ游戏大厅了\n");  
  59.     }  
  60.     else  
  61.         printf("失败!\n");  
  62.     return 0;  
  63. }  
  64.   
  65. BOOL StartPatch()  
  66. {  
  67.     if(0!=EnablePrivilege (SE_DEBUG_NAME))    
  68.     {  
  69.         return FALSE;    
  70.     }  
  71.     HANDLE hProcessSnap;  
  72.     PROCESSENTRY32 pe32;  
  73.   
  74.     hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );  
  75.     if( hProcessSnap == INVALID_HANDLE_VALUE )  
  76.     {  
  77.         return FALSE;  
  78.     }  
  79.   
  80.     pe32.dwSize = sizeof( PROCESSENTRY32 );  
  81.   
  82.     if( !Process32First( hProcessSnap, &pe32 ) )  
  83.     {  
  84.         CloseHandle( hProcessSnap );  
  85.         return FALSE;  
  86.     }  
  87.   
  88.     BOOL bStartGame = FALSE;  
  89.     do  
  90.     {  
  91.         if (_tcscmp(pe32.szExeFile, QQ_GAME) == 0)  
  92.         {  
  93.             bStartGame = TRUE;  
  94.             m_GameProcessHandle = OpenProcess(PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION,\  
  95.                 FALSE, pe32.th32ProcessID);  
  96.             if (m_GameProcessHandle == NULL)  
  97.             {  
  98.                 return FALSE;  
  99.             }  
  100.             for (int i=0; i<5;i++)  
  101.             {  
  102.                 if (!ListProcessModules(pe32.th32ProcessID))  
  103.                 {  
  104.                     return FALSE;  
  105.                 }  
  106.   
  107.             }  
  108.             if (!ListProcessThreads(pe32.th32ProcessID))  
  109.             {  
  110.                 return FALSE;  
  111.             }  
  112.         }  
  113.   
  114.     } while( Process32Next( hProcessSnap, &pe32 ) );  
  115.   
  116.     if (!bStartGame)  
  117.     {  
  118.         MessageBox(NULL,_T("运行QQ大厅后才能使用"),_T("提示"),MB_OK);  
  119.         return FALSE;  
  120.     }  
  121.     CloseHandle( hProcessSnap );  
  122.     return TRUE;  
  123. }  
  124. DWORD EnablePrivilege (LPCTSTR name)    
  125. {    
  126.     HANDLE hToken;    
  127.     BOOL rv;    
  128.     //设置结构      
  129.     TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };    
  130.     // 查找权限值      
  131.     LookupPrivilegeValue (    
  132.         0,    
  133.         name,    
  134.         &priv.Privileges[0].Luid    
  135.         );    
  136.     // 打开本进程Token      
  137.     OpenProcessToken(    
  138.         GetCurrentProcess (),    
  139.         TOKEN_ADJUST_PRIVILEGES,    
  140.         &hToken    
  141.         );    
  142.     // 提权      
  143.     AdjustTokenPrivileges (    
  144.         hToken,    
  145.         FALSE,    
  146.         &priv,    
  147.         sizeof priv,    
  148.         0,    
  149.         0    
  150.         );    
  151.     // 返回值,错误信息,如果操作成功,则应为ERROR_SUCCESS,为O      
  152.     rv = GetLastError();    
  153.     // 关闭Token      
  154.     CloseHandle (hToken);    
  155.     return rv;    
  156. }    
  157. BOOL ListProcessModules(DWORD dwPID)  
  158. {  
  159.     HANDLE hModuleSnap = INVALID_HANDLE_VALUE;  
  160.     MODULEENTRY32 me32;  
  161.   
  162.     hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );  
  163.     if( hModuleSnap == INVALID_HANDLE_VALUE )  
  164.     {  
  165.         return( FALSE );  
  166.     }  
  167.   
  168.     me32.dwSize = sizeof( MODULEENTRY32 );  
  169.     if( !Module32First( hModuleSnap, &me32 ) )  
  170.     {  
  171.         CloseHandle( hModuleSnap );  
  172.         return( FALSE );  
  173.     }  
  174.     do  
  175.     {  
  176.         if (_tcscmp(me32.szModule, QQ_THREAD_DLL) == 0)  
  177.         {  
  178.             m_pmodBaseAddr = me32.modBaseAddr;  
  179.             m_dwmodBaseSize = me32.modBaseSize;  
  180.   
  181.         }  
  182.   
  183.     }while( Module32Next( hModuleSnap, &me32 ));  
  184.   
  185.     CloseHandle( hModuleSnap );  
  186.     return( TRUE );  
  187.   
  188. }  
  189. BOOL ListProcessThreads( DWORD dwOwnerPID)   
  190. {   
  191.     HANDLE hThreadSnap = INVALID_HANDLE_VALUE;   
  192.     THREADENTRY32 te32;   
  193.     PVOID addr;  
  194.   
  195.     hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );   
  196.     if( hThreadSnap == INVALID_HANDLE_VALUE )   
  197.         return( FALSE );   
  198.   
  199.     te32.dwSize = sizeof(THREADENTRY32 );   
  200.   
  201.   
  202.     if( !Thread32First( hThreadSnap, &te32 ) )   
  203.     {  
  204.         CloseHandle( hThreadSnap );   
  205.         return( FALSE );  
  206.     }  
  207.   
  208.     do   
  209.     {   
  210.         if( te32.th32OwnerProcessID == dwOwnerPID )  
  211.         {  
  212.             addr = ShowThreadInfo(te32.th32ThreadID);  
  213.             if(((DWORD)addr>(DWORD)m_pmodBaseAddr)&&((DWORD)addr<\  
  214.                 ((DWORD)m_pmodBaseAddr+(DWORD)m_dwmodBaseSize)))  
  215.             {  
  216.   
  217.                 HANDLE oth=OpenThread(THREAD_ALL_ACCESS,FALSE,te32.th32ThreadID);  
  218.                 //关闭这个线程   
  219.                 TerminateThread(oth, 0);  
  220.             }  
  221.         }  
  222.     } while( Thread32Next(hThreadSnap, &te32 ) );   
  223.   
  224.     CloseHandle( hThreadSnap );  
  225.     return( TRUE );  
  226. }  
  227. PVOID ShowThreadInfo(DWORD tid)   
  228. {   
  229.   
  230.     PVOID                    startaddr;   
  231.     HANDLE                   thread;       
  232.     //thread = m_pfnOpenThread_ex(THREAD_ALL_ACCESS,FALSE,tid);   
  233.     thread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid);  
  234.     if   (thread   ==   NULL)   
  235.         return   FALSE;  
  236.   
  237.     m_pfnZwQueryInformationThread(thread,  
  238.         ThreadQuerySetWin32StartAddress,     
  239.         &startaddr,     
  240.         sizeof(startaddr),     
  241.         NULL);   
  242.   
  243.     CloseHandle   (thread);   
  244.     return   startaddr;   
  245. }  
#include "stdafx.h"
#include "windows.h"
#include "TlHelp32.h"
const TCHAR QQ_GAME[] = _T("QQGame.exe");
const TCHAR QQ_THREAD_DLL[] = _T("TenSLX.dll");


typedef   enum   _THREADINFOCLASS   { 
	ThreadBasicInformation, 
	ThreadTimes, 
	ThreadPriority, 
	ThreadBasePriority, 
	ThreadAffinityMask, 
	ThreadImpersonationToken, 
	ThreadDescriptorTableEntry, 
	ThreadEnableAlignmentFaultFixup, 
	ThreadEventPair_Reusable, 
	ThreadQuerySetWin32StartAddress, 
	ThreadZeroTlsCell, 
	ThreadPerformanceCount, 
	ThreadAmILastThread, 
	ThreadIdealProcessor, 
	ThreadPriorityBoost, 
	ThreadSetTlsArrayAddress, 
	ThreadIsIoPending, 
	ThreadHideFromDebugger, 
	ThreadBreakOnTermination, 
	MaxThreadInfoClass 
}   THREADINFOCLASS;

typedef LONG (__stdcall *_pfnZwQueryInformationThread) (
	IN   HANDLE   ThreadHandle, 
	IN   THREADINFOCLASS   ThreadInformationClass, 
	OUT   PVOID   ThreadInformation, 
	IN   ULONG   ThreadInformationLength, 
	OUT   PULONG   ReturnLength   OPTIONAL 
	);

HANDLE m_GameProcessHandle;
//记录QQ_THREAD_DLL信息
BYTE  * m_pmodBaseAddr; 
DWORD   m_dwmodBaseSize;
_pfnZwQueryInformationThread m_pfnZwQueryInformationThread;

BOOL StartPatch();//PATCHQQ主函数
DWORD EnablePrivilege (LPCTSTR name);//提权函数
BOOL ListProcessModules(DWORD dwPID);//枚举指定进程的模块
BOOL ListProcessThreads( DWORD dwOwnerPID);//枚举指定进程创建的线程,并结束掉QQ保护线程
PVOID ShowThreadInfo(DWORD tid);//获取线程的起始地址

int _tmain(int argc, _TCHAR* argv[])
{
	m_pfnZwQueryInformationThread =(_pfnZwQueryInformationThread)\
		GetProcAddress   (LoadLibrary(_T("ntdll.dll")),"ZwQueryInformationThread");

	if (StartPatch())
	{
		printf("可以CE附加QQ游戏大厅了\n");
	}
	else
		printf("失败!\n");
	return 0;
}

BOOL StartPatch()
{
	if(0!=EnablePrivilege (SE_DEBUG_NAME))  
	{
		return FALSE;  
	}
	HANDLE hProcessSnap;
	PROCESSENTRY32 pe32;

	hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
	if( hProcessSnap == INVALID_HANDLE_VALUE )
	{
		return FALSE;
	}

	pe32.dwSize = sizeof( PROCESSENTRY32 );

	if( !Process32First( hProcessSnap, &pe32 ) )
	{
		CloseHandle( hProcessSnap );
		return FALSE;
	}

	BOOL bStartGame = FALSE;
	do
	{
		if (_tcscmp(pe32.szExeFile, QQ_GAME) == 0)
		{
			bStartGame = TRUE;
			m_GameProcessHandle = OpenProcess(PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION,\
				FALSE, pe32.th32ProcessID);
			if (m_GameProcessHandle == NULL)
			{
				return FALSE;
			}
			for (int i=0; i<5;i++)
			{
				if (!ListProcessModules(pe32.th32ProcessID))
				{
					return FALSE;
				}

			}
			if (!ListProcessThreads(pe32.th32ProcessID))
			{
				return FALSE;
			}
		}

	} while( Process32Next( hProcessSnap, &pe32 ) );

	if (!bStartGame)
	{
		MessageBox(NULL,_T("运行QQ大厅后才能使用"),_T("提示"),MB_OK);
		return FALSE;
	}
	CloseHandle( hProcessSnap );
	return TRUE;
}
DWORD EnablePrivilege (LPCTSTR name)  
{  
	HANDLE hToken;  
	BOOL rv;  
	//设置结构   
	TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };  
	// 查找权限值   
	LookupPrivilegeValue (  
		0,  
		name,  
		&priv.Privileges[0].Luid  
		);  
	// 打开本进程Token   
	OpenProcessToken(  
		GetCurrentProcess (),  
		TOKEN_ADJUST_PRIVILEGES,  
		&hToken  
		);  
	// 提权   
	AdjustTokenPrivileges (  
		hToken,  
		FALSE,  
		&priv,  
		sizeof priv,  
		0,  
		0  
		);  
	// 返回值,错误信息,如果操作成功,则应为ERROR_SUCCESS,为O   
	rv = GetLastError();  
	// 关闭Token   
	CloseHandle (hToken);  
	return rv;  
}  
BOOL ListProcessModules(DWORD dwPID)
{
	HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
	MODULEENTRY32 me32;

	hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
	if( hModuleSnap == INVALID_HANDLE_VALUE )
	{
		return( FALSE );
	}

	me32.dwSize = sizeof( MODULEENTRY32 );
	if( !Module32First( hModuleSnap, &me32 ) )
	{
		CloseHandle( hModuleSnap );
		return( FALSE );
	}
	do
	{
		if (_tcscmp(me32.szModule, QQ_THREAD_DLL) == 0)
		{
			m_pmodBaseAddr = me32.modBaseAddr;
			m_dwmodBaseSize = me32.modBaseSize;

		}

	}while( Module32Next( hModuleSnap, &me32 ));

	CloseHandle( hModuleSnap );
	return( TRUE );

}
BOOL ListProcessThreads( DWORD dwOwnerPID) 
{ 
	HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
	THREADENTRY32 te32; 
	PVOID addr;

	hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
	if( hThreadSnap == INVALID_HANDLE_VALUE ) 
		return( FALSE ); 

	te32.dwSize = sizeof(THREADENTRY32 ); 


	if( !Thread32First( hThreadSnap, &te32 ) ) 
	{
		CloseHandle( hThreadSnap ); 
		return( FALSE );
	}

	do 
	{ 
		if( te32.th32OwnerProcessID == dwOwnerPID )
		{
			addr = ShowThreadInfo(te32.th32ThreadID);
			if(((DWORD)addr>(DWORD)m_pmodBaseAddr)&&((DWORD)addr<\
				((DWORD)m_pmodBaseAddr+(DWORD)m_dwmodBaseSize)))
			{

				HANDLE oth=OpenThread(THREAD_ALL_ACCESS,FALSE,te32.th32ThreadID);
				//关闭这个线程
				TerminateThread(oth, 0);
			}
		}
	} while( Thread32Next(hThreadSnap, &te32 ) ); 

	CloseHandle( hThreadSnap );
	return( TRUE );
}
PVOID ShowThreadInfo(DWORD tid) 
{ 

	PVOID                    startaddr; 
	HANDLE                   thread;     
	//thread = m_pfnOpenThread_ex(THREAD_ALL_ACCESS,FALSE,tid);
	thread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid);
	if   (thread   ==   NULL) 
		return   FALSE;

	m_pfnZwQueryInformationThread(thread,
		ThreadQuerySetWin32StartAddress,   
		&startaddr,   
		sizeof(startaddr),   
		NULL); 

	CloseHandle   (thread); 
	return   startaddr; 
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值