首页
社区
课程
招聘
[注意]送给那些OD能附加HS进程下断点不断下的人
发表于: 2012-4-1 16:04 10927

[注意]送给那些OD能附加HS进程下断点不断下的人

2012-4-1 16:04
10927
extern "C"
typedef
NTSYSCALLAPI NTSTATUS NTAPI Nt_GetContextThread  ( __in HANDLE  ThreadHandle,  
                                                                                                 __inout PCONTEXT  ThreadContext   
                                                                                                 ) ;
Nt_GetContextThread* _NtGetContextThread;

PEPROCESS eprocess_NtGetContextThread;
ANSI_STRING Ansi_NtGetContextThread;
ANSI_STRING Ansi_NtGetContextThread1;
int in_res=0;
#pragma PAGEDCODE
extern "C"
NTSTATUS __stdcall MySSDT_NtGetContextThread  ( __in HANDLE  ThreadHandle,  
                                                                                    __inout PCONTEXT  ThreadContext   
                                                                                  )
{
        eprocess_NtGetContextThread=IoGetCurrentProcess();
        RtlInitAnsiString(&Ansi_NtGetContextThread,(PCSZ)((ULONG)eprocess_NtGetContextThread+0x174));
        RtlInitAnsiString(&Ansi_NtGetContextThread1,_Game_data);
        int in_res=((NTSTATUS(NTAPI*)(HANDLE,PCONTEXT))_NtGetContextThread)(ThreadHandle,ThreadContext);
        if(RtlCompareString(&Ansi_NtGetContextThread,&Ansi_NtGetContextThread1,TRUE)==0)
        {
                ThreadContext->Dr0=ThreadContext->Dr1=ThreadContext->Dr2=ThreadContext->Dr3=ThreadContext->Dr6=ThreadContext->Dr7=0;
        }  
        return in_res;
}

#pragma INITCODE
VOID SSDT_NtGetConetxtThread()
{
        ULONG* u_NtGetContextThread;
        u_NtGetContextThread=Getsset_this(in_NtGetContextThread);
        addrssdt_NtGetContextThread=Getssdt_addr(in_NtGetContextThread);
        KdPrint(("当前NtGetContextThread的地址为:%x\n",addrssdt_NtGetContextThread));
        _NtGetContextThread=(Nt_GetContextThread*)addrssdt_NtGetContextThread;
        PAGED_Open();
        *u_NtGetContextThread=(ULONG)MySSDT_NtGetContextThread;
        PAGED_Exit();
}

#pragma PAGEDCODE
VOID UnHook_NtGetContextThread()
{
        ULONG u_NtGetContextThread;
        u_NtGetContextThread=(ULONG)KeServiceDescriptorTable->ServiceTableBase+in_NtGetContextThread*4;
        PAGED_Open();
        *((ULONG*)u_NtGetContextThread)=addrssdt_NtGetContextThread;
        PAGED_Exit();
}

//------------------------------------------------------------------------------------------

jmp_code jmp_NtSetInformationThread;
pjmp_code pjmp_NtSetInformationThread;
#pragma INITCODE
VOID inline_NtSetInformationThread()
{
        addr_NtSetInformationThread_inline=Getssdt_addr(in_NtSetInformationThread);
        jmp_NtSetInformationThread_inline=addr_NtSetInformationThread_inline+5;
        ULONG u_long;
        __asm
        {
                push eax
                mov eax,inlineMy_NtSetInformationThread
                mov u_long,eax
                pop eax
        }
        pjmp_NtSetInformationThread=(pjmp_code)addr_NtSetInformationThread_inline;
        jmp_NtSetInformationThread.E9=pjmp_NtSetInformationThread->E9;
        jmp_NtSetInformationThread.Fun_addr=pjmp_NtSetInformationThread->Fun_addr;
        PAGED_Open();
        pjmp_NtSetInformationThread->E9=0xE9;
        pjmp_NtSetInformationThread->Fun_addr=(ULONG)(u_long-addr_NtSetInformationThread_inline-5);
        PAGED_Exit();
}

ULONG u_esp;
#pragma PAGEDCODE
VOID __declspec(naked) inlineMy_NtSetInformationThread()
{
        __asm
        {
                mov u_esp,esp
                pushad
                pushfd
                mov eax,u_esp
                mov eax,[eax+8]
                cmp eax,0x11
                jnz __break;
                popfd
                popad
                xor eax,eax
                ret
__break:
                popfd
                popad
                push 0D0h
                jmp jmp_NtSetInformationThread_inline
        }
}

#pragma PAGEDCODE
VOID inlineUn_NtSetInformationThread()
{
        PAGED_Open();
        pjmp_NtSetInformationThread->E9=jmp_NtSetInformationThread.E9;
        pjmp_NtSetInformationThread->Fun_addr=jmp_NtSetInformationThread.Fun_addr;
        PAGED_Exit();
}
//--------------------------------------------------------------

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
LZ用心人啊,,收藏下了!
2012-4-1 16:17
0
雪    币: 107
活跃值: (409)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
收藏拉....愚人节礼物???
2012-4-1 18:31
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
收藏了,楼主头像是本入门好书,打算看Windows核心编程
2012-4-1 20:43
0
雪    币: 230
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那个断住20秒左右游戏会退出啊。这个要怎么处理啊?
2012-4-1 22:32
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
哎~又是驱动.
2012-4-2 10:17
0
雪    币: 6564
活跃值: (4361)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
7
//其实很好剥离出来,CreateProcessA下断,然后看到xxx.updata.xxx的时候直接alt+f9,等待hs退出,然后往下走找到一处调用xx.dll 10号功能的地方直接跳过去再f9,然后游戏就可以正常启动了,但是进游戏后过N分钟后被T出,至今原因不明。
2012-4-2 12:32
0
雪    币: 230
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
研究一下HP 的CRC吧。好神秘啊!
2012-4-2 20:13
0
雪    币: 255
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark,hs 下断,菜鸟看了下,大概是hook两个函数分别是硬件断点和软件断点
2012-7-10 20:56
0
游客
登录 | 注册 方可回帖
返回
//