分享Win10 1903过TP的双机调试问题

差不多我用到的大部分代码都是从上面cv(Ctrl+c---->Ctrl+v)下来的

1、首先解决The context is partially valid. Only x86 user-mode context is available.

具体方式是hookKdpTrap

2、 防止安全组件加载失败

SharedUserData->KdDebuggerEnabled = FALSE;  //防止安全组件加载失败,SharedUserData这个是一个导出的全局变量直接写就行

3、XP会清零KdDebuggerEnabled

这里本来是打算做一个定时器,但是还是会导致TesNginx.Sycccccccccccccc出现蓝屏,所以只有手动的去修改

4、断链隐藏 kdcom,防止kdcom内存被清空导致和windbg通讯不了

5、XP会检测KdEnteredDebugger,如果是1就直接蓝屏

处理方式是让他去找其他位置(PUCHAR)KdEnteredDebugger + 0x30;  //据暗中观察,+0x30 的位置恒为0

做完这些之后基本上就能够下断点了,但是其实还是有问题(由于hook了系统函数有一定的几率会触发109错误->PathGuard,一开始我也分不清楚,后来慢慢的也了解了)

之后放上一张过了图片

最后把代码也带上吧,.asm文件很简单简单的inlinhook就行了

#include <Ntifs.h>
#include <ntimage.h>
extern void debg();
//关闭写保护
KIRQL WPOFFx64(){
 KIRQL irql = KeRaiseIrqlToDpcLevel();
 UINT64 cr0 = __readcr0();
 cr0 &= 0xfffffffffffeffff;
 __writecr0(cr0);
 _disable();
 return irql;
}
//开启写保护
void WPONx64(KIRQL irql){
 UINT64 cr0 = __readcr0();
 cr0 |= 0x10000;
 _enable();
 __writecr0(cr0);
 KeLowerIrql(irql);
}
//这里尝试过tp的双机调试,环境为win10 1903
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//1、首先解决The context is partially valid. Only x86 user-mode context is available.
/*
nt!KdpTrap:
fffff807`64bfffc8 48895c2408   mov   qword ptr [rsp+8],rbx
fffff807`64bfffcd 4889542410   mov   qword ptr [rsp+10h],rdx
fffff807`64bfffd2 57       push  rdi
fffff807`64bfffd3 4883ec40    sub   rsp,40h
fffff807`64bfffd7 33d2      xor   edx,edx
*/
ULONG64 orgkdt = 0xfffff80166201fc8;
//ULONG64 orgkdt= 0xfffff80764bfffc8;//直接写硬编码,这里需要进行修改<-------------------------------------------------------------------------------------------------------------------------------------------------------
NTKERNELAPI UCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);
extern NTSTATUS hdbktrap(IN PKTRAP_FRAME TrapFrame,IN PKEXCEPTION_FRAME ExceptionFrame,IN PEXCEPTION_RECORD ExceptionRecord,IN PCONTEXT ContextRecord,IN KPROCESSOR_MODE PreviousMode,IN BOOLEAN SecondChanceException);
//这里做一个跳转
VOID ModifyKdpTrap(PVOID myaddress,PVOID targetaddress) {
 KIRQL irql;
 ULONGLONG myfun;
 UCHAR jmp_code[] = "\x48\xB8\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xE0\x00\x00";//mov rax xxx,jmp rax
 myfun = (ULONGLONG)myaddress;//替换成自己的函数地址
 RtlCopyMemory(jmp_code + 2, &myfun, 8);
 //debg();
 irql = WPOFFx64();
 RtlCopyMemory(targetaddress, jmp_code, 12);
 WPONx64(irql);
}
//这里完成hook
NTSTATUS HookKdpTrap(
 IN PKTRAP_FRAME TrapFrame,
 IN PKEXCEPTION_FRAME ExceptionFrame,
 IN PEXCEPTION_RECORD ExceptionRecord,
 IN PCONTEXT ContextRecord,
 IN KPROCESSOR_MODE PreviousMode,
 IN BOOLEAN SecondChanceException){

 PEPROCESS hp = PsGetCurrentProcess();
 if (!_stricmp((char *)PsGetProcessImageFileName(hp), "TASLogin.exe")){
 return STATUS_SUCCESS;
 }
 return hdbktrap(TrapFrame, ExceptionFrame, ExceptionRecord, ContextRecord, PreviousMode, SecondChanceException);
}
//这里做一个还原
void UnHookKdpTrap() {
 KIRQL irql;
 UCHAR orignal_code[] = "\x48\x89\x5c\x24\x08\x48\x89\x54\x24\x10\x57\x48\x83\xec\x40";//mov rax xxx,jmp rax
 irql = WPOFFx64();
 RtlCopyMemory(orgkdt, orignal_code, 15);
 WPONx64(irql);
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//2、 防止安全组件加载失败
VOID DisableKdDebuggerEnabled() {
 SharedUserData->KdDebuggerEnabled = FALSE; //防止安全组件加载失败
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//3、TP会清零KdDebuggerEnabled,这里做一个每隔一秒的定时器
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//4、断链隐藏 kdcom,防止kdcom内存被清空导致和windbg通讯不了
/*
0: kd> dt _eprocess
nt!_EPROCESS
  +0x000 Pcb       : _KPROCESS
  +0x2e0 ProcessLock   : _EX_PUSH_LOCK
  +0x2e8 UniqueProcessId : Ptr64 Void
  +0x2f0 ActiveProcessLinks : _LIST_ENTRY
*/
PDRIVER_OBJECT pDriverObject = NULL;
typedef struct _KLDR_DATA_TABLE_ENTRY {
 LIST_ENTRY InLoadOrderLinks;
 PVOID ExceptionTable;
 ULONG ExceptionTableSize;
 PVOID GpValue;
 ULONG UnKnow;
 PVOID DllBase;
 PVOID EntryPoint;
 ULONG SizeOfImage;
 UNICODE_STRING FullDllName;
 UNICODE_STRING BaseDllName;
 ULONG Flags;
 USHORT LoadCount;
 USHORT __Unused5;
 PVOID SectionPointer;
 ULONG CheckSum;
 PVOID LoadedImports;
 PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
VOID HideDriver(){
 PKLDR_DATA_TABLE_ENTRY entry = (PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;
 PKLDR_DATA_TABLE_ENTRY firstentry;
 UNICODE_STRING uniDriverName;
 firstentry = entry;
 // 初始化要隐藏驱动的驱动名
 RtlInitUnicodeString(&uniDriverName, L"kdcom.dll");
 while ((PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink != firstentry){
 if (entry->FullDllName.Buffer != 0){
  if (RtlCompareUnicodeString(&uniDriverName, &(entry->BaseDllName), FALSE) == 0){
  //DbgPrint("隐藏驱动 %ws 成功!\n", entry->BaseDllName.Buffer);
  // 修改 Flink 和 Blink 指针, 以跳过我们要隐藏的驱动
  *((ULONG*)entry->InLoadOrderLinks.Blink) = (ULONG)entry->InLoadOrderLinks.Flink;
  entry->InLoadOrderLinks.Flink->Blink = entry->InLoadOrderLinks.Blink;
  /*
   使被隐藏驱动LIST_ENTRY结构体的Flink, Blink域指向自己
   因为此节点本来在链表中, 那么它邻接的节点驱动被卸载时,
   系统会把此节点的Flink, Blink域指向它相邻节点的下一个节点.
   但是, 它此时已经脱离链表了, 如果现在它原本相邻的节点驱动被
   卸载了, 那么此节点的Flink, Blink域将有可能指向无用的地址, 而
   造成随机性的BSoD.
  */
  entry->InLoadOrderLinks.Flink = (LIST_ENTRY*)&(entry->InLoadOrderLinks.Flink);
  entry->InLoadOrderLinks.Blink = (LIST_ENTRY*)&(entry->InLoadOrderLinks.Flink);
  break;
  }
 }
 // 链表往前走
 entry = (PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink;
 }
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//5、处理TP蓝屏
/*
fffff807`642d2210 48895c2420   mov   qword ptr [rsp+20h],rbx
fffff807`642d2215 4488442418   mov   byte ptr [rsp+18h],r8b
fffff807`642d221a 56       push  rsi
fffff807`642d221b 57       push  rdi
fffff807`642d221c 4154      push  r12
fffff807`642d221e 4155      push  r13
fffff807`642d2220 4157      push  r15
fffff807`642d2222 4883ec20    sub   rsp,20h
*/
#define KdEnteredDebugger 0xfffff80165d061e0
//#define KdEnteredDebugger 0xfffff80764704100//直接写硬编码,这里需要进行修改<-----------------------------------------------------------------------------------------------------------------------------------------------
extern PMDL hookIoAllocateMdl(__drv_aliasesMem PVOID VirtualAddress, ULONG Length, BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota, PIRP Irp);
ULONG64 IoAllocateM=0;
//这里做一个跳转
VOID ModifyIoAllocateMdl(PVOID myaddress, PVOID targetaddress) {
 KIRQL irql;
 ULONGLONG myfun;
 UCHAR jmp_code[] = "\x48\xB8\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xE0\x00\x00";//mov rax xxx,jmp rax
 myfun = (ULONGLONG)myaddress;//替换成自己的函数地址
 RtlCopyMemory(jmp_code + 2, &myfun, 8);
 //debg();
 irql = WPOFFx64();
 RtlCopyMemory(targetaddress, jmp_code, 12);
 WPONx64(irql);
}
PMDL newIoAllocateMdl(__drv_aliasesMem PVOID VirtualAddress, ULONG Length, BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota, PIRP Irp){
 //debg();
 if(VirtualAddress == KdEnteredDebugger){
 //DbgPrint("[KdEnteredDebugger] address: %p\n", KdEnteredDebugger);
 VirtualAddress = (PUCHAR)KdEnteredDebugger + 0x30; //据暗中观察,+0x30 的位置恒为0
 }
 return hookIoAllocateMdl(VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp);
}
//这里做一个还原
void UnHookIoAllocateMdl() {
 KIRQL irql;
 UCHAR orignal_code[] = "\x48\x89\x5c\x24\x20\x44\x88\x44\x24\x18\x56\x57\x41\x54\x41\x55";
 irql = WPOFFx64();
 RtlCopyMemory(IoAllocateMdl, orignal_code, 15);
 WPONx64(irql);
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
VOID DriverUnload(PDRIVER_OBJECT DriverObject) {
 //还原之前的KdpTraphook
 UnHookKdpTrap();
 //还原之前的IoAllocateMdl
 UnHookIoAllocateMdl();
 //取消定时器

 DbgPrint("See You !\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegPath) {
 pDriverObject = DriverObject;
 DriverObject->DriverUnload = DriverUnload;
 //这里把这个函数进行了hook
 ModifyKdpTrap(HookKdpTrap, orgkdt);
 //防止安全组件加载失败
 DisableKdDebuggerEnabled();
 //摘掉kdcom的eprocess
 HideDriver();
 //干掉TP蓝屏
 IoAllocateM = (ULONG64)IoAllocateMdl;//得到函数的地址
 ModifyIoAllocateMdl(newIoAllocateMdl, IoAllocateMdl);
 //设置定时器
 return STATUS_SUCCESS;
}

总结

以上所述是小编给大家分享的Win10 1903过TP的双机调试问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 详解Win10 Bash/WSL调试Linux环境下的.NET Core应用程序

    一.简介 使用过Mac OS的程序员都知道,在Mac Book Pro上写程序是一件比较爽的事儿,作为dotneter,我们都比较羡慕Mac系统的环境,比如命令行,当然设备也是挺漂亮的. 在新的Win10系统中微软给我们提供了一个基于Ubuntu的Linux子系统(Bash/WSL).要全用Bash/WSL也比较简单,首先要先打开开发者模式( 设置 → 更新和安全 → 针对开发人员 → 开发人员模式), 然后在控制面板 → 程序 → 启用Windows功能 → Windows Subsystem

  • 分享Win10 1903过TP的双机调试问题

    差不多我用到的大部分代码都是从上面cv(Ctrl+c---->Ctrl+v)下来的 1.首先解决The context is partially valid. Only x86 user-mode context is available. 具体方式是hookKdpTrap 2. 防止安全组件加载失败 SharedUserData->KdDebuggerEnabled = FALSE;  //防止安全组件加载失败,SharedUserData这个是一个导出的全局变量直接写就行 3.XP会清零K

  • Win10下配置IIS10并支持调试ASP程序的步骤

    微软公司的IIS IIS(Internet Information Server)是由微软公司提供的基于Mircrosoft Windows的互联网基本服务,它是目前最流行的Web服务器产品,很多著名的网站都是建立在IIS平台上的.IIS Web服务组件包括Web服务器,FTP服务器,NNTP服务器和SMTP服务器,分别用于网页浏览.文件传输.新闻服务和邮件发送等方面,使得在网络上发布信息成了一件很容易的事. 本次实验就利用IIS搭建一个Windows 10环境下处于同一局域网段内可以相互访问的

  • 微信小程序--onShareAppMessage分享参数用处(页面分享)

    今天下午突然听到群里有人说微信小程序工具更新了,文档也更新了不少内容. 顾不上吃冬至的饺子.我就冲进来了. 先说分享功能,目前真机尚不能调试.开发工具上可以看看效果.后续还会更新. Page()中加上如下代码后在右上角就会出现三个小白点 title:分享的标题. desc:分享一段描述. path:这个参数有点意思.以前在微信中的分享一般都是url.这里是当前页面这里应该是pages/index?id=123这里的id目前还不知道是什么. 也就是说以后你可以在微信中像分享一个网页一样分享一个页面

  • PhpStorm 如何优雅的调试Hyperf的方法步骤

    前言: 我也是昨晚看了黄岛主的直播后学会的这个方法,今天中午趁着休息时间,把这个技巧分享给大家.就是大家在调试 Hyperf 的时候,可能总需要做一些服务的重启,重新点击 postman 的接口请求按钮,查看调试的结果是否正常,这篇文章就是教大家如何在 PhpStorm 中完成这一系列的操作. 一.Hyperf快速重启 第一步: 点击 PhpStorm 右上角的按钮,如图所示: 第二步: 点击弹框中左上角的添加按钮,然后再点击 PHP Script,如图所示: 第三步: 填写PHP脚本的信息:

  • Go语言编译原理之源码调试

    目录 前言 Goland的debug调试Go源码 dlv工具调试Go源码 安装 常用命令 dlv调试抽象语法树构建 前言 在前边几篇文章中分享了Go编译过程中的源码实现,本文主要是想分享一下我是怎么调试Go的源代码的(如果你很熟悉的话,可以跳过本文).本文主要是分享两种Go源码的调试方法 Goland的debug dlv工具 本文我还会以抽象语法树为例,来通过dlv对它的构建过程进行调试 Goland的debug调试Go源码 下边以调试Go编译的入口文件为例 编辑debug配置 填写配置信息 打

  • 详解基于python-django框架的支付宝支付案例

    一. 开发前的准备 1. 必须了解的知识 SDK:软件开发工具包,可以为开发者提供快速开发的工具 沙箱环境:也就是测试环境 支付宝支付金额的精度:小数点后两位(面试) 支付宝用的什么加密方式:RSA 2. 沙箱环境的配置 ① 登录支付宝开放平台 https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopen.alipay.com%2Fplatform%2Fhome.htm ② 进入管理中心后选择研[研发服务] ③ 生

  • 使用ElasticSearch6.0快速实现全文搜索功能的示例代码

    本文不涉及ElasticSearch具体原理,只记录如何快速的导入mysql中的数据进行全文检索. 工作中需要实现一个搜索功能,并且导入现有数据库数据,组长推荐用ElasticSearch实现,网上翻一通教程,都是比较古老的文章了,无奈只能自己摸索,参考ES的文档,总算是把服务搭起来了,记录下,希望有同样需求的朋友可以少走弯路,能按照这篇教程快速的搭建一个可用的ElasticSearch服务. ES的搭建 ES搭建有直接下载zip文件,也有docker容器的方式,相对来说,docker更适合我们

  • 分享Visual Studio原生开发的10个调试技巧(2)

    之前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS2005或者更新版本中(当然有一些可以适用于旧版本).如果你继续,你可以知道每个技巧的详细信息. 技巧11:数据断点 当数据所在内存位置变化时,调试器将会中断.然而,这是唯一可能在一个时间创建4这样的硬件的数据断点.数据断点只能在编译的过程中添加,可以通过菜单(编译>新断点>新数据断点)或者通过断点窗口来

  • JavaScript调试之console.log调试的一个小技巧分享

    前言 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻断JavaScript程序的执行,从而造成副作用: alert弹出框需要点击确认比较麻烦,而console.log()仅在控制台中打印相关信息,因此不会造成类似的顾虑. 最重要的是alert只能输出字符串,不能输出对象里面的结构,console.log()可以接受任何字符串.数字和JavaScript对象,可以看到清楚的对象属性结构,在ajax返回jso

  • 灵活应用js调试技巧解决样式问题的步骤分享

    由于种种原因,例如:代码逻辑复杂.时间久了遗忘处理细节.或者根本就是接手修改别人遗留的bug,在这种情况下,debug就会变成一件头疼的事情. 在此分享一些JS调试方面的技巧,针对各种疑难杂症,往往能起到较好的效果. Step 1:检查服务器直接render出来的内容 使用查看源文件的方式,这一步首先明确,页面HTML片段是否在服务器端就已经不正常了. Step 2:比较实际的HTML内容和服务器render出来的原始内容之间的差异 可以使用一些前端工具(例如:IE下的开发人员工具.Firebu

随机推荐