ring0-更改dbgport地址偏移过掉dbgport清0

http://blog.csdn.net/hgy413/article/details/7791390

正方案:
把 EPROCESS->DebugPort = NULL清零,这样调试器就无法接受到消息了,也就无法调试了
反方案:
以下的操作都可以写成一个script来操作.

debugport和哪些函数相关

1.首先打开一个calc.exe:

[cpp] view plaincopy

  1. kd> !process 0 0 calc.exe
  2. PROCESS 861a9020  SessionId: 0  Cid: 068c    Peb: 7ffdb000  ParentCid: 05c8
  3. DirBase: 0c9801a0  ObjectTable: e21cdd28  HandleCount:  44.
  4. Image: calc.exe

查看下debugport的位置

[cpp] view plaincopy

  1. kd> dt _EPROCESS -y DebugPort  861a9020
  2. nt!_EPROCESS
  3. +0x0bc DebugPort : (null)

这里看到偏移是0xbc

对它下内存读写断点:(r是表示读或写)

[cpp] view plaincopy

  1. kd> ba r4 861a9020+0xbc
  2. kd> bl
  3. 0 e 861a90dc r 4 0001 (0001)

2.g运行系统,虚拟机本地打开一个windbg,附加上calc.exe,这时系统肯定会断下来

[cpp] view plaincopy

  1. kd> g
  2. Breakpoint 0 hit
  3. nt!DbgkpSetProcessDebugObject+0x5c:
  4. 8063a8b2 7573            jne     nt!DbgkpSetProcessDebugObject+0xd1 (8063a927)

第一个函数:DbgkpSetProcessDebugObject(注意edi+0BCh即debugport的位置,前面说了位置是0xbc),当调试器附加进程时设置DebugPort

[cpp] view plaincopy

  1. kd> # bch nt!DbgkpSetProcessDebugObject
  2. nt!DbgkpSetProcessDebugObject+0x56:
  3. 8063a8ac 399fbc000000    cmp     dword ptr [edi+0BCh],ebx

还有一处:

[cpp] view plaincopy

  1. kd> # bch
  2. nt!DbgkpSetProcessDebugObject+0x64:
  3. 8063a8ba 8987bc000000    mov     dword ptr [edi+0BCh],eax

第二个函数:DbgkpMarkProcessPeb (注意+0BCh即debugport的位置,前面说了位置是0xbc),当调试器附加进程时设置DebugPort

[cpp] view plaincopy

  1. kd> # bch nt!DbgkpMarkProcessPeb
  2. nt!DbgkpMarkProcessPeb+0x42:
  3. 80639862 39bebc000000    cmp     dword ptr [esi+0BCh],edi

第三个函数:DbgkCreateThread(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送线程或者进程创建的调试信息

[cpp] view plaincopy

  1. kd> # bch nt!DbgkCreateThread
  2. nt!DbgkCreateThread+0x125:
  3. 8063b0d7 399ebc000000    cmp     dword ptr [esi+0BCh],ebx

第四个函数:DbgkpQueueMessage(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息

[cpp] view plaincopy

  1. kd> # bch nt!DbgkpQueueMessage
  2. nt!DbgkpQueueMessage+0x7b:
  3. 80639b8d 8b80bc000000    mov     eax,dword ptr [eax+0BCh]

第五个函数:KiDispatchException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息

[cpp] view plaincopy

  1. kd> # bch nt!KiDispatchException
  2. nt!KiDispatchException+0x187:
  3. 804fdac5 39b8bc000000    cmp     dword ptr [eax+0BCh],edi

第六个函数:DbgkForwardException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息

[cpp] view plaincopy

  1. kd> # bch nt!KiDispatchException
  2. nt!KiDispatchException+0x187:
  3. 804fdac5 39b8bc000000    cmp     dword ptr [eax+0BCh],edi

第七个函数:PspExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc), 发送线程退出、进程退出的调试信息

[cpp] view plaincopy

  1. kd> # bch nt!PspExitThread
  2. nt!PspExitThread+0x286:
  3. 805c9554 399fbc000000    cmp     dword ptr [edi+0BCh],ebx

第八个函数:DbgkExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc), 发送线程退出、进程退出的调试信息

[cpp] view plaincopy

  1. kd> # bch nt!DbgkExitThread
  2. nt!DbgkExitThread+0x20:
  3. 8063b370 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]

第九个函数:PspCreateProcess(注意+0BCh即debugport的位置,前面说了位置是0xbc),进程创建,设置DebugPort

[cpp] view plaincopy

  1. kd> # bch nt!PspCreateProcess
  2. nt!PspCreateProcess+0x1a9:
  3. 805c7c35 8983bc000000    mov     dword ptr [ebx+0BCh],eax

统计了下:

函数如下:

PspCreateProcess、MmCreatePeb 进程创建,设置DebugPort
    DbgkCreateThread 发送线程或者进程创建的调试信息
    KiDispatchException、DbgkForwardException和DbgkpQueueMessage 发送异常调试信息
    PspExitThread、DbgkExitThread和DbgkExitProcess 发送线程退出、进程退出的调试信息
    DbgkMapViewOfSection和DbgkUnMapViewOfSection 发送映像装载卸载调试信息
    DbgkpSetProcessDebugObject和DbgkpMarkProcessPeb 当调试器附加进程时设置DebugPort

2.替换地址
           mov     ecx,dword ptr [ecx+0BCh] //0xBCh就是DebugPort的偏移
          我们可以把DebugPort转移到_EPROCESS的另外一个地方使用+0×070 CreateTime,它是纪录进程创建时间的,进程创建之后,在进程退出前系统不会对它进行任何修改,而且我们修改后对系统或进程没有任何影响。我们可以把上面的所有的代码改成这样
          mov     ecx,dword ptr [ecx+070h] //指向CreateTime,实际的DebugPort已经被移到这里
     只需要修改一个字节,非常简单

时间: 2024-08-04 10:11:52

ring0-更改dbgport地址偏移过掉dbgport清0的相关文章

利用指针地址偏移打印一维数组

// //  main.c //  利用指针地址偏移打印一维数组 // // Created by wanghy on 15/7/24. // Copyright (c) 2015年 wanghy. All rights reserved. // #include <stdio.h> #define len 10 int main(int argc, const char * argv[]){ //定义一个存放  int 类型元素的一维数组. int arry[]={1,2,3,4,5,6,7

memcpy用指针的实现通过判断地址是否重合解决掉字符串结束符(&#39;\0&#39;)问题

#include<stdlib.h> #include<stdio.h> #include<string.h> //memcpy的实现 int Mymem(char *dest, char *src, int size) { if (dest == NULL || src == NULL || size == 0) { return -1; } char *d = NULL; char *s = NULL; d = dest; s = src; //if ((unsig

使用DOS批处理更改IP地址

有时候电脑在家需要自动获取IP,在公司需要手动填写IP,改来改去很麻烦,于是做一个批处理一键修改很方便: @echo off cls color 0A @echo off echo. echo ===修改 [本地连接] ip地址=== echo. echo 1:自动获取 echo. echo 2:重通ip地址 echo. echo. set/p sel=请选择修改方式: if "%sel%"=="1" goto auto if "%sel%"==

程序基址与变量地址偏移初探

1.这个程序是我对程序基地址和偏移量的一个测试程序,先上代码,代码运行的主要任务是打印各种变量和函数的地址 1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<windows.h> 4 5 int number; 6 int mmpe; 7 int qq; 8 int qo = 100; 9 10 11 int add(int a, int b) 12 { 13 printf("%p\n", &am

手动修改注册表更改MAC地址

  先做个实验 1.准备工具  Win7 MAC Address Changer .Regshot   使用Win7 MAC Address Changer更改MAC地址之前先打开Regshot来检测注册表的变化, 建立修改之前的注册表快照 然后打开Win7 MAC Address Changer 选择要更改MAC地址的网卡,随机生成一个MAC地址然后点击"更改",然后禁用/启用网卡,最后刷新就可以看到MAC地址更改成功了 然后建立修改MAC地址之后的注册表快照 会弹出一个报告页,点击

更改INSM地址的操作

今天接到客户询问,如果更改服务器地址之后,会对客户造成什么影响,如果要更改,需要做些什么配置,所以,今天来说说更改NSM地址需要做的动作. 关于更改NSM地址的方法 1首先要确认是否为NSM定义过地址:a. 在服务器上打开文件夹.b. 找到<NSM文件夹> \ App \ bin下的  tms.bat文件.c. 用鼠标右键单击该文件,然后选择编辑.d. 确认没有为SNMP IP地址定义的IP地址.e. 搜索字符串:Dlumos.fixedManagerSNMPIPaddressf. 该字符串应

弄得我要疯掉的VC6.0

跟它抗争了四五天后,终于在今晚鬼使神差的把它弄好了-- 刚开始是不能建MFC工程,到后来连工程栏都不见了-- 也是自己迷糊,重复着一样的动作N多次,浪费了好多时间,还生了好多次气,最后才发现是WIN7的兼容性问题,所以以后遇到不顺的时候,最应该做的是控制好情绪,淡定得找到具体问题,百度解决方法-- 在解决不了的情况之下做点其他事情先放一放,不可以把时间一直耗下去,但是要迅速归来就是了 弄得我要疯掉的VC6.0,布布扣,bubuko.com

Wordpress更改后台地址

wordpress默认的后台地址是 xx/wp-admin  或xx/wp-login.php ,谁都知道感觉很不安全, 方法一:使用插件 通过插件在地址上加上只有你知道的参数才能访问 1.后台搜索插件Stealth Login Page进行安装 2.然后设置自定义登录地址的链接参数, 3.下次登录就要填多个值,如果输入错误就会重定向到http://localhost/w/ 4.不想要的话,把插件删除或停用防护自然消失 方法二:重命名登录页 找到wp-login.php 更改为自定义的文件名,为

Linux学习(一):linux更改ip地址命令_更改DNS_更改默认网关_更改子网掩码_主机名

如何使用命令来更改linux的IP .DNS .子网掩码,在虚拟机(vitrualBox)上添加一个Linux的虚拟机; 安装方法:http://pan.baidu.com/s/1sjJPhP7 安装完以后,进入到Linux桌面,是一个这样的桌面: 按CTRL+ALT+F2  进入命令行窗口,然后登录 ,在登录成功以后在命令下输入: vi /etc/sysconfig/network-scripts/ifcfg-ethx 就打开了设置窗口,默认哪果你只有一个网卡的话,就这样就可以,如果多个网卡那