青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
☆ 通過TEB/PEB枚舉當前進程空間中用戶模塊列表

http://www.sczgroup.org/windows/200311231555.txt

實在沒精力找出最早介紹該項技術的文章,盡管很想知道答案。29A雜志中大量使用
該技術([8]),并輔以文字說明,推薦閱讀。下面操作是在windbg中進行的,提前在
注冊表中設置好AeDebug,執(zhí)行vulnerable_0.exe,進入windbg調(diào)試狀態(tài)。也可通過
其它辦法進入windbg調(diào)試狀態(tài)。

段選擇子FS所對應的段即當前線程TEB(Thread Environment Block),即FS:0指向TEB。

> dg @fs
Selector   Base     Limit     Type    DPL   Size  Gran Pres
-------- -------- -------- ---------- --- ------- ---- ----
  0038   7ffde000 00000fff Data RW Ac  3    Big   Byte  P
> r $teb
$teb=7ffde000

TEB[0x30]是一個指向當前進程PEB(Process Environment Block)的指針。大家都這
么說,可他們?nèi)绾沃肋@個偏移的,你該上哪去找TEB的數(shù)據(jù)結構定義,不同系統(tǒng)上
該結構定義一致嗎。有這么多疑問,可絕大多數(shù)文章沒有告訴你撈魚的辦法,只給你
魚,你一定有種意尤未盡的郁悶。呵,了解,下面就是撈魚的辦法,windbg的dt命令:

> dt ntdll!*teb* (列出匹配通配符的結構名)
          ntdll!_TEB
          ... ...
> dt -v -r ntdll!_TEB
struct _TEB, 64 elements, 0xfb4 bytes
   +0x000 NtTib            : struct _NT_TIB, 8 elements, 0x1c bytes
   +0x01c EnvironmentPointer : Ptr32 to Void
   +0x020 ClientId         : struct _CLIENT_ID, 2 elements, 0x8 bytes
   +0x028 ActiveRpcHandle  : Ptr32 to Void
   +0x02c ThreadLocalStoragePointer : Ptr32 to Void
   +0x030 ProcessEnvironmentBlock : Ptr32 to struct _PEB, 66 elements, 0x210 bytes
   ... ...

偏移、名稱、類型、大小等等一應俱全地列舉在此。萬事不求人是不對的,指望別人
老來求自己更是不對的,藏著掖著是要一起挨米國鬼子打的。無論你用什么系統(tǒng),去
下載相應版本的windbg,然后用上述辦法自己核實偏移。MS一貫擅長保持向后兼容性,
這是它巨大成功的基礎,類似0x30這樣的偏移,被改動的可能性并不大。

號稱新版Platform SDK的ntpsapi.h文件中直接給出了TEB的數(shù)據(jù)結構,我的不夠新,
沒找著這個文件。反正dt命令夠我用了,懶得深究。

順便提個事??隙ㄓ腥艘娺^這樣的代碼,之后eax將指向PEB:

    mov    eax,fs:[18h]
    mov    eax,[eax+30h]

看完本文"新"的介紹,你肯定在疑惑中,這樣的代碼居然也能成功獲取PEB地址,惟
一的解釋就是fs:[18h]與fs:0h指向同一處(注意方括號的使用)。TEB結構第一成員是
NT_TIB結構,后者的Self成員指向自身這個NT_TIB結構,"碰巧"這個NT_TIB結構是
TEB結構第一成員,于是可以認為Self指向TEB。Self的偏移是0x18,就這么簡單。

> dt -v _NT_TIB $teb
struct _NT_TIB, 8 elements, 0x1c bytes
   +0x000 ExceptionList    : 0x0012ffb0 struct _EXCEPTION_REGISTRATION_RECORD, 2 elements, 0x8 bytes
   +0x004 StackBase        : 0x00130000
   +0x008 StackLimit       : 0x0012b000
   +0x00c SubSystemTib     : (null)
   +0x010 FiberData        : 0x00001e00
   +0x010 Version          : 0x1e00
   +0x014 ArbitraryUserPointer : (null)
   +0x018 Self             : 0x7ffde000 struct _NT_TIB, 8 elements, 0x1c bytes

換句話說,ds:7ffde000h與fs:0h這兩個不同的邏輯地址對應同一個線性地址。參看
<<IA-32 Software Developer's Manual. Volume 3>>([12])的3.1小節(jié),下面是
Intel的標準定義:

邏輯地址

    段選擇子(16-bits):段內(nèi)偏移(32-bits)

    也叫遠指針。程序中尋址時只能使用邏輯地址。沒有辦法禁用段機制,但有辦法
    禁用分頁機制。

線性地址

    邏輯地址經(jīng)GDT、LDT轉換后得到線性地址。

只需一條代碼即可獲取PEB地址:

    mov    eax,fs:[30h]

> dd @fs:30 L1
0038:00000030  7ffdf000
> dt ntdll!_TEB 7ffde000
   +0x000 NtTib            : _NT_TIB
   +0x01c EnvironmentPointer : (null)
   +0x020 ClientId         : _CLIENT_ID
   +0x028 ActiveRpcHandle  : (null)
   +0x02c ThreadLocalStoragePointer : (null)
   +0x030 ProcessEnvironmentBlock : 0x7ffdf000
   ... ...
> !teb
TEB at 7ffde000
    ExceptionList:        0012ffb0
    ... ...
    PEB Address:          7ffdf000
    ... ...
> r $peb
$peb=7ffdf000
> dd $teb+30 L1 (當前基是16進制)
7ffde030  7ffdf000

無數(shù)種辦法可以得到指向PEB的指針0x7ffdf000。

Inside 2K([9])<<Table 7-6 Windows 2000 User Process Address Space Layout>>
中直接將TEB、PEB定位在0x7FFDE000、0x7FFDF000。一般來說是這樣的,可是不建議
依賴硬編碼地址。這就看當前最緊要的是廣泛兼容性還是壓縮代碼空間。注意,討論
前提是編寫exploit、shellcode、virus,最終可能要匯編化的,而非常規(guī)編程。

PEB[0x0c]指向PEB_LDR_DATA結構,該結構有三個成員均可用于枚舉當前進程空間中
的模塊列表,區(qū)別在于加載順序、內(nèi)存順序、初始化順序。這是三個雙向循環(huán)鏈表,
遍歷時留神。

> dt -v -r ntdll!_PEB
struct _PEB, 66 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
   ... ...
> dt -v -r ntdll!_PEB_LDR_DATA
struct _PEB_LDR_DATA, 7 elements, 0x28 bytes
   +0x000 Length           : Uint4B
   +0x004 Initialized      : UChar
   +0x008 SsHandle         : Ptr32 to Void
   +0x00c InLoadOrderModuleList : struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x014 InMemoryOrderModuleList : struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x01c InInitializationOrderModuleList : struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x024 EntryInProgress  : Ptr32 to Void
> dt -v -r ntdll!_LIST_ENTRY
struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x000 Flink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x004 Blink            : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
> dd $peb+c L1
7ffdf00c  00241e90
> dt ntdll!_PEB_LDR_DATA 00241e90
   +0x000 Length           : 0x28
   +0x004 Initialized      : 0x1 ''
   +0x008 SsHandle         : (null)
   +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x241ec0 - 0x2429d8 ]
   +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x241ec8 - 0x2429e0 ]
   +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x241f28 - 0x2429e8 ]
   +0x024 EntryInProgress  : (null)
> dl 241f28 ffff 2 (注意Flink形成循環(huán)鏈表)
00241f28  00241fd0 00241eac
00241fd0  00242118 00241f28
00242118  00242258 00241fd0
00242258  002423a0 00242118
002423a0  00242300 00242258
00242300  002424e0 002423a0
002424e0  00242440 00242300
00242440  00242770 002424e0
00242770  002428a8 00242440
002428a8  00242808 00242770
00242808  002429e8 002428a8
002429e8  00241eac 00242808
00241eac  00241f28 002429e8
> dlb 2429e8 ffff 2 (注意Blink形成循環(huán)鏈表)
002429e8  00241eac 00242808
00242808  002429e8 002428a8
002428a8  00242808 00242770
00242770  002428a8 00242440
00242440  00242770 002424e0
002424e0  00242440 00242300
00242300  002424e0 002423a0
002423a0  00242300 00242258
00242258  002423a0 00242118
00242118  00242258 00241fd0
00241fd0  00242118 00241f28
00241f28  00241fd0 00241eac
00241eac  00241f28 002429e8

單從windbg所給出的信息,只能看出三個雙向循環(huán)鏈表的存在,每個鏈表結點上只有
前向指針、后向指針,如何獲取最終的模塊信息呢。其實這是很關鍵的問題,遺憾的
是某些文章不知出于什么動機刻意回避該問題。

Reactos與Tomasz Nowak提供了未公開的LDR_MODULE數(shù)據(jù)結構,我把偏移標出來了,
方便計算:

typedef struct _LDR_MODULE
{
    LIST_ENTRY        InLoadOrderModuleList;            // +0x000
    LIST_ENTRY        InMemoryOrderModuleList;          // +0x008
    LIST_ENTRY        InInitializationOrderModuleList;  // +0x010
    PVOID             BaseAddress;                      // +0x018
    PVOID             EntryPoint;                       // +0x01C
    ULONG             SizeOfImage;                      // +0x020
    UNICODE_STRING    FullDllName;                      // +0x024
    UNICODE_STRING    BaseDllName;                      // +0x02C
    ULONG             Flags;                            // +0x034
    SHORT             LoadCount;                        // +0x038
    SHORT             TlsIndex;                         // +0x03A
    LIST_ENTRY        HashTableEntry;                   // +0x03C
    ULONG             TimeDateStamp;                    // +0x044
                                                        // +0x048
} LDR_MODULE, *PLDR_MODULE;

鄭重推薦<<The Undocumented Functions For Microsoft Windows NT/2000>>,逆反
心理促使我一定要讓大家都知道這個數(shù)據(jù)結構引自何處([10])。

說點題外話,Google是你的朋友。Windows底層編程在中國不知因為什么而顯得資料
罕見,結果以前給我一個錯覺,Windows底層編程舉步維艱。后來因工作原因Google
時向Windows做了點偏移,發(fā)現(xiàn)國外此類編程資料并非如想像的那般罕見,有些人共
享出完整源代碼后只是說如果感覺有幫助能否在網(wǎng)上訂份小禮物給他,我是沒境外信
用卡,否則一定訂份小禮物給他。我還發(fā)現(xiàn)一件有意思的事,有人注明"原創(chuàng)"的時候
居然沒有任何參考資源,不巧的是我看過的英文文章實在有點爛多,當創(chuàng)意、技巧、
代碼片段重合得太多時,就有種無奈的感概。有鑒于此,己所不欲、勿施與人,寫此
類型文章時一概不敢宣稱是原創(chuàng)、翻譯,撐死了是筆記,還生怕漏了引自何處。也可
能是我水平低,才如此。水平一高,就不便引他人之文了,誰知道呢。呵,很小的時
候聽爹說過一句話,吃飯的永遠不要責怪做飯的,確實如此,所以就不多評價了。

建議大家寫文章時認真負責地給參考資源,有URL的都注明URL,不費什么事。

扯遠了,回到LDR_MODULE結構上來,三個雙向循環(huán)鏈表的結點正是該結構。

按加載順序遍歷:

!list -t _LIST_ENTRY.Flink -x "!ustr" -a "+24" 241ec0
!list -t _LIST_ENTRY.Flink -x "!ustr" -a "+2c" 241ec0

按內(nèi)存順序遍歷:

!list -t _LIST_ENTRY.Flink -x "!ustr" -a "+1c" 241ec8
!list -t _LIST_ENTRY.Flink -x "!ustr" -a "+24" 241ec8

按初始化順序遍歷:

> !list -t _LIST_ENTRY.Flink -x "!ustr" -a "+14" 241f28
String(58,520) at 00241f3c: D:\WINDOWS\System32\ntdll.dll
String(64,66) at 00241fe4: D:\WINDOWS\system32\kernel32.dll
... ...
> !list -t _LIST_ENTRY.Flink -x "!ustr" -a "+1c" 241f28
String(18,20) at 00241f44: ntdll.dll
String(24,26) at 00241fec: kernel32.dll
... ...

一般"按初始化順序"前向遍歷鏈表時,第一個節(jié)點對應ntdll.dll,第二個結點對應
kernel32.dll,我們不太關心其它模塊。如果按加載順序前向遍歷,第一個節(jié)點對應
EXE文件本身,第二個節(jié)點才對應ntdll.dll。

編程枚舉用戶模塊列表時,重點顯示BaseAddress、FullDllName成員。總結一下全過
程:

a. 從fs:[30h]獲取PEB地址

b. 從PEB[0x0c]獲取Ldr地址

c. 從Ldr[0x0c]獲取InLoadOrderModuleList.Flink

d. 從InLoadOrderModuleList.Flink開始前向遍歷循環(huán)鏈表

e. 顯示LDR_MODULE結構的BaseAddress、FullDllName成員。

下面是完整的C語言演示程序,匯編化留到編寫完整shellcode時進行。

--------------------------------------------------------------------------
/*
 * -----------------------------------------------------------------------
 * Compile : For x86/EWindows XP SP1 & VC 7
 *         : cl EnumModule.c /nologo /Os /G6 /W3 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /link /RELEASE
 *         :
 * Create  : 2003-08-12 11:36
 * Modify  :
 * -----------------------------------------------------------------------
 */

/*
 * 按加載順序遍歷雙向循環(huán)鏈表
 */

#include <stdio.h>
#include <stdlib.h>

#pragma comment( linker, "/INCREMENTAL:NO"    )
#pragma comment( linker, "/subsystem:console" )

int __cdecl main ( int argc, char * argv[] )
{
    void *PEB         = NULL,
         *Ldr         = NULL,
         *Flink       = NULL,
         *p           = NULL,
         *BaseAddress = NULL,
         *FullDllName = NULL;

    __asm
    {
        mov     eax,fs:[0x30]
        mov     PEB,eax
    }
    printf( "PEB   = 0x%08X\n", PEB );
    Ldr   = *( ( void ** )( ( unsigned char * )PEB + 0x0c ) );
    printf( "Ldr   = 0x%08X\n", Ldr );
    Flink = *( ( void ** )( ( unsigned char * )Ldr + 0x0c ) );
    printf( "Flink = 0x%08X\n", Flink );
    p     = Flink;
    do
    {
        BaseAddress = *( ( void ** )( ( unsigned char * )p + 0x18 ) );
        FullDllName = *( ( void ** )( ( unsigned char * )p + 0x28 ) );
        printf( "p     = 0x%08X 0x%08X ", p, BaseAddress );
        wprintf( L"%s\n", FullDllName );
        p = *( ( void ** )p );
    }
    while ( Flink != p );
    return( EXIT_SUCCESS );
}  /* end of main */
--------------------------------------------------------------------------

執(zhí)行效果如下??梢钥闯觯M管是循環(huán)鏈表,也可通過判斷BaseAddress是否為NULL
來結束遍歷。

> EnumModule
PEB   = 0x7FFDF000
Ldr   = 0x00241E90
Flink = 0x00241EC0
p     = 0x00241EC0 0x00400000 X:\EnumModule.exe
p     = 0x00241F18 0x77F50000 X:\XP\System32\ntdll.dll
p     = 0x00241FC0 0x77E60000 X:\XP\system32\kernel32.dll
p     = 0x00241E9C 0x00000000
>

☆ 參考資源

[ 8] http://vx.netlux.org/vx.php?id=z001 (29A雜志)

     Virus Writing Guide 1.00 for Win32 - Billy Belceb
     29A-4.202

     A guide to the latest methods to retrieve API's in a Win32 environment - LethalMind
     29A-4.227

     Gaining important datas from PEB under NT boxes - Ratter
     29A-6.024

[ 9] <<Inside Microsoft Windows 2000 Third Edition>> - David A. Solomon, Mark E. Russinovich

[10] The Undocumented Functions For Microsoft Windows NT/2000
     http://undocumented.ntinternals.net/ntundoc.chm

[12] Intel Architecture Software Developer's Manual. Volume 1
     ftp://download.intel.com/design/PentiumII/manuals/24319002.pdf

     Intel Architecture Software Developer's Manual. Volume 2
     ftp://download.intel.com/design/PentiumII/manuals/24319102.pdf

     Intel Architecture Software Developer's Manual. Volume 3
     ftp://download.intel.com/design/PentiumII/manuals/24319202.pdf
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产小视频在线观看| 欧美一级理论性理论a| 亚洲一区二区3| 99这里只有久久精品视频| 亚洲天堂av在线免费| 亚洲午夜极品| 久久成年人视频| 久久精品观看| 欧美大学生性色视频| 欧美日本精品| 国产性做久久久久久| 影音先锋一区| 中文一区二区在线观看| 欧美在线看片a免费观看| 久久午夜电影网| 亚洲精品一区二区三区樱花| 夜夜嗨av一区二区三区四区| 午夜影视日本亚洲欧洲精品| 欧美freesex交免费视频| 国产精品视频福利| 亚洲国产成人精品久久| 亚洲小视频在线| 久久婷婷国产综合尤物精品| 亚洲高清av| 亚洲午夜极品| 欧美.com| 国产一区二区三区久久精品| 亚洲免费av片| 久热国产精品| 亚洲一区3d动漫同人无遮挡| 老司机午夜精品视频| 欧美性大战xxxxx久久久| 尤物网精品视频| 欧美一级久久| 一二三区精品福利视频| 欧美成人免费va影院高清| 国产精品欧美在线| 日韩一级二级三级| 免费在线观看一区二区| 午夜精品国产| 国产精品美女久久久久久久| 亚洲国产综合在线| 久久亚洲一区二区| 亚洲免费在线观看| 国产精品久久久久久久第一福利| 亚洲国产高清自拍| 久久人人97超碰国产公开结果| 99在线|亚洲一区二区| 欧美gay视频激情| 亚洲福利电影| 免费成人黄色片| 久久精品国产在热久久| 国产美女一区| 欧美在线观看视频一区二区| 一区二区av| 欧美午夜女人视频在线| 99re亚洲国产精品| 亚洲日本久久| 欧美日本韩国一区二区三区| 亚洲三级网站| 亚洲人成人77777线观看| 猛男gaygay欧美视频| 老司机午夜精品视频| 国产午夜精品一区二区三区欧美 | 亚洲一区二区三区四区中文| 欧美激情二区三区| 在线亚洲精品| 91久久视频| 欧美啪啪一区| 亚洲一区免费看| 亚洲天堂男人| 韩国自拍一区| 欧美激情一区二区三区在线视频 | 欧美激情视频在线免费观看 欧美视频免费一| 国产午夜精品理论片a级探花| 久久九九精品99国产精品| 亚洲一区欧美| 一区二区亚洲精品| 亚洲国产美女精品久久久久∴| 欧美日韩国产成人在线观看| 亚洲一区日韩在线| 午夜精品一区二区三区电影天堂| 国产欧美日韩视频一区二区| 久久综合狠狠综合久久综合88 | 99精品视频一区二区三区| 欧美日韩播放| 欧美一区二区三区四区在线观看地址| 亚洲欧美日韩一区在线| 在线电影国产精品| 亚洲人成人一区二区三区| 国产精品久久国产精麻豆99网站| 午夜久久福利| 美女黄色成人网| 欧美亚洲一区在线| 麻豆精品在线观看| 欧美亚洲尤物久久| 欧美多人爱爱视频网站| 欧美一级在线视频| 免费在线日韩av| 欧美一区亚洲二区| 欧美国产激情| 久久国产乱子精品免费女| 欧美大片免费久久精品三p | 亚洲缚视频在线观看| 亚洲精品免费一二三区| 国产热re99久久6国产精品| 免费观看在线综合| 国产精品人人做人人爽| 欧美成人午夜影院| 国产人久久人人人人爽| 亚洲片区在线| 在线播放精品| 亚洲资源av| 在线亚洲欧美| 欧美插天视频在线播放| 久久久久在线观看| 国产精品99久久久久久久久久久久| 国产农村妇女毛片精品久久麻豆| 亚洲国产片色| 亚洲第一色在线| 亚洲欧美一区二区三区久久| 一区二区三区视频在线观看| 免费成人高清视频| 久久免费国产| 国产亚洲欧美一级| 亚洲尤物在线视频观看| 夜夜爽99久久国产综合精品女不卡 | 久久久久久久久久久久久女国产乱| 亚洲一区欧美激情| 欧美日韩精品一区| 亚洲三级观看| 99这里有精品| 欧美日韩中文字幕在线| 亚洲欧洲日本一区二区三区| 亚洲精美视频| 免费av成人在线| 亚洲福利在线视频| 亚洲欧洲在线视频| 每日更新成人在线视频| 美女视频黄a大片欧美| 国产在线不卡精品| 久久激情中文| 欧美国产先锋| 亚洲三级电影全部在线观看高清| 美国成人直播| 亚洲精品男同| 亚洲欧美日韩一区| 国产日韩av高清| 久久精品九九| 亚洲国产精品一区二区第四页av| 亚洲精选国产| 欧美日韩亚洲系列| 亚洲一区二区精品在线观看| 性欧美xxxx视频在线观看| 国产午夜精品久久久久久久| 久久成年人视频| 亚洲人成人99网站| 亚洲欧美影音先锋| 一区二区视频免费完整版观看| 麻豆精品网站| 中日韩美女免费视频网址在线观看 | 亚洲视频在线看| 久久国产欧美精品| 亚洲国产欧美日韩另类综合| 欧美日韩综合在线免费观看| 亚洲欧美国产制服动漫| 美女精品国产| 亚洲五月婷婷| 国产一区二区三区久久 | 一区二区三区.www| 国产精品一区二区视频| 久久综合999| 一区二区三区视频在线观看| 久久久久久亚洲精品不卡4k岛国| 欧美ab在线视频| 亚洲视频网在线直播| 你懂的视频一区二区| 亚洲欧美国产精品专区久久| 国内精品久久久久久| 欧美韩日一区| 欧美在线免费观看视频| 亚洲精品永久免费精品| 久久久国产成人精品| 99精品国产高清一区二区| 国产视频欧美视频| 欧美日韩成人网| 久久亚洲不卡| 欧美一区二区三区免费在线看| 亚洲日本欧美天堂| 免费毛片一区二区三区久久久| 亚洲欧美激情视频| 日韩视频在线一区二区| 在线观看亚洲视频| 国产女人水真多18毛片18精品视频| 欧美凹凸一区二区三区视频| 欧美一区观看| 亚洲欧美日韩一区二区三区在线| 99成人免费视频| 亚洲欧洲一级| 欧美激情亚洲一区|