2013年11月24日 星期日

MSSQL 的視窗操作工具

SQL Server Management studio, 這是 MS 提供的資料庫操作視窗工具

硬件中斷點, 軟件中斷點, 內存中斷點的分別

硬件中斷點:
CPU 中會有一些特殊暫存器是用來做中斷用的, 通過設定這些硬體中斷佔存器的中斷
方式就是硬體中斷

軟件中斷點:
把記憶體中想要中斷的的指令的第一個 byte 改成 0xCC (int 3), 則 CPU 執行到這個指令時會產生中斷
debugger 此時再把原本的指令寫回記憶體, 這種方式叫軟件中斷點

內存中斷點:
把想要下斷點的記憶體頁面屬性改變
如果是內存寫斷點
改為 RE, 可讀, 可執行
如果是內存存取斷點
改為 NO ACCESS, 不可存取

WinDBG 一些指令筆記

uf
反組譯函式
ex:
uf kernel32!LoadLibraryW

u
反組譯某個位址
ex:
u 0x400000

!PEB
dump 出 PEB 內容

!TEB
dunp 出 TEB 內容

dt _PEB
印出 PEB 結構

bp
設定中斷點
ex:
bp kernel32!LoadLibraryW
當程式碼在 debug 中被修改, 函式位址有可能會改變, 但是用 bp 下的中斷點不會隨著更新

bu
設定中斷點
ex:
bu kernel32!LoadLibraryW
當 debug 過程中函式位址改變, 用 bu 下的中斷點也會隨著更新

2013年11月23日 星期六

Windows Thread Environment Block 位址

Windows 用 FS 暫存器來儲存 TEB 的位址,
TEB 的開頭是一個名為 TIB (Thread Information Block) 的資料結構
TIB 中偏移 18h 的欄位是一個指向 TEB 的指標
所以反組譯 Windows API 會常看到用 fs:[18h] 來取得 TEB 的位址

組合語言一些簡單指令

0x6a, push 一個 8 bits 數值
0x68, push 一個 32 bits 數值

ex:
// 指令長度 2 bytes, push 0 到 stack
6a 00

// 指令長度 5 bytes, push 1 到 stack
68 00 00 00 01

2013年11月21日 星期四

Visual studio C# Web project 專案類型

使用 Visual studio 來開發網站的話, 會發現有很多不同的 project 類型可以選
例如:
Web site
Web application
Web application MVC
等等

















這些不同的專案類別可能程式碼目錄結構和可用的內建類別會不一樣,
但功能都是用來開發網站

比較值得注記的是, web site 專案類別是採用自動編譯模式
當使用者發出一個網頁 request 的時候, 伺服器自動把程式編譯成 dll 並執行
而 Web application 專案就是必須要先手動把程式編譯成 dll, 使用者才能連上網站

2013年11月20日 星期三

Windows API mov instruction for hot patch

如果去反組譯 Windows API 的話, 會發現很多 API 的開頭都有一道看似無意義的指令

mov edi edi

例如反組譯 OpenProcess 這個 API







 

這是一個 2 bytes 的指令, windows 希望能讓 API 支援 hot patch, 也就是 inline hook.
所以在 API 的開頭插入這個指令

通常這類 API 的上方會發現 5 個 nop 指令













我們知道 2 bytes 可以放一個 X86 組合語言的 short jump
5 bytes  可以放一個 long jump
結合以上, 要對這類 API 做 inline hook 就很容易了
先把一個要跳到 hook 函式的 long jump 指令放到 API 上方 5 bytes 處
再用一個 short jump 蓋掉 mov 指令來跳到上方 5 bytes 處
用這種二段跳就可以完成 inline hook 了

而為什麼是用一個 mov 指令不是用兩個 nop 指令?
因為一道指令的速度比兩道指令快

Reference:
http://blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx
http://blogs.msdn.com/b/ishai/archive/2004/06/24/165143.aspx