天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 4442|回复: 0

过QQ游戏大厅的SX保护附源代码

[复制链接]

14

主题

0

回帖

17

积分

编程入门

Rank: 1

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


#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;   
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表