fs暫存器 資料

2021-05-02 15:21:38 字數 2661 閱讀 5071

fs暫存器指向當前活動執行緒的teb結構(執行緒結構)

偏移  說明

000  指向seh鏈指標

004  執行緒堆疊頂部

008  執行緒堆疊底部

00c  subsystemtib

010  fiberdata

014  arbitraryuserpointer

018  fs段暫存器在記憶體中的映象位址(teb)

020  程序pid

024  執行緒id

02c  指向執行緒區域性儲存指標

030  peb結構位址(程序結構)

034  上個錯誤號

得到kernel32.dll基址的方法

assume fs:nothing             ;開啟fs暫存器

mov eax,fs:[30h]            ;得到peb結構位址

mov eax,[eax + 0ch]        ;得到peb_ldr_data結構位址

mov esi,[eax + 1ch]        ;ininitializationordermodulelist

lodsd                      ;得到kernel32.dll所在ldr_module結構的ininitializationordermodulelist位址

mov edx,[eax + 8h]         ;得到baseaddress,既kernel32.dll基址

s.e.h結構原理:

首先確定自己的鍊錶知識**函式知識已經補充.

s.e.h結構包含兩個dword指標:seh鍊錶指標和異常處理函式控制代碼,8個位元組,8個要點.

1)seh結構體存放在系統棧;

2)執行緒初始化將自動向棧裡安裝乙個seh結構,作為預設執行緒異常處理.

3)如果程式源**中使用了_try{}和_excopt{}或者巨集等異常處理機制,編譯器將最終通過向當前函式棧安裝乙個seh來實現異常處理.

4)棧中一般會同時存在多個seh.

5)棧中的多個seh通過鍊錶指標在棧內由棧頂向棧底穿成單向鍊錶,位於鍊錶最頂端的seh通過teb 0位元組處的指標來標識.

6)當異常發生時,作業系統會中斷程式,並首先從teb的 0位元組偏移處取得最近的seh,使用異常處理函式控制代碼所指向的**來處理異常.

7)當離異常最近的異常處理函式不能處理時,將沿順seh鍊錶逐步嘗試.

8)如果程式所安裝的異常處理函式都不能解決,系統將採用預設的異常處理函式來處理,通常彈出錯誤對話方塊,強制關閉程式.

根據以上8個要點可以總結出以下處理順序:

①--->首先執行執行緒異常處理函式及最近的seh.

②失敗後將執行鍊錶中的下乙個異常處理函式,只止於null而不能解決.

③執行程序異常處理seh

④執行系統異常處理seh.

執行緒異常處理:2個狀態值,引數無須解釋.值得一提的是unwind操作.清理現場,釋放資源技巧可以借鑑.

unwind操作通過kernerl.32中的函式rtlunwind()來實現.

程序異常處理:3種狀態值.程序的異常處理**函式需要使用kernerl32.dll中的函式setunhandledexceptionfliter()函式來註冊.

系統預設異常處理:終極boss也稱uef.如果程序異常處理函式失敗或者程序異常處理函式沒有註冊,系統異常處理函式unhandledexptionfilter()將被呼叫,所有的異常都將**獲.

首先這個函式檢查登錄檔,hklm/software/microsoft/windowsnt/cv/aedebug.其中值得一提的是其中的引數.指定了程式偵錯程式.

ring3中第乙個異常處理函式為kiuserexceptiondispatcher(),其首先檢查除錯狀態,遍歷seh表,unwind操作,

然後失敗呼叫終極boss.winxp增加了veh.其中veh與seh不同的乙個顯著特點是,其為雙向鍊錶.其處理級別要高於seh並儲存在堆內.unwind操作對起不起作用.

對於ring3的應用程式,fs:[0]的位址指向的是teb結構,這個結構的開頭是乙個nt_tib結構,nt_tib結構的0x18偏移處是乙個self指標,指向這個結構自身,也就是指向teb結構的開頭。

teb結構的0x30偏移是乙個指向peb的指標。peb又是乙個結構,這個結構的0x2偏移處是乙個uchar,名叫beingdebugged,當程序被除錯時,此值為1,未被除錯時此值為0

因此以下**逐行執行後的結果:

mov eax,dword ptr fs:[18h];eax=teb的指標

mov eax,dword ptr [eax+30h];eax=peb的指標

movzx eax,byte ptr [eax+2h];eax=peb.beingdebugged(byte擴充套件為dword)

teb和peb結構的詳細內容可以在windbg核心除錯狀態下使用dt _teb、dt _peb命令來察看。

masm中預設是fs:error,也就是預設不能使用fs段暫存器,因此要在masm中使用它時必須先assume fs:nothing

fs是段暫存器,即儲存段選擇子,對應的位址通過gdt或ldt中的相應專案來決定其範圍和使用許可權等。

最後回到isdebuggerpresent,它就是通過檢查peb中的beingdebugged欄位來確定程序是否處於被除錯狀態的,因此修改此欄位可以直接影響此api的返回值。

以上內容在除錯或者說軟體加密與解密過程中是基本的常識。

獲取其他程序的fs暫存器

由於fs暫存器裡面有很多資訊可用,so 在不注入的情況下採用暴力搜尋。我不知道有沒有更高階的辦法。nt teb 0x000 nttib nt tib 0x000 exceptionlist ptr32 0x004 stackbase ptr32 0x008 stacklimit ptr32 0x00...

暫存器(通用暫存器)

因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...

暫存器,標誌暫存器

涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...