首页
社区
课程
招聘
本地找驱动hook方法
发表于: 2014-9-15 17:38 4661

本地找驱动hook方法

2014-9-15 17:38
4661
不良驱动起动前
ULONG p_uch[0xFFFFF]={0};//保存原e9指令RvA数组
ULONG p_uchNum=0;//原e9指令数目
PUCHAR p=(PUCHAR)g_nowImage;//当前内核指针,xp就是804d8000
PageProtectOff();//去掉页面保护
         for(ULONG u=0;u<g_size;u++)//g_size是内核大小
         {
            if(MmIsAddressValid(p))//看一下这个地址是否有效,这个一定要,不然蓝屏
             {
                  if(*p==0xE9)//如果是e9指令就是jmp
                   {
                         p_uch[p_uchNum]=u;//RVA保存就是偏移保存
                         p_uchNum+=1;
                   }
             }
             p+=1;//下一个地址
         }
PageProtectOn();//恢复页面保护
KdPrint(("e9Num:%x,%x",p_uchNum,(ULONG)p_uch));//打印e9RVA数目

不良驱动起动后
PUCHAR p=(PUCHAR)g_nowImage;//当前内核指针804d8000
PageProtectOff();//关闭保护
for(ULONG u=0;u<g_size;u++)//g_size是内核大小
{
     if(MmIsAddressValid(p))//检查内存是否有效
     {
         if(*p==0xE9)//如果=于e9 jmp
         {
             bool ishave=false;
            for(ULONG i=0;i<p_uchNum;i++)//遍历上前面保存的e9RVA数组
           {
                if(u==p_uch[i])//如果数组里有,
                {
                        ishave=true;break;//isHave为true,不打印
                }
           }
          if(ishave==false)//如果上面数组没有
          {
            KdPrint(("警告:%x",(ULONG)p));//打印这个可能给hook的地址
          }
                                         
        }
                                         
      }
p+=1;//下个地址
}
PageProtectOn();//恢复保护

//运行结果会有一些垃圾地址出现,可能是exe运行时内核会临时申请一些内存,又很快释放掉
不会很多,
但hook的jmp地址也同时打印出来,随便找个内核反汇编,就能看到他hook的代码,连虚拟机都不用就轻松找到了
也可以找一些你已知道的特征码,不良驱动防住了虚拟机,不会连实体机都不让运行吗呵呵

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2153
活跃值: (740)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
垃圾地址是由于部分指令或其操作数中含有E9这个字节
并不是你说的什么临时内存,别忘了你是搜索的镜像内存
而你是单纯以字节来搜寻,并没有使用反汇编引擎
另外,可以缩小范围提升速度,比如只搜索代码段
还有,现在慢慢过渡到x64系统了,内核inline hook也就是娱乐娱乐
2014-9-15 17:56
0
游客
登录 | 注册 方可回帖
返回
//