2013年12月30日 星期一

WCF Web service 傳輸資料量長度限制

之前使用到 WCF Web Serivce 時, 傳輸的參數大小如果超過某個數量就會發生 error.
web service 是以 HTTP protocol 傳輸資料, 印象中 HTTP POST method 沒有限制長度大小才是, 查了一下資料才發現其實是 IIS server 的限制.

Request Limits <requestLimits>

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

2013年1月28日 星期一

shell extension 不工作並且 QueryInterface 收到 IID_IMarshal 等等奇怪的參數

在撰寫 shell extension 遇到一個問題
看起來我的 COM server 程式似乎沒有錯 但就是不工作
後來發現我的 QueryInterface 被 windows shell 呼叫好多次
參數是奇怪的 IID_IMarshal 之類參數
上網查了一下才發現是因為忘了註冊 threadingmodel
在這邊
設定好 threadingmodel 後就能正常工作了

Windows shell and desktop windows layer

Linux 原生是文字界面 它的 shell 是文字介面的例如 bash shell
Windows 是原生支援圖形介面的系統 它的 shell 也是圖形介面的 就是 explorer.exe

在螢幕上看到的東西都是屬於 explorer 創造出來的 window
下圖可以顯示 explorer 的階層



progman 就是 explorer 創建出來的頂層視窗 用 GetShellWindow API 可以取得它的 Handle
它的 class name 就是 "progman"

但是其實在 progman 之上還有一個最頂層 window 它被 progman 覆蓋所以看不到
這個 window 就是 desktop window 它是一個特殊的 系統定義的視窗 是所有其他視窗的祖先
GetDesktopWindow API 可以取得它的 Handle
這個 window 是被 csrss.exe 創造出來的
它的 class name 是 "#32769"

系統中一些重要元件例如 taskbar or desktop 都是被 explorer 創建出來的 window
是 progman 的後代

reference:
http://stackoverflow.com/questions/1669111/how-do-i-get-the-window-handle-of-the-desktop
http://blogs.microsoft.co.il/blogs/pavely/archive/2011/06/18/getshellwindow-vs-getdesktopwindow.aspx
http://technet.microsoft.com/en-us/magazine/gg213851.aspx
http://www.k8w.net/technology/develop/200710/67.html