一.reload krnl的思想 :尽量 不改oldkrnl ,让new krnl 为od服务,实现隐藏debugport,分发调试消息
二.基本流程
1.fix debug port(重中之重)
2.基址重定位,new krnl 因为没调用初始化代码,也就是DriverEntry(KiSystemStartup),全局变量也就没有初始化,基址重定位的目的也就是让 new krnl 直接用 old krnl 的全局变量,但有些全局变量我们是不能直接用old krnl,像 函数指针(也属于全局变量),所以我们下一步就要 对部分函数指针 作重定位,让函数指针 指向 new krnl中的 函数
3.hook kifastcallentry ,这个函数是作sdt ,sdt shadow中服务函数中转的,让new krnl为 od提供服务,也就是 od 调用 那些服务函数时 走 new krnl中的函数(old krnl中的函数 可能被hook了 )
4.换idt ,我只换了 两个 中断函数 单步中断int 1(f7,f8用到) 和 int 3中断(也就是od中设置断点时用到的).不知 tp 的int 20 中断是搞什么用的.
5.tx的游戏好像在 ring 3 还搞了个 disable attach 看下DebugActiveProcess,DbgUiConnectToDbg,DbgUiDebugActiveProcess,DbgUiIssueRemoteBreakin,再结合google相关搜索,核心代码 也就是 RtlCreateUserThread(DbgUiRemoteBreakin),ring3 只需 hook DbgUiRemoteBreakin 就可简单反attach了,这个破东西,困扰了我好久.过这个破东西,只需开 strong od的 anti anti_debug就可搞定.
6.别忘了fix kiservicetable ,让od或被调试程序的部分nt函数,走newkrnl的 kiservicetable,至于哪些函数,在wrk中 搜下 DebugPort 就会找到答案.
7.让被调试程序的某些nt函数也走new krnl 为了 实现分发 调试消息
三
过tp其实就是要懂得调试器的原理,看下wrk中dbg开头,带操作 DebugPort的函数,是在什么时候被调用的基本上就知道 调试器是个什么鬼东西.
四.关于DebugPort
1.至于为什么要改DebugPort的偏移,以及DebugPort是个什么鬼东西,网上一大堆,这里我要说的是很多发的关于过tp的代码,都是要经过修改才能用的,那些debugport 的特征码在各个版本的系统是不一样的
2.DebugPort特征码找法.
a.在wrk中搜操作debugport的函数,一共有21个
b.ida ntoskrnl ,alt+b 空格 bc 00 00 00 把那21个函数找出来,包含bc 00 00 00的 一共有31处,MmCreatePeb 这个函数 出现了两次,其实有一处是错误的,不过你把它给fix了也不会有什么问题
至于有一处指向什么,自己找答案,这样的话,真正需要fix的地方只有30处(我说的是xp系统,下面附近是我的研究样本)
3.DebugPort 30处一定要全部搞对,fix后最好用windbg local krnl u 看下改对没,否则一处错误,就可能导致一些调试异常,像我在搞这个东西时,把DbgkExitThread, DbgkExitProcess 的特征码搞成了一样的,结果在od alt+f2 时 死活退不出被调试程序.困扰了好久,最后krnl debug ba 下访问断点时才找到原因
4.举例找特征码
{"89 83 BC 00 00 00 F6 45 18 02", "PspCreateProcess",}
alt+b ida中 第一行字符串 看图
5.再次强调不同的ntoskrnl debugport 特征码有些是不一样的
6.我还作了两处objecthook 一是 debugport 的 closeprocedure 和 psprocesstype的DeleteProcedure,我也不知道有没有用,因为我发现这些也是通过函数指针作的调用.这些是我在定位,调试器无法terminate被调试程序时发现的.
五
服务号 0-1000 基本上是 ntoskrnl.exe
1000-?? win2k.sys
2000-?? 可用来指向我们自己的表
六.知识点总结
1.pe结构 fileoffset rva,导入导出表,重定位表
2.线程亲和性,KeSetAffinityThread
3.描述符8字节,描述符表,段选择子
4.内核下fs寄存器,[ fs:18]=? 根据下面的宏都能得到答案
#define KIP0PCRADDRESS 0xffdff000 (_KPCR)
#define KI_USER_SHARED_DATA 0xffdf0000 (_KI_USER_SHARED_DATA)
5._KTHREAD->ServiceTable
6._PEB->KernelCallbackTable
7.PspCidTable
8.ssdt,ssdt shadow,idt
9._EPROCESS,_KTHREAD 重要数据结构
七.待掌握知识
1.分页,非分页相关概念
2.apc相关
3.mdl
八.疑问
1.一直想把wrk的 _EPROCESS移过来用,这个结构太庞大了,移了两次没成功
2._EPROCESS,在ntddk下有定义,不知咋搞了
3.OBJECT_TYPE ntddk 和wrk下都有定义
4.tp的代码中有个.vlizer段 不知是什么玩意,代码都变形了,不知是不是vmp?
5.tp调用的关键函数的地址都简单加密了,目前有下面这些函数
01016B50 g_EncryptFuncs
0=ExAcquireRundownProtection
4=ExEnumHandleTable
8=IoAllocateWorkItem
c=IoFreeWorkItem
10=IoInitializeTimer
14=IoQueueWorkItem
18=IoStartTimer
1c=IoStopTimer
20=IoThreadToProcess
24=IoVolumeDeviceToDosName
28=KdDebuggerEnabled
2c=KdDisableDebugger
30=KeAddSystemServiceTable
34=KeBugCheck
38=KeCancelTimer
3c=KeInitializeDpc
40=KeInitializeTimer
44=KeServiceDescriptorTable
48=KeSetTimerEx
4c=MmMapIoSpace
50=MmMapViewInSystemSpace
54=MmUnmapIoSpace
58=MmUnmapViewInSystemSpace
5c=NtDeviceIoControlFile
60=NtOpenProcess
64=NtOpenThread
68=NtSetInformationProcess
6c=ObfReferenceObject
70=ObOpenObjectByPointer
74=PsCreateSystemThread
78=PsGetContextThread
7c=PsGetProcessId
80=PsGetProcessImageFileName
84=PsGetProcessSessionId
88=PsLookupProcessByProcessId
8c=PsRemoveCreateThreadNotifyRoutine
90=PsRemoveLoadImageNotifyRoutine
94=PsSetCreateProcessNotifyRoutine
98=PsSetCreateThreadNotifyRoutine
9c=PsSetLoadImageNotifyRoutine
A0=RtlGetVersion
A4=ZwOpenDirectoryObject
A8=ZwQueryDirectoryObject
以前有人说 inline hook
NtOpenProcess _ObOpenObjectByPointer 0xba4a
NtOpenThread _ObOpenObjectByPointer 0x2ff2
这次试了下,在tp没更新前,好像没事,后来tp升级了
只要谁动了 上面两个函数中的 ob*函数 ,tp就会报异常,这就是为什么一开pchunter 就报异常(以前不报),pchunter 动了上面那个地方.
bp MessageBoxA
上传的附件: