找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6648|回复: 6

[经验贴]内核编程&内核原理学习

[复制链接]

2

主题

38

回帖

1

精华

铂金会员

积分
1395
发表于 2012-12-14 14:19:09 | 显示全部楼层 |阅读模式
本帖最后由 bboyiori 于 2012-12-14 14:35 编辑

  小弟,搞的东西比较杂,以前还搞过几天linux内核,但是都不精,现在仍在菜鸟阶段.看到论坛很多大牛发的帖子,都是有码,要水晶币,感觉这个对于我等菜菜进步帮助不大,所以想把这几天搞的东西发出来,大家技术交流下.

一.书籍+代码
   《windows内核情景分析》+《windows内核原理》
    WRK+win2000代码
   刚开始学建议不用深入,大概知道概念,相关的代码不用深究
  
学习方法:内核数据结构+算法是理解win内核的不二法则
    由于内核数据结构常用不常用有几十个,每个域与算法之间有紧密关系,所以大家学习的时候不必要细抠,每个数据结构的意义,只需要对整体把握,学习的深入了,自然会遇到相关的数据结构.例如进程ActiveProcessLinks链表,我的笔记如下:

  1. typedef struct _EPROCESS {
  2.         ... ...
  3.     HANDLE UniqueProcessId;
  4.     //
  5.     // Global list of all processes in the system. Processes are removed
  6.     // from this list in the object deletion routine.  References to
  7.     // processes in this list must be done with ObReferenceObjectSafe
  8.     // because of this.
  9.     //

  10.     LIST_ENTRY ActiveProcessLinks;
  11.     UCHAR ImageFileName[ 16 ];
  12.     ... ...
  13. } EPROCESS, *PEPROCESS;
  14. kd> dt nt!_EPROCESS
  15.    +0x000 Pcb              : _KPROCESS
  16.    +0x084 UniqueProcessId  : Ptr32 Void
  17.    +0x088 ActiveProcessLinks : _LIST_ENTRY  
  18.    +0x174 ImageFileName    : UChar                    //PsGetProcessImageFileName
复制代码
先把遇到的数据结构搞熟悉,其他的忽略

二.逆向+调试 必备技能
学内核windbg基本上要不离手,
在这里说下,我以前写了简单ARK功能方法:用windbg调试一遍,验证结果,然后把调试过程写成代码
例子如下,遍历ActiveProcessLinks链表:

  1. kd> !process  (在DriverEntry使用PsGetCurrentProcess(),进程是System)
  2. PROCESS 827b7830  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
  3. kd> da  827b7830+174
  4. 827b79a4  "System"
  5. kd> dt nt!_EPROCESS
  6.    +0x000 Pcb              : _KPROCESS
  7.    +0x084 UniqueProcessId  : Ptr32 Void
  8.    +0x088 ActiveProcessLinks : _LIST_ENTRY  
  9.    +0x174 ImageFileName    : UChar                    //PsGetProcessImageFileName
  10. (取下一个EPROCESS 地址)
  11. kd> ? poi(827b7830+88h)-88
  12. Evaluate expression: -2110435296 = 82355020
  13. (验证正确)
  14. kd> !object 8212dcf8
  15. Object: 8212dcf8  Type: (827b7e70) Process
  16.     ObjectHeader: 8212dce0 (old version)
  17.     HandleCount: 3  PointerCount: 167
  18. kd> da 8212dcf8+174
  19. 8212de6c  "csrss.exe"
复制代码
写代码就比较简单了,这里硬编码不太好,不过初学者可以先试试
  1. NTSTATUS
  2. DriverEntry(
  3.         IN PDRIVER_OBJECT                DriverObject,
  4.         IN PUNICODE_STRING                RegistryPath
  5.         )
  6. {
  7.         NTSTATUS                        status = STATUS_SUCCESS;   
  8.         PEPROCESS                        pCurrentEProc;
  9.         PEPROCESS                        pNextEProce;
  10.         PVOID                                lpAdress = NULL;
  11.         PVOID                                lpOldAddress = NULL;
  12.         int                                i = 0;

  13.         pCurrentEProc = PsGetCurrentProcess();
  14.         lpAdress = (PVOID)((ULONG)pCurrentEProc + 0x88);
  15.         lpOldAddress = lpAdress;

  16.         //3页表法
  17.         for(i = 0; i < 3 * PAGE_SIZE; i++)
  18.         {
  19.                 if(!strncmp("System", (PCHAR)pCurrentEProc+i, strlen("System")))
  20.                 {
  21.                         break;
  22.                 }               
  23.         }
  24.         KdPrint(("offset %0x\n",  i));

  25.         do
  26.         {
  27.                 GetProcessInfo(lpOldAddress);
  28.                 lpOldAddress = *(PVOID*)lpOldAddress;
  29.         } while ( lpAdress != lpOldAddress);

  30.         DriverObject->DriverUnload = EprocessUnload;
  31.         return status;
  32. }
  33. VOID GetProcessInfo(PVOID lpAddress)
  34. {
  35.         PVOID lpEprocess =(PVOID)((ULONG)lpAddress - 0x88);
  36.         KdPrint(("FileImageName: %s\n", (char *)((ULONG)lpEprocess + 0x174 )));
  37.         KdPrint(("DirectoryTableBase: %p\n", *(PVOID *)((ULONG)lpEprocess +0x18)));
  38. }
复制代码
比较初级,大家见笑了

评分

参与人数 2水晶币 +120 收起 理由
Tesla.Angela + 100 很给力!
马大哈 + 20 赞一个!

查看全部评分

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-12-14 17:18:41 | 显示全部楼层
以前学习玩SSDT HOOK时,也全是硬编码,判断一下系统版本再分支使用,哈哈.

支持!
我就是嗷嗷叫的老马了......

2

主题

38

回帖

1

精华

铂金会员

积分
1395
 楼主| 发表于 2012-12-15 18:15:34 | 显示全部楼层
马大哈 发表于 2012-12-14 17:18
以前学习玩SSDT HOOK时,也全是硬编码,判断一下系统版本再分支使用,哈哈.

支持! ...

搞内核开发如果做产品最重要的是兼容性,很考验耐心
硬编码或者简单inlinehook,做做坏事,搞搞灰色产业比较合适

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-12-17 11:47:37 | 显示全部楼层
bboyiori 发表于 2012-12-15 18:15
搞内核开发如果做产品最重要的是兼容性,很考验耐心
硬编码或者简单inlinehook,做做坏事,搞搞灰色产业 ...

我主要是搞工控的东西,唯一用过一次SSDT HOOK是拦截别人程序中串口里的指令,目的是将多余的指令去除,因为硬件改动了,有些动作不需要了,但是改软件的话要太多钱,哈哈.
我就是嗷嗷叫的老马了......

1

主题

60

回帖

0

精华

铜牌会员

积分
122
发表于 2013-1-3 12:31:11 | 显示全部楼层
不错的学习经验

1

主题

60

回帖

0

精华

铜牌会员

积分
122
发表于 2013-1-11 09:47:55 | 显示全部楼层
这两本书都好贵。。买了破产了

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-8 15:17:27 | 显示全部楼层
學學!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表