不良驱动起动前
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的代码,连虚拟机都不用就轻松找到了
也可以找一些你已知道的特征码,不良驱动防住了虚拟机,不会连实体机都不让运行吗呵呵
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!