zoukankan      html  css  js  c++  java
  • PEB windbg笔记

    windbg 调试进程。 

    0:001> dg @fs
    P Si Gr Pr Lo
    Sel Base Limit Type l ze an es ng Flags
    ---- -------- -------- ---------- - -- -- -- -- --------
    0038 7ffde000 00000fff Data RW Ac 3 Bg By P Nl 000004f3     <--------------7ffde000
    
    0:001> r $teb
    $teb=7ffde000    <--------------

    fs:[0x30] 就是 PEB结构的指针.

    继续分析怎么得出 0x30是peb的。

    0:001> dt ntdll!*teb*   <----------------------------dt查看结构    使用通配符查处TEB结构的名称
    ntdll!_TEB
    ntdll!_GDI_TEB_BATCH
    ntdll!_TEB_ACTIVE_FRAME
    ntdll!_TEB_ACTIVE_FRAME_CONTEXT
    ntdll!_TEB_ACTIVE_FRAME_CONTEXT
    
    0:001> dt -r -v ntdll!_TEB  <-------------------------  -r -v 不清楚怎么解释 反正就这样用吧。获取信息更多。
    struct _TEB, 66 elements, 0xfb8 bytes
    +0x000 NtTib : struct _NT_TIB, 8 elements, 0x1c bytes <-------------_NT_TIB结构 
    +0x018 Self : Ptr32 to struct _NT_TIB, 8 elements, 0x1c bytes <-------------注意这里 结构是 _NT_TIB 
    +0x02c ThreadLocalStoragePointer : Ptr32 to Void
    +0x030 ProcessEnvironmentBlock : Ptr32 to struct _PEB, 65 elements, 0x210 bytes <--------------可以看见0x30 是 PEB结构。

    0x18是_NT_TIB结构 也就是指向自身的 0x0。可以使用命令查看一下。

     struct _TEB, 66 elements, 0xfb8 bytes 是 teb结构的第一个。

    0:001> r $teb
    $teb=7ffde000 <--------地址也就是 +0x000 NtTib
    
    0:001> dd $teb+0x18
    7ffde018 7ffde000 00000000 00001e18 00001990  <-------------------这里也就是7ffde000

    结合上面来个查询 除了 

    _asm

    {

    mov eax,fs:[0x30];

    }

    还可以这样写

    {

    mov eax,fs:[0x18];

    mov eax,[eax+0x30];

    }

    这样就算得出了 PEB 的结构指针了 。

    0:001> !teb
    TEB at 7ffde000
    ExceptionList: 00ffffe4
    StackBase: 01000000
    StackLimit: 00fff000
    SubSystemTib: 00000000
    FiberData: 00001e00
    ArbitraryUserPointer: 00000000
    Self: 7ffde000
    EnvironmentPointer: 00000000
    ClientId: 00001e18 . 00001990
    RpcHandle: 00000000
    Tls Storage: 00000000
    PEB Address: 7ffd3000

    查看下PEB的结构。

    0:001> dt -v -r ntdll!_PEB
    struct _PEB, 65 elements, 0x210 bytes
    +0x000 InheritedAddressSpace : UChar
    +0x001 ReadImageFileExecOptions : UChar
    +0x002 BeingDebugged : UChar
    +0x003 SpareBool : UChar
    +0x004 Mutant : Ptr32 to Void
    +0x008 ImageBaseAddress : Ptr32 to Void
    +0x00c Ldr : Ptr32 to struct _PEB_LDR_DATA, 7 elements, 0x28 bytes <--------------通过_PEB的Ldr成员获取_PEB_LDR_DATA结构

    得到_PEB_LDR_DATA后查看下 结构 。

    0:001> dt ntdll!_PEB_LDR_DATA
    +0x000 Length : Uint4B
    +0x004 Initialized : UChar
    +0x008 SsHandle : Ptr32 Void
    +0x00c InLoadOrderModuleList : _LIST_ENTRY<------------再通过 _PEB_LDR_DATA结构的成员 InMemoryOrderModuleList获得_LIST_ENTRY
    +0x014 InMemoryOrderModuleList : _LIST_ENTRY
    +0x01c InInitializationOrderModuleList : _LIST_ENTRY 
    +0x024 EntryInProgress : Ptr32 Void

    得到_LIST_ENTRY后再查看下他 

    0:001> dt -v ntdll!_LIST_ENTRY
    struct _LIST_ENTRY, 2 elements, 0x8 bytes
    +0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes <--------------通过_LIST_ENTRY的Flink成员得到什么呢???
    +0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes

    知道了怎么得到peb地址 和 ldr偏移之类的 对比上面的分析进程看看。

    0:001> dd $peb+C l1 <--------------通过_PEB的Ldr(Ldr偏移:0xC)成员获取_PEB_LDR_DATA结构
    7ffd300c 00251e90
    0:001> dt ntdll!_PEB_LDR_DATA 00251e90  <--------------查看 地址00251e90为_PEB_LDR_DATA的结构。
    +0x000 Length : 0x28
    +0x004 Initialized : 0x1 ''
    +0x008 SsHandle : (null) 
    +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x251ec0 - 0x254b90 ]
    +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x251ec8 - 0x254b98 ]
    +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x251f28 - 0x254ba0 ]
    +0x024 EntryInProgress : (null)
    0:001> dt ntdll!_LIST_ENTRY 00251e90+C 《--------------再用 _PEB_LDR_DATA(00251e90) 就是得到 InLoadOrderModuleList(偏移:0xC)成员的Flink的_LIST_ENTRY结构地址 
    [ 0x251ec0 - 0x254b90 ] 
    +0x000 Flink : 0x00251ec0 _LIST_ENTRY [ 0x251f18 - 0x251e9c ]
    +0x004 Blink : 0x00254b90 _LIST_ENTRY [ 0x251e9c - 0x254af0 ]
    0:001> dt ntdll!_LIST_ENTRY 00252068
    [ 0x252108 - 0x251fc0 ]
    +0x000 Flink : 0x00252108 _LIST_ENTRY [ 0x2521a8 - 0x252068 ]
    +0x004 Blink : 0x00251fc0 _LIST_ENTRY [ 0x252068 - 0x251f18 ]
    0:001> dt ntdll!_LIST_ENTRY 00252108
    [ 0x2521a8 - 0x252068 ]
    +0x000 Flink : 0x002521a8 _LIST_ENTRY [ 0x2522f0 - 0x252108 ]
    +0x004 Blink : 0x00252068 _LIST_ENTRY [ 0x252108 - 0x251fc0 ]
    0:001> dt ntdll!_LIST_ENTRY 002521a8
    [ 0x2522f0 - 0x252108 ]
    +0x000 Flink : 0x002522f0 _LIST_ENTRY [ 0x252390 - 0x2521a8 ]
    +0x004 Blink : 0x00252108 _LIST_ENTRY [ 0x2521a8 - 0x252068 ]
    0:001> dt ntdll!_LIST_ENTRY 002522f0
    [ 0x252390 - 0x2521a8 ]
    +0x000 Flink : 0x00252390 _LIST_ENTRY [ 0x252430 - 0x2522f0 ]
    +0x004 Blink : 0x002521a8 _LIST_ENTRY [ 0x2522f0 - 0x252108 ]

     仔细看 貌似就是 什么双向链表之类的~ 

    为毛之能看见了表? 网上说的Flink成员是_LDR_DATA_TABLE_ENTRY结构 在WINDBG 里面应该怎么看呢?

  • 相关阅读:
    iaure学习网站
    linux下环境搭建比较
    微信分享jsdk接口
    微信接口开发遇到的问题
    Centos7.6部署k8s(v1.14.2)集群
    k8s简介
    nginx配置ssl证书
    kafka zookeeper介绍
    mysql数据库的备份与还原
    centos7 部署jumpserver
  • 原文地址:https://www.cnblogs.com/yueyue184/p/2802417.html
Copyright © 2011-2022 走看看