初学过保护之TP学习总结.txt、
驱动保护大法超级群:208668455
本群学习交流建议:不要怕丢人,不要怕说错,用于提问并互相交流问题!
我是糖衫大胸 = 唐山大兄; QQ:43880574 , 教程有疑问或者错误,欢迎交流并指出!谢谢!
借此同时感谢 爱在路上 萝卜 等朋友
初学一个月整理的最有用的相关文章:
http://bbs.pediy.com/showthread.php?t=126802&highlight=tp
http://bbs.pediy.com/showthread.php?t=145968
http://bbs.pediy.com/showthread.php?t=127246&highlight=DebugPort
尽信书不如无书!也不能完全信这些资料,主要是思路,否则无论怎么学都是错的!
//////////////////////////////////////////////////////////////////////////
Ntdll.dll 是可由用户模式和核心模式程序调用的NT系统服务集接口,它们直
接由NT操作系统实现。
SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
///////////////////////////////////////////////////////////////////////////
OpenProcess应用层到内核隐秘通道
用户程序>>kernel32.OpenProcess>>ntdll.NtOpenProcess>>ntdll.ZwOpenProcess>>内核 ntkrnlpa.ZwOpenProcess>>SSDT-ntkrnlpa.NtOpenProcess
7469DE8E FF15 E8106874 call dword ptr [<&KERNEL32.OpenProcess>] ; kernel32.OpenProcess
7C830A2C FF15 1C11807C call dword ptr [<&ntdll.NtOpenProcess>] ; ntdll.ZwOpenProcess
0007FB64 7C830A32 返回到 kernel32.7C830A32 来自 ntdll.ZwOpenProcess
7FFE0300 7C92E510 ntdll.KiFastSystemCall
/////////////////////////////////////////////////////////////////////////////
128 NtOpenThread //防止调试器在它体内创建线程
122 NtOpenProcess //防止OD等在进程列表看到它
KiAttachProcess //防止其他软件附加它 通过计算得到
186 NtReadVirtualMemory //防止别人读取它的内存
277 NtWriteVirtualMemory //防止别人在它的内存里面乱写乱画
/////////////////////////////////////////////////////////////////////////////
下面这2个可以先不用管,网上也有KdDisableDebugger的方式,那就要自己另外搞了!
KDCOM.dll:KdReceivePacket //这两个是COM串口的接受和发送数据
KDCOM.dll:KdSendPacket //主要用来方式别人双机调试
/////////////////////////////////////////////////////////////////////////////
NtOpenProcess //防止OD等在进程列表看到它
KiAttachProcess //防止其他软件附加它
这2个跟游戏有通讯,要做判断!if
///////////////////////////////////////////////////////////////////////////////
关于清0:
网上有很多改变eprocess下访问结构已经失效!所以现在好用的办法是杀掉清0线程
!process 0 0
dt _eprocess
dt nt!_eprocess //附加进程
ba w4 nt!_eprocess+0xdc //我这里的0xdc是DebugPort的偏移 0x174 程序进程地址
解决办法:
利用syser对EPROCESS+BC处设置断点。找到清0的地方! 90 C3 NOP RETN
定位内核模块T?????.sys的首地址
MyEnumKernelModule("\\??\\c:\\windows\\system32\\tessafe.sys",&ModuleAddress,&ModuleSize);
然后根据特征码遍历整个模块找到我们需要的地方进行处理。
//////////////////////////////////////////////////////////////////////////////
关于监控线程:
去年的老文章上说 处理不当 会重启电脑,也就是向64端口写入FE导.text:01001665 mov al, 0FEh
所以也要杀掉
//////////////////////////////////////////////////////////////////////////////
接下来是DPC,系统回调,SYSTEM内线程,用XT解决!
/////////////////////////////////结果////////////////////////////////////////
最后当我把以上问题处理完毕之后,用OD附加,发现游戏卡住了,不知道是不是在虚拟机内的原因,暂时没时间弄!
//////////////////////////////////////////////////////////////////////////////
关于恢复硬件断点:
SSDT 表中索引为 0xD5和0x55的函数
//处理硬件断点时
ULONG uNtSetContextThreadAddress;
ULONG uNtGetContextThreadAddress;
ULONG TenNtSetContextThread,
TenNtGetContextThread;
//////////////////////////////////////////////////////////////////////
// 名称: _MyNtGetThreadContext
// 功能: 两个SSDT HOOK伪造函数的中继函数
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
static NAKED NTSTATUS Nakd_NtGetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
__asm
{
jmp dword ptr[TenNtGetContextThread]
}
}
static NAKED NTSTATUS Nakd_NtSetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
__asm
{
jmp dword ptr[TenNtSetContextThread]
}
}
//////////////////////////////////////////////////////////////////////
// 名称: MyNtGetThreadContext && MyNtSetThreadContext
// 功能: NtGetThreadContext与NtSetThreadContext函数被SSDT HOOK的伪造函数
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
NTSTATUS MyNtGetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
if ( _stricmp((const char*)PsGetProcessImageFileName(PsGetCurrentProcess()),DNF_EXE) )
{
return Nakd_NtGetThreadContext(hThread, pContext);
}
return STATUS_UNSUCCESSFUL;
}
NTSTATUS MyNtSetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
if ( _stricmp((const char*)PsGetProcessImageFileName(PsGetCurrentProcess()),DNF_EXE) )
{
return Nakd_NtSetThreadContext(hThread, pContext);
}
//DbgPrint("Dr7:%08X\n", pContext->Dr7);
if ( pContext->Dr7 == 0x101 )
{
return Nakd_NtSetThreadContext(hThread, pContext);
}
return STATUS_UNSUCCESSFUL;
}
//////////////////////////////////////////////////////////////////////
// 名称: My_Recovery_HardwareBreakpoint
// 功能: 通过对set与get进行SSDT HOOK来恢复硬件断点
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
NTSTATUS My_Recovery_HardwareBreakpoint()
{
KIRQL Irql;
//获取地址
uNtSetContextThreadAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase+0xD5 * 4;
uNtGetContextThreadAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase+0x55 * 4;
TenNtSetContextThread = *(ULONG*)uNtSetContextThreadAddress;
TenNtGetContextThread = *(ULONG*)uNtGetContextThreadAddress;
KdPrint(("Set地址:%0X\n",TenNtSetContextThread));
KdPrint(("Get地址:%0X\n",TenNtGetContextThread));
KdPrint(("Process:%0X \n",(ULONG)p_MyHookAddress));
KdPrint(("Thread:%0X \n",(ULONG)t_MyHookAddress));
WPOFF(); //清除CR0
//提升IRQL中断级
Irql=KeRaiseIrqlToDpcLevel();
//完成SSDT HOOK
*(ULONG*)uNtGetContextThreadAddress = (ULONG)MyNtGetThreadContext;
*(ULONG*)uNtSetContextThreadAddress = (ULONG)MyNtSetThreadContext;
//恢复Irql
KeLowerIrql(Irql);
WPON(); //恢复CR0
return STATUS_UNSUCCESSFUL;
}
下载地址:http://115.com/file/c2msx8h0#
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课