首页
社区
课程
招聘
[旧帖] [求助]菜鸟我刚学驱动编程,今日学用hOOK出了点问题,来看看吧 0.00雪花
发表于: 2014-4-30 20:34 2562

[旧帖] [求助]菜鸟我刚学驱动编程,今日学用hOOK出了点问题,来看看吧 0.00雪花

2014-4-30 20:34
2562
代码编译通过,但没有完美运行呢,也不蓝屏,希望大家能给我找出一下问题,
先上几个图
我是HOOK的NtOpenProcess这个函数,首先通过ssdt表获得NtOpenProcess函数入口地址,然后偏移22的位置开始HOOK,具体看图
但加载驱动后,能执行,但感觉有点小问题,比如我关了xuetr,再次打开时会提示这样:
还有就是比如打开任务管理器
http://www.mengwuji.net/data/attachment/forum/201404/30/122953gb4re001mzvvoy1j.png
界面的边框,都变了,希望大大们能把我找一下错误啊,或者是不是这里不能HOOK啊
代码是这样的:




#include "ntddk.h"


#pragma pack(1)
typedef struct ServiceDescriptorEntry {
  unsigned int *ServiceTableBase;
  unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
  unsigned int NumberOfServices;
  unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

_declspec(dllimport)ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

//global
ULONG g_OpenProcess;
ULONG g_OpenProcess_jmp;
ULONG g_OpenProcess_tem;
ULONG g_adress;
UCHAR g_cmd[5];
ULONG g_f_code[5];

void PageProtectOn()
{
  __asm{//恢复内存保护  
    mov  eax,cr0
      or   eax,10000h
      mov  cr0,eax
      sti
  }
}

void PageProtectOff()
{
  __asm{//去掉内存保护
    cli
      mov  eax,cr0
      and  eax,not 10000h
      mov  cr0,eax
  }
}

void _stdcall Fifter()
{
  KdPrint(("%s",(char*)PsGetCurrentProcess()+0x16c));
}
_declspec(naked)
NTSTATUS NewNtOpenProcess()
{
  __asm{
    add esp,4
    pushad
    pushfd
    call Fifter
    popfd
    popad
    mov edx,dword ptr[ebp + 10]
    mov byte ptr[ebp - 4],al
    jmp g_OpenProcess_jmp    
  }
}
NTSTATUS HookNtOpenProcess()
{
  g_OpenProcess = KeServiceDescriptorTable.ServiceTableBase[190];
  g_OpenProcess_jmp = g_OpenProcess + 22 + 6;
  KdPrint(("%X",g_OpenProcess_jmp));
  g_adress = (ULONG)NewNtOpenProcess - g_OpenProcess - 22 - 5;
  g_cmd[0] =0xE8;
  *(ULONG*)&g_cmd[1] = g_adress;
  PageProtectOff();
  RtlCopyMemory(g_f_code,(PVOID)(g_OpenProcess+22),5);
  RtlCopyMemory((PVOID)(g_OpenProcess+22),g_cmd,5);
  PageProtectOn();
  
  return STATUS_SUCCESS;
}

VOID UnloadOpenProcess()
{
  PageProtectOff();

  RtlCopyMemory((PVOID)(g_OpenProcess+22),g_f_code,5);
  PageProtectOn();

}
void MyUnloadDriver(PDRIVER_OBJECT pDriverObject)
{
  UnloadOpenProcess();
  //
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRger)
{
  HookNtOpenProcess();
  pDriverObject->DriverUnload = MyUnloadDriver;
  return STATUS_SUCCESS;
}



菜鸟我,先在这里谢谢各位前辈们了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
2
没人吗,自己顶一下,
2014-4-30 20:40
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
围观一哈咯
2014-5-4 10:34
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
g_OpenProcess_jmp = g_OpenProcess + 22 + 6;

你Hook竟然直接硬编码要Hook的位置,佩服...
不出莫名其妙的问题才怪!
2014-5-5 11:56
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
5
你的意思是特征码寻找,然后给HOOK掉,但我是本机测试啊,就算是硬编码也不会怎么啊
2014-5-5 12:10
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
6
你的意思是特征码寻找,然后给HOOK掉,但我是本机测试啊,就算是硬编码也不会怎么啊
2014-5-5 12:14
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
add esp,4
    pushad
    pushfd
    call Fifter
    popfd
    popad
--------------------------------------------
很好奇这个 add esp,4
2014-5-7 09:49
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
8
我想,外面的第一次call,以后,会把下一个地址压进栈,然后就影响了之前的,所以我把那个地址给pop出来。
2014-5-7 12:13
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
好吧。我其实上午没怎么看明白
2014-5-7 14:31
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
10
但是就是不知道怎么回事,感觉会影响渲染,不知道怎么回事啊,哎
2014-5-7 18:19
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
1、你这是OpenProcess的inlinehook,为啥不直接hook ssdt.inline hook有点小“bug”。
2、你这inline hook 好像不是选的5个字节hook的。hook后你看下汇编对不?
3、本人也菜,只能看出这些了
2014-5-9 17:15
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
既然是e8(call),后面用jmp,不如直接ret,也不用add esp,4
copy 5 个字节,不如6个,替换完整的命令,否则留下一个字节,就全乱了
2014-5-10 00:23
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
13
不会乱,因为我跳都是跳到下一个字节的下一个字节,也就是是跳过了6个字节,而且,我恢复后,代码一样啊
2014-5-10 02:41
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
14
我想说的是,其实我只是学习一下inline hook是怎么弄的,所以才会这样。感觉hook ntopenprocess这个函数,会出现一些问题
2014-5-10 02:44
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我也不知道
2014-5-10 07:28
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
16
好吧,谢谢了
2014-5-10 10:18
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶顶顶一下
2014-5-10 14:05
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
18
非常感谢啊
2014-5-10 14:18
0
游客
登录 | 注册 方可回帖
返回
//