• FS寄存器到_TEB线程环境块


     

    从FS寄存器获取当前线程ID
    int GetThreadId()
    {
     int ithread = 0;
     _asm{
        xor esi , esi
        mov eax, fs:[esi+18h]     
           mov ecx, [eax+ 20h]
           mov eax, [eax+ 24h]
        mov dword ptr[ithread], eax
     }
     return ithread;
    }
    从FS寄存器获取当前进程ID
    int GetProcessId()
    {
     int iProcess = 0;
     _asm{
        xor esi , esi
        mov eax, fs:[esi+18h]
           mov ecx, [eax+ 20h]
           mov eax, [eax+ 24h]
        mov dword ptr[iProcess ], ecx
     }
     return iProcess ;
    }

    原理:
    1.fs:18h 地址指向线程环境块_TEB
    打开windbg可以证明:
    0:028> dd fs:18h L1
    0053:00000018  7eeb8000
    0:028> !teb
    TEB at 7eeb8000
        ExceptionList:        1f8ff15c
        StackBase:            1f900000
        StackLimit:           1f8fc000
        SubSystemTib:         00000000
        FiberData:            00001e00
        ArbitraryUserPointer: 00000000
        Self:                 7eeb8000
        EnvironmentPointer:   00000000
        ClientId:             00001a30 . 00001408
        RpcHandle:            00000000
        Tls Storage:          133d2718
        PEB Address:          7efde000
        LastErrorValue:       0
        LastStatusValue:      c0000302
        Count Owned Locks:    0
        HardErrorMode:        0

    2. 在_TEB中找到线程ID和进程ID
    0:028> dt ntdll!_TEB
       +0x000 NtTib            : _NT_TIB
       +0x01c EnvironmentPointer : Ptr32 Void
       +0x020 ClientId         : _CLIENT_ID

    0:028> dt ntdll!_CLIENT_ID
       +0x000 UniqueProcess    : Ptr32 Void  >进程ID
       +0x004 UniqueThread     : Ptr32 Void  >线程ID

    当然从TEB又可以找到_PEB的地址,从_PEB里面可以获取到更多的信息。暂且搁笔~~

  • 相关阅读:
    jdbc连接数据库报ORA-12519错误
    Open CV 七种常见阈值分割
    开博第一天
    UIWebView的使用---safri
    转义符
    UIKIT_EXTERN 的简单用法
    iOS 基础 --- tableView的使用(一)
    iOS基础 --- 如何监听一个控件(UITextField篇)
    objective-C和C --- 《位运算》的使用(一)
    assin与weak的区别
  • 原文地址:https://www.cnblogs.com/shenlian/p/2394791.html
Copyright © 2020-2023  润新知