首页
社区
课程
招聘
[分享]新手初学内核 做笔记
发表于: 2014-5-10 19:29 11805

[分享]新手初学内核 做笔记

2014-5-10 19:29
11805

小弟从上周开始发奋学习内核知识,书到了,电脑也到了,再也没有理由偷懒了,终于决定学习。
这几天学习学到了不少知识,看了好久的书,翻阅了看雪很多帖子。
先后学习了 SSDT HOOK 、InlineHook ,为了记录一下自己的学习,也为以后查阅,所以写一篇记录文章。
第一例:SSDT HOOK  NtOpenProcess 保护calc.exe 程序

typedef struct _KSERVICE_TABLE_DESCRIPTORSTRUCT
{
  PULONG  ServiceTableBase;                               // SSDT (System Service Dispatch Table)的基地址
  PULONG  ServiceCounterTableBase;                        // 用于 checked builds, 包含 SSDT 中每个服务被调用的次数
  ULONG   NumberOfService;                                // 服务函数的个数, NumberOfService * 4 就是整个地址表的大小
  ULONG   ParamTableBase;                                 // SSPT(System Service Parameter Table)的基地址
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;

ULONG OldNtOpenProcessAddr;

extern "C" PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable;

typedef NTSTATUS (__stdcall *NewNtOpenProcess)(
  __out PHANDLE ProcessHandle,
  __in ACCESS_MASK DesiredAccess,
  __in POBJECT_ATTRIBUTES ObjectAttributes,
  __in_opt PCLIENT_ID ClientId
  );

NewNtOpenProcess _NewNtOpenProcess;
extern "C" NTSTATUS
  PsLookupProcessByProcessId(
  __in HANDLE ProcessId,
  __deref_out PEPROCESS *Process
  );

extern "C" UCHAR *
  PsGetProcessImageFileName(
  __in PEPROCESS Process
  );
/**************************SSDT HOOK NtOpenProcess Start***********************/
NTSTATUS
  MyNtOpenProcess (
  __out PHANDLE ProcessHandle,
  __in ACCESS_MASK DesiredAccess,
  __in POBJECT_ATTRIBUTES ObjectAttributes,
  __in_opt PCLIENT_ID ClientId
  )
{
  PEPROCESS _eprocess;
  NTSTATUS _ntReturn;
  _ntReturn=_NewNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
  if(NT_SUCCESS(_ntReturn))
  {
    _ntReturn=PsLookupProcessByProcessId(ClientId->UniqueProcess,&_eprocess);
    if(NT_SUCCESS(_ntReturn))
    {

      char *ProcessName=(char *)PsGetProcessImageFileName(_eprocess);
      if(MmIsAddressValid(ProcessName))
      {
        DbgPrint("%s",ProcessName);
        if(!strcmp(ProcessName,"calc.exe"))
        {
          _ntReturn=STATUS_ACCESS_DENIED;
        }
      }
    }
    ObDereferenceObject(_eprocess);
  }
  return _ntReturn;
}

void HookNtOpenProcess()
{
  OldNtOpenProcessAddr=GetSSDTStartAddr(122);
  _NewNtOpenProcess=(NewNtOpenProcess)OldNtOpenProcessAddr;
  POFF();
  KeServiceDescriptorTable->ServiceTableBase[122]=(ULONG)MyNtOpenProcess;
  PON();

}

void UnHookNtOpenProcess()
{
  POFF();
  KeServiceDescriptorTable->ServiceTableBase[122]=OldNtOpenProcessAddr;
  PON();
}


/**************************SSDT HOOK NtOpenProcess End*************************/
/**************************SSDT InlineHook NtOpenProcess Start *************************/

BYTE  OldData[5]={0};
BYTE JmpData[5]={0xE9,0,0,0,0};
ULONG InLineHookOldAddress;
ULONG JmpRetAddr;
NewNtOpenProcess _InLineHookNewNtOpenProcess;
__declspec(naked) NTSTATUS InLineHookFun(...)
{
  _asm
  {
    push 0xc4
      jmp JmpRetAddr;
  }
}

NTSTATUS
  InlineHookNtOpenProcess (
  __out PHANDLE ProcessHandle,
  __in ACCESS_MASK DesiredAccess,
  __in POBJECT_ATTRIBUTES ObjectAttributes,
  __in_opt PCLIENT_ID ClientId
  )
{
  PEPROCESS _eprocess;
  NTSTATUS _ntReturn;
  _InLineHookNewNtOpenProcess=(NewNtOpenProcess)InLineHookFun;
  _ntReturn=_InLineHookNewNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
  if(NT_SUCCESS(_ntReturn))
  {
    _ntReturn=PsLookupProcessByProcessId(ClientId->UniqueProcess,&_eprocess);
    if(NT_SUCCESS(_ntReturn))
    {

      char *ProcessName=(char *)PsGetProcessImageFileName(_eprocess);
      if(MmIsAddressValid(ProcessName))
      {
        DbgPrint("%s",ProcessName);
        if(!strcmp(ProcessName,"calc.exe"))
        {
          _ntReturn=STATUS_ACCESS_DENIED;
        }
      }
    }
    ObDereferenceObject(_eprocess);
  }
  return _ntReturn;
}

void InLineHookNtOpenProcess()
{
  InLineHookOldAddress=GetSSDTStartAddr(122);
  JmpRetAddr=InLineHookOldAddress+5;
  RtlCopyMemory(OldData,(VOID *)InLineHookOldAddress,5);
  *(PULONG)(&JmpData[1])=(ULONG)InlineHookNtOpenProcess-InLineHookOldAddress-5;
  POFF();
  RtlCopyMemory((VOID *)InLineHookOldAddress,JmpData,5);
  PON();

}

void InLineUnHookNtOpenProcess()
{
  POFF();
  RtlCopyMemory((VOID *)InLineHookOldAddress,OldData,5);
  PON();
}

/**************************SSDT InlineHook NtOpenProcess End   *************************/

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

上传的附件:
收藏
免费 4
支持
分享
最新回复 (32)
雪    币: 2913
活跃值: (3944)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
嗯,笔记记得不错,一起加油
2014-5-10 19:32
0
雪    币: 7901
活跃值: (2300)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,继续发扬哈!
2014-5-10 21:02
0
雪    币: 2324
活跃值: (4958)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持下·!!!~
2014-5-10 21:13
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看样子基础不行!
char* p = 1000;
p+1 = 1001;
int* p = 1000;
p+1 = 1004;

int 指针加一,编译器会自己加4,一个int是4个字节,一般是4.
2014-5-10 21:13
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
嗯嗯,基础弱的很...知识没明白这块的意思。这次明白了
2014-5-10 21:24
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我就想问下你现在是什么基础,我也是刚开始进门,你买的什么书
2014-5-10 21:34
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
刚总结了一下还是对 FILE_BOTH_DIR_INFORMATION 不了解。接下来就死啃
2014-5-10 21:37
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
零基础
2014-5-11 16:24
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
恩   和楼主一起努力啊
2014-5-12 23:43
0
雪    币: 19
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
开始内核了?什么书看的?
2014-5-12 23:46
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
顶木瓜。。。什么书啊
2014-5-13 09:11
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
《Windows驱动开发技术详解 》这本
看的好心惊
2014-5-13 09:21
0
雪    币: 3725
活跃值: (624)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
这本书绝版了呃,都绝版好几年了.
不该绝版的好书,绝版了. 该绝版的烂书摆满了图书馆的书架. 误了多少子弟,花了多少冤枉钱.
2014-5-13 09:35
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
15
盗版书 买来多划算。
2014-5-13 09:36
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
16
楼主看了多久了??同学习啊
2014-5-13 12:40
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
17
上周开始的。正在努力码字
2014-5-13 13:34
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
棒!俺好像重新下载了一遍源码,嘿嘿
2014-5-13 17:30
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
19
代码都是在一起的。往里添加
2014-5-13 17:38
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持。。。。。
2014-5-13 18:09
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
21
这本书可以,然后学习下rootkit,写个ARK什么的,内核编程也就进门了
2014-5-13 18:12
0
雪    币: 3110
活跃值: (143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
打好C语言基础,学好win32 再来搞 就容易了
2014-5-14 00:26
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
23
楼主速度真快啊
2014-5-14 06:46
0
雪    币: 30
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
刚学就敢来晒代码,勇气可嘉!
2014-5-14 06:58
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
25
不要误会哦,标题就是笔记。没有晒的意思。为了以后自己翻看
2014-5-14 08:49
0
游客
登录 | 注册 方可回帖
返回
//