首页
社区
课程
招聘
[原创]重载内核之一重载镜像
发表于: 2014-5-16 01:37 24562

[原创]重载内核之一重载镜像

2014-5-16 01:37
24562

 重载内核的相关文章实在是太多了,鉴于还是有很多初学者研究这一块,本文仅作为一个引导作用,文笔不好,见谅。
  我的博客:http://blog.csdn.net/sidyhe
  开发环境:VS2010 + WinDDK
  测试环境:VirtualDDK + VMware + Win7 sp1 x86
  第一部分链接:http://bbs.pediy.com/showthread.php?t=187863
  第二部分链接:http://bbs.pediy.com/showthread.php?t=187919
  第三部分链接:http://bbs.pediy.com/showthread.php?t=187982
  第四部分链接:http://bbs.pediy.com/showthread.php?t=188012
  第五部分链接:http://bbs.pediy.com/showthread.php?t=188050
  第六部分链接:http://bbs.pediy.com/showthread.php?t=188092
PLDR_DATA_TABLE_ENTRY PsLoadedModuleList = NULL;

VOID InitializePsLoadedModuleList(PDRIVER_OBJECT lpDriverObject)
{
  PLDR_DATA_TABLE_ENTRY ldr = (PLDR_DATA_TABLE_ENTRY)lpDriverObject->DriverSection;

  PsLoadedModuleList = (PLDR_DATA_TABLE_ENTRY)ldr->InLoadOrderLinks.Flink;
  return;
}
PVOID ReloadNtModule(PLDR_DATA_TABLE_ENTRY PsLoadedModuleList)
{
  PVOID lpImageAddress = NULL;
  PLDR_DATA_TABLE_ENTRY NtLdr = (PLDR_DATA_TABLE_ENTRY)PsLoadedModuleList->InLoadOrderLinks.Flink;
  PVOID lpFileBuffer;

  DbgPrint("Nt Module File is %wZ\n", &NtLdr->FullDllName);
  if (lpFileBuffer = KeGetFileBuffer(&NtLdr->FullDllName))
  {
    PIMAGE_DOS_HEADER lpDosHeader = (PIMAGE_DOS_HEADER)lpFileBuffer;
    PIMAGE_NT_HEADERS lpNtHeader = (PIMAGE_NT_HEADERS)((PCHAR)lpDosHeader + lpDosHeader->e_lfanew);

    if (lpImageAddress = ExAllocatePool(NonPagedPool, lpNtHeader->OptionalHeader.SizeOfImage))
    {
      PUCHAR lpImageBytes = (PUCHAR)lpImageAddress;
      IMAGE_SECTION_HEADER *lpSection = IMAGE_FIRST_SECTION(lpNtHeader);
      ULONG i;

      RtlZeroMemory(lpImageAddress, lpNtHeader->OptionalHeader.SizeOfImage);
      RtlCopyMemory(lpImageBytes, lpFileBuffer, lpNtHeader->OptionalHeader.SizeOfHeaders);
      for (i = 0; i < lpNtHeader->FileHeader.NumberOfSections; i++)
      {
        RtlCopyMemory(lpImageBytes + lpSection[i].VirtualAddress, (PCHAR)lpFileBuffer + lpSection[i].PointerToRawData, lpSection[i].SizeOfRawData);
      }
      //代码不完整,后续补充
    }
    ExFreePool(lpFileBuffer);
  }
  if (lpImageAddress) DbgPrint("ImageAddress:0x%p\n", lpImageAddress);
  return lpImageAddress;
}

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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (22)
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢楼主分享。睡觉~~~
2014-5-16 01:58
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
收藏,百分百用得到。楼主好活
2014-5-16 09:13
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
标记一下
2014-5-16 09:48
0
雪    币: 129
活跃值: (2768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark一下啊  楼主好人
2014-5-16 10:24
0
雪    币: 7885
活跃值: (2285)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看源码,推敲学习。
2014-5-17 12:25
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
good job~
2014-5-17 12:41
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
8
总结的不错...
2014-5-17 12:51
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark
2014-5-19 11:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jmp
10
mark
2014-5-19 22:54
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
11
mark  job
2014-5-19 22:55
0
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
12
将你所有系列当成一个“酷帖”来设置。

感谢你的分享!
2014-5-31 22:07
0
雪    币: 104
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
写得简洁易懂,赞一个!
2015-4-7 09:27
0
雪    币: 112
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
第一个参数PDRIVER_OBJECT的PDRIVER_EXTENSION成员其实就是一个LDR_DATA_TABLE_ENTRY指针(参考WRK),这个与PsLoadedModuleList的类型是一致的

楼主笔误了,DriverSection
2016-3-29 19:56
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
感谢分享!
2017-7-9 19:37
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
16
请问楼主  KeGetModuleHandle这个函数是你自己定义的还是ntddk的啊    为什么我这边显示找不到这个函数呢
2017-12-13 00:55
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
一二三六 请问楼主 KeGetModuleHandle这个函数是你自己定义的还是ntddk的啊 为什么我这边显示找不到这个函数呢
自己定义的,  就是遍历PsLoadedModuleList来确定模块的加载地址.
2017-12-14 01:20
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark
2017-12-14 08:05
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
19
sidyhe 自己定义的, 就是遍历PsLoadedModuleList来确定模块的加载地址.
你的代码是复制的原始内核的内存如果原内核有SSDT  HOOK  你不就一并复制过来了吗
2017-12-30 18:43
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
20
一二三六 你的代码是复制的原始内核的内存如果原内核有SSDT HOOK 你不就一并复制过来了吗
不止SSDT  HOOK,还有设备堆栈呢?还有IDT呢?还有错误处理函数呢?内核中驱动程序注册的东西,你全部都得复制过来!重载内核不只需要重载重定位表那么简单的!
2017-12-30 19:47
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
21
czcqq 不止SSDT HOOK,还有设备堆栈呢?还有IDT呢?还有错误处理函数呢?内核中驱动程序注册的东西,你全部都得复制过来!重载内核不只需要重载重定位表那么简单的!
我能记得的重要结构有:SSDT  ,IDT,设备堆栈,各种回掉堆栈,还有线程分配的三个链表(我忘了名字了),还有内核申请的各种内存的指针,分页内存池,非分页内存池,DPC回掉链表,APC回掉链表,线程堆栈,进程句柄表,内存映射表等,你都要复制到你的新内核,你把复制内核想太简单了,内核的模块的重写加载,我时做过的!我举一个例子:比如ZwCreateFile函数,这个函数的调用流程是ZwCreateFile->NtCreateFile->IoCreateFile->ObCreateObject->取得设备堆栈顶部的设备->创建IRP,初始化IRP调用堆栈->调用IoCallDriver来查询设备堆栈,查找下一层设备然后调用->调用完成之后通知完成函数->完成函数中设置一个标志,然后正式返回->按调用流程依次返回,你可以看到这个过程调用了多少的指针(几乎全是动态申请的指针),你的新内核,得全部复制这些东西!你的这个实现有点简单了,仅仅修复IAT,和重定位而已!内核数据结构,你一个也没有复制啊
2017-12-30 20:17
1
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
标记一下
2018-1-23 12:31
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
感谢分享!
2019-7-23 10:38
0
游客
登录 | 注册 方可回帖
返回
//