首页
社区
课程
招聘
[原创]ring3下过某游戏的HS保护
发表于: 2012-3-4 12:22 40786

[原创]ring3下过某游戏的HS保护

2012-3-4 12:22
40786

标 题: 【原创】ring3下过某游戏的HS保护

作 者: fbbttfbb

时 间: 2012-03-04,13:06:33

声明:本文只为研究技术,如使用本文中的源码及技术产生了侵权或违法行为,本人概不负责。如有侵犯你版权的行为,请联系我,本文将立即改正!

说明:
    HS有ring0驱动保护及ring3下保护,这个方法是在不加载驱动下,就轻松过HS游戏保护,是自己这几天研究的成果,现在发表出来.游戏是韩国的名品

<1>下载附件中的ehsvc.dll文件替换原来游戏HS目录下的文件

<2>HOOK CreateProcess, CreateFile, NtSetInformationThread
HOOK CreateProcess的目的是让HS的hsupdate.exe(HS更新进程)进程不让起来
BOOL WINAPI Mine_CreateProcessA(        LPCSTR lpApplicationName,
                                                                        LPSTR lpCommandLine,
                                                                        LPSECURITY_ATTRIBUTES lpProcessAttributes,
                                                                        LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                                                        BOOL bInheritHandles,
                                                                        DWORD dwCreationFlags,
                                                                        LPVOID lpEnvironment,
                                                                        LPCSTR lpCurrentDirectory,
                                                                        LPSTARTUPINFOA lpStartupInfo,
                                                                        LPPROCESS_INFORMATION lpProcessInformation)
{

        CString strtemp= lpCommandLine;
        strtemp.MakeLower();
        if(strtemp.Find("hsupdate.exe") !=-1)
                return FALSE;

        BOOL bret = FALSE;

        g_hook_CreateProcessA.UnHook();
        bret = CreateProcessA(        lpApplicationName,
                lpCommandLine,
                lpProcessAttributes,
                lpThreadAttributes,
                bInheritHandles,
                dwCreationFlags,
                lpEnvironment,
                lpCurrentDirectory,
                lpStartupInfo,
                lpProcessInformation);

        g_hook_CreateProcessA.Hook();
       

        return bret;

       
}

BOOL WINAPI Mine_CreateProcessW(        LPCWSTR lpApplicationName,
                                                                        LPWSTR lpCommandLine,
                                                                        LPSECURITY_ATTRIBUTES lpProcessAttributes,
                                                                        LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                                                        BOOL bInheritHandles,
                                                                        DWORD dwCreationFlags,
                                                                        LPVOID lpEnvironment,
                                                                        LPCWSTR lpCurrentDirectory,
                                                                        LPSTARTUPINFOW lpStartupInfo,
                                                                        LPPROCESS_INFORMATION lpProcessInformation)                                                       
{       

        USES_CONVERSION;
       
        CString strtemp=W2A(lpCommandLine);
        strtemp.MakeLower();
        if(strtemp.Find("hsupdate.exe") !=-1)
                return FALSE;

        BOOL bret=FALSE;
        g_hook_CreateProcessW.UnHook();
        bret = CreateProcessW(        lpApplicationName,
                lpCommandLine,
                lpProcessAttributes,
                lpThreadAttributes,
                bInheritHandles,
                dwCreationFlags,
                lpEnvironment,
                lpCurrentDirectory,
                lpStartupInfo,
                lpProcessInformation);
       
        g_hook_CreateProcessW.Hook();
       
        return bret;
}

HOOK CreateFile的目的是让EagleXNt.sys(HS驱动)不起来
HANDLE WINAPI Mine_CreateFileA(LPCSTR lpFileName,
                                                           DWORD dwDesiredAccess,
                                                           DWORD dwShareMode,
                                                           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                                           DWORD dwCreationDisposition,
                                                           DWORD dwFlagsAndAttributes,
                                                           HANDLE hTemplateFile)
{
        int pos = string(lpFileName).find("EagleXNt");
        if(pos!=-1)
                return NULL;
       
       
        HANDLE hhh = NULL;
        g_hook_CreateFileA.UnHook();
        hhh = CreateFileA(lpFileName,
                dwDesiredAccess,
                dwShareMode,
                lpSecurityAttributes,
                dwCreationDisposition,
                                                                dwFlagsAndAttributes,
                                hTemplateFile
                                                                );
        g_hook_CreateFileA.Hook();
       
        return hhh;

       
}

HANDLE WINAPI Mine_CreateFileW(LPCWSTR lpFileName,
                                                           DWORD dwDesiredAccess,
                                                           DWORD dwShareMode,
                                                           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                                           DWORD dwCreationDisposition,
                                                           DWORD dwFlagsAndAttributes,
                                                           HANDLE hTemplateFile)
{
        int pos = wstring(lpFileName).find(L"EagleXNt");
        if(pos!=-1)
                return NULL;
       
        HANDLE hhh = NULL;
        g_hook_CreateFileW.UnHook();
        hhh = CreateFileW(lpFileName,
                dwDesiredAccess,
                dwShareMode,
                lpSecurityAttributes,
                dwCreationDisposition,
                                                                dwFlagsAndAttributes,
                                hTemplateFile
                                                                );
        g_hook_CreateFileW.Hook();
        return hhh;
       
}

HOOK NtSetInformationThread的目的是让线程可以调试

DWORD  WINAPI Mine_NtSetInformationThread(
                                                                                  HANDLE hThread,
                                                                                  DWORD ThreadInformationClass,
                                                                                  PVOID ThreadInformation,
                                                                                  ULONG ThreadInformationLength                                                                                       
                                                                                  )
{
        if (ThreadInformationClass == 17)
    {
        //HideFromDebugger
        return 1;
    }
        DWORD hhh = NULL;
        g_hook_NtSetInformationThread.UnHook();
        hhh = NtSetInformationThread(hThread,
                ThreadInformationClass,
                ThreadInformation,
                ThreadInformationLength);
        g_hook_NtSetInformationThread.Hook();
       
        return hhh;
}

<3>暂停HS ring3下的保护线程

暂停HS ring3下的保护线程这里需要注意,只有在游戏启动后,进入游戏画面或者登陆画面,HS ring3下的保护线程才起来然后就暂停,这里在线程里处理
unsigned   WINAPI   threadproc(LPVOID   lpparam)
{
       
        g_stopthread = 0;
       
       
        BOOL Bretsus = FALSE;
       
        //等待35秒, 只有在游戏启动后,进入游戏画面或者登陆画面,HS ring3下的保护线程才//起来然后就暂停
        Sleep(35000);
        DWORD pid = GetCurrentProcessId();
       
        HANDLE   h   =   CreateToolhelp32Snapshot   (TH32CS_SNAPTHREAD,   pid);   
        THREADENTRY32   te;   
        te.dwSize   =   sizeof   (te);   
        if(Thread32First   (h,   &te))   
        {   
                do   
                {   
                        Bretsus = SuspendHsThread(te.th32ThreadID, pid );
                       
                }while   (Thread32Next   (h,   &te));   
        };   
        CloseHandle(h);
               
       
        _endthreadex( 0 );
        return 0;
}

BOOL   SuspendHsThread   (DWORD   tid ,DWORD dwpid)   
{   
        THREAD_BASIC_INFORMATION         tbi;   
        PVOID                                               startaddr;   
        LONG                                                 status;   
        HANDLE                                             thread,   process;   
       
        thread   =   ::OpenThread   (THREAD_ALL_ACCESS,   FALSE,   tid);   
        if   (thread   ==   NULL)   
                return   FALSE;   
   
        status   =   ZwQueryInformationThread   (thread,     
                ThreadQuerySetWin32StartAddress,     
                &startaddr,     
                sizeof   (startaddr),     
                NULL);   
   
        if   (status   <   0)   
        {   
                CloseHandle   (thread);   
                SetLastError   (RtlNtStatusToDosError   (status));   
                return   FALSE;   
        };   
   
        //        _tprintf   (TEXT   ("线程   %08x   的起始地址为   %p/n"),     
        //                tid,     
        //                startaddr);   
   
        status   =   ZwQueryInformationThread   (thread,     
                ThreadBasicInformation,     
                &tbi,     
                sizeof   (tbi),     
                NULL);   
   
        if   (status   <   0)   
        {   
                CloseHandle   (thread);   
                SetLastError   (RtlNtStatusToDosError   (status));   
                return   FALSE;   
        };   
   
        //        _tprintf   (TEXT   ("线程   %08x   所在进程ID为   %08x/n"),     
        //                tid,     
        //                (DWORD)tbi.ClientId.UniqueProcess);   
    if(dwpid==(DWORD)tbi.ClientId.UniqueProcess)
        {
                process   =   ::OpenProcess   (PROCESS_ALL_ACCESS,     
                        FALSE,     
                        (DWORD)tbi.ClientId.UniqueProcess);   
               
                if   (process   ==   NULL)   
                {   
                        DWORD   error   =   ::GetLastError   ();   
                        CloseHandle   (thread);   
                        SetLastError   (error);   
                        return   FALSE;   
                };   
               
                TCHAR   modname   [0x100];   
                GetModuleFileNameEx(process,   NULL,   modname,   0x100);   
               
                //        _tprintf   (TEXT   ("线程   %08x   所在进程映象为   %s/n"),     
                //                tid,     
                //        modname);   
               
                GetMappedFileName(process,     
                        startaddr,     
                        modname,     
                        0x100);   
               
                //        _tprintf   (TEXT   ("线程   %08x   可执行代码所在模块为   %s\n"),     
                //                tid,     
                //                modname);   
                CString strte = modname;
                if(strte.Find("ehsvc.dll")!=-1)
                {
//找到HS线程,暂停
                        SuspendThread(thread);
               
                        return TRUE;
                }
               
                CloseHandle   (process);   
        }
       
        CloseHandle   (thread);   
        return   FALSE;   
};

<4>把以上代码封装成DLL然后注入到游戏进程

<5>DLL可能用到的其它数据结构
typedef DWORD (WINAPI *PNtSetInformationThread)(HANDLE hThread,
                                                                                                DWORD ThreadInformationClass,
                                                                                                PVOID ThreadInformation,
                                                                                                ULONG ThreadInformationLength                                                                                       
                                                                                                );

PNtSetInformationThread  NtSetInformationThread=NULL;

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   struct   _CLIENT_ID   {   
        HANDLE   UniqueProcess;   
        HANDLE   UniqueThread;   
}   CLIENT_ID;   
typedef   CLIENT_ID   *PCLIENT_ID;   

typedef   struct   _THREAD_BASIC_INFORMATION   {   //   Information   Class   0   
        LONG           ExitStatus;   
        PVOID         TebBaseAddress;   
        CLIENT_ID   ClientId;   
        LONG   AffinityMask;   
        LONG   Priority;   
        LONG   BasePriority;   
}   THREAD_BASIC_INFORMATION,   *PTHREAD_BASIC_INFORMATION;   

extern   "C"   LONG   (__stdcall   *ZwQueryInformationThread)   (   
                                                                                                                                 IN   HANDLE   ThreadHandle,   
                                                                                                                                 IN   THREADINFOCLASS   ThreadInformationClass,   
                                                                                                                                 OUT   PVOID   ThreadInformation,   
                                                                                                                                 IN   ULONG   ThreadInformationLength,   
                                                                                                                                 OUT   PULONG   ReturnLength   OPTIONAL   
                                                                                                                                 )   =   NULL;   

extern   "C"   LONG   (__stdcall   *RtlNtStatusToDosError)   (   
                                                                                                                          IN     ULONG   status)   =   NULL;

<6>有错别字或者表达不清楚请见谅


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (32)
雪    币: 523
活跃值: (278)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
好东西 顶楼主

广告位招租
2012-3-4 12:50
0
雪    币: 1530
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
問下覆蓋ehsvc.dll的用意是??
2012-3-4 12:51
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
替换成老版本ehsvc.dll
2012-3-4 13:38
0
雪    币: 209
活跃值: (813)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个在国内有HS的游戏上也能用吗??
好像有区别吧?
2012-3-4 14:14
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
不让加载驱动就能过了啊?。。
2012-3-4 19:10
0
雪    币: 76
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
HS 直接检测自身版本 更新到最新的。
2012-3-4 22:58
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
8
学习一下。
2012-3-4 23:17
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
9
最近过游戏保护的好多文章,学习之~~
2012-3-5 00:28
0
雪    币: 336
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
下次有空把ring0下过某游戏的NP保护也写出来
2012-3-5 10:06
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不让加载有一万种方法 但是还要pass他的心跳检测
2012-3-5 10:35
0
雪    币: 320
活跃值: (263)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
ls有大神出没
2012-3-5 10:49
0
雪    币: 1103
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主,我很好奇附件里的ehsvc.dll是如何来的,应该怎么做,才能Patch,而且还带数字签名
2012-3-5 15:24
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
这个心跳补丁后,就closeSocket了。不信你可以试一试。

某某SDK 已经一目了然了。
2012-3-6 17:40
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
5.5.10.147 还有一个神秘的字节的,可以关掉所有存在的保护!
2012-3-6 17:45
0
雪    币: 1737
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
都是狠人撒~
2012-3-9 15:50
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼主 把这个搞复杂化了
2012-3-9 20:07
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这么厉害?

谢谢分享
2012-3-9 23:26
0
雪    币: 34
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
楼主的方法不错,我见过一个过np的dll采用同楼主相同的方法
2012-3-10 10:09
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
先顶一下记录记录
2012-3-10 16:35
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
#7 完全可以关闭的,不知楼主为什么要这样弄,方法另类?
2012-3-11 12:00
0
雪    币: 7314
活跃值: (4512)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
不错,mark
2012-3-12 11:08
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
好啊。可是我看不懂啊。。支持LZ。。。。。。。。。。。。。。。。
2012-3-12 21:35
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
经过冒险岛 实战测试  卡在了检查SNDC更新这里 呵呵

不过点击取消还是能进入到游戏,不过这个EagleNT.sys还是启动了的呢

开启OD HS仍然能检测到试图使用非法程序

哦 忘了感谢楼主的分享。补上 呵呵
2012-3-14 09:40
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
这个值得学习,RING3下的修改很少见。
2012-5-29 01:07
0
游客
登录 | 注册 方可回帖
返回
//