zoukankan      html  css  js  c++  java
  • SSDT笔记。(System Services Descriptor Table)

    本人只是业余爱好,勿喷,有兴趣的看。懂的也就没必要看了。

    希望能结交更多的朋友,不论技术如何,在下都愿意一起分享学习。

    肯定有错的地方,希望大家指出,下面只是概念性东西。希望能给和我一样菜的朋友看下。看书上或者资料介绍的很繁琐感觉,我这算大白话吧。因为业余也没想系统学习,所以朋友给我科普了下,在这里谢谢下他。

    说了这么多废话看笔记吧。

    r0的inline hook 其实理论上和 r3的 我感觉差不多。(自己的看法)

    OpenProcess(kernel32.dll)->NtOpenProcess(ntdll.dll)->NtOpenProcess(ssdt kernel api address)->real NtOpenProcess Address

    首先是SSDT的结构

     typedef struct _SYSTEM_SERVICE_TABLE
    
      {
    
      PVOID ServiceTableBase; //这个指向系统服务函数地址表
    
      PULONG ServiceCounterTableBase;
    
      ULONG NumberOfService; //服务函数的个数
    
      ULONG ParamTableBase;//参数表 
    
      }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;

    这里使用OpenProcess做例子。

    OD调试 Ctrl+G 直接跳到 OpenProcess。

    7C830A2C FF15 1C11807C CALL DWORD PTR DS:[<&ntdll.NtOpenProcess>] ; ntdll.ZwOpenProcess

     回车进入

    7C92D5FE > B8 7A000000 MOV EAX,7A
    7C92D603 BA 0003FE7F MOV EDX,7FFE0300
    7C92D608 FF12 CALL DWORD PTR DS:[EDX]

    第一条。7A是ZwOpenProcess在 SSDT表里面的索引号。  SSDT 一共有 11c H个服务函数。(0-283)

    咱们用工具看下。

    没错吧?知道了索引号 然后使用Windbg。

    Open- Kernel debug- local 挂上本机。

    在命令行输入 dd nt!KeServiceDescriptorTable

    lkd> dd nt!KeServiceDescriptorTable
    8055d700  80505494 00000000 0000011c 80505908
    8055d710  00000000 00000000 00000000 00000000
    8055d720  00000000 00000000 00000000 00000000
    8055d730  00000000 00000000 00000000 00000000
    8055d740  00000002 00002710 bf80c321 00000000
    8055d750  b9598a80 b8f0db60 8a514538 806f80c0
    8055d760  00000000 00000000 ffeced30 ffffffff
    8055d770  02299df0 01cd34b1 00000000 00000000

    80505494 00000000 0000011c 80505908 找四个值就是 SSDT结构的值了。

    ServiceTableBase==80505494 

    NumberOfService==11c

    ParamTableBase==80505908

    7A是NtOpenProcess的索引号。80505494是指针,指向函数表的地址.

    然后使用dd 80505494+0x7a*4 (*4 是因为 表里面的地址存放是 11cH个dword)

    lkd> dd 80505494+0x7a*4
    8050567c  805cc456 805eef26 805eeb8a 805ab3f4
    8050568c  80616046 805c4be8 805cc6e2 805eef44
    8050569c  805eecfa 80617f80 80646c0e 805ca508
    805056ac  805f930a 805f4f30 805f511c 805b9426
    805056bc  80610004 80577ef4 80617e50 80617e50
    805056cc  80540c2e 80611bf6 80612856 8057ae82
    805056dc  805bf65a 8057b1d0 806100cc 80578048
    805056ec  806170ca 8057ba3c 805d6cbc 805a63ec

    805cc456就是ZwOpenProcess 入口地址了。

    lkd> u 805cc456 
    nt!NtOpenProcess:
    805cc456 68c4000000      push    0C4h
    805cc45b 68c0b44d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
    805cc460 e88b07f7ff      call    nt!wctomb+0x45 (8053cbf0)
    805cc465 33f6            xor     esi,esi
    805cc467 8975d4          mov     dword ptr [ebp-2Ch],esi
    805cc46a 33c0            xor     eax,eax
    805cc46c 8d7dd8          lea     edi,[ebp-28h]
    805cc46f ab              stos    dword ptr es:[edi]

    如果需要inline hook这里5字节就可以了。

    805cc456 68c4000000      push    0C4h
  • 相关阅读:
    个人网站上线
    从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
    Triangle
    Hard problem
    [置顶] Android AlarmManager实现不间断轮询服务
    Python学习入门基础教程(learning Python)--5.1 Python下文件处理基本过程
    编程之美 裴波那楔数列
    130712周赛(CF)
    Python学习入门基础教程(learning Python)--5.2 Python读文件基础
    phantomjs
  • 原文地址:https://www.cnblogs.com/yueyue184/p/2508568.html
Copyright © 2011-2022 走看看