2015年1月8日 星期四

SQL query with like

在 C# 使用 SQL query 的參數如果要加 % 的話, 要用 + 號
例如


cmd.CommandText = "select * from MyTable where Arg like @Arg+'%'";

2015年1月7日 星期三

定位 PE file section table 位置

PE header 中有一個欄位叫做 SizeOfHeaders.
但是這個欄位實際上只是方便給人看得, PE 檔案實際上的 header 大小不一定要跟這個值一樣
程式也可以順利執行

因此, 當要定位 section table 時, 也不能用 SizeOfHeaders 來算
正確的算法應該是

dosHeader.e_lfanew +
sizeof(ntHeaders.FileHeader) +
sizeof(ntHeaders.Signature) +
ntHeaders.FileHeader.SizeOfOptionalHeader;

Reference:
http://bbs.pediy.com/showthread.php?t=152786

2015年1月5日 星期一

VMWare unknown invalid VM

最近在 VMWare ESXi 上面發現了有台 VM 顯示 Unknown invalid
發現是因為 VMWare host 讀不到 .vmx 檔案時會出現這個錯誤

但是去 datastore 看時發現 .vmx 檔案還在, 也可以讀取
看來應該不用重新建立 VM
只要把 VM 從 Inventory 移除再加入就好了

Reference:
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2172

2014年10月21日 星期二

Windows server 2008 R2 SP1 kernel socket leak

最近發現在 server 2008 上面跑的 service 出現 connection error,
經過測試, 確定網路是通的
後來自己寫了小程式去做 socket connect 測試, 發現只要同時開多個 socket, 一定會出現 exception

an operation on a socket could not be performed because the system lacked sufficient buffer space

上網查了資料, 這個錯誤常常是因為 windows 有 socket port range 限制, 但是 application 頻繁的打開跟關閉 socket 所已 port number 達到 windows 規定上限

http://blog.zhaojie.me/2010/08/lack-of-dynamic-ports-when-frequently-open-and-close-socket.html

http://blog.miniasp.com/post/2010/11/17/How-to-deal-with-TIME_WAIT-problem-under-Windows.aspx

這種情況通常等個一會讓 windows 把關掉的 socket port number 再重用, 就可以避開
但是我遇到的情況是不管等多久這個 exception 都會出現

繼續查資料發現 windows 還有一個 known issue, kernel socket leak

http://support.microsoft.com/kb/2577795

當這個 issue 發生時, 因為是 kernel 沒有把 socket 正確關閉, 所以除了重開機不然沒救
這個 KB 描述的現象跟我遇到的非常相似, 而且我使用的 server 剛好就是該 KB 有提到的
server 2008 R2 SP1.

可惜的是沒有一個方法可以確定是不是真的發生了 kernel socket leak, 只能先裝上 hotfix
再看看之後會不會發生

2014年10月13日 星期一

在 blog 中程式碼上色的解決方案: Google Javascript code prettifier

想在 blog 中貼上程式碼上色, Google 出了一個很簡單使用的解決方案

Javascript code prettifier

只要在 blog 的 template 加上一個連結
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>

再把程式碼區塊用特定的 html 元素包起來, 就可以幫程式碼上色了

reference:
https://google-code-prettify.googlecode.com/svn/trunk/README.html

用 parameterized queries 防止 SQL Injection

當用程式做資料庫操作時, 不建議把 SQL command 直接寫在 code 裡面, 因為這樣常會有背 SQL injection 的風險, 比較好的方式是使用 parameterized queries.

例如:

string stmt = "INSERT INTO dbo.Test(id, name) VALUES(@ID, @Name)";

SqlCommand cmd = new SqlCommand(smt, _connection);
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100);

for (int i = 0; i < 10000; i++)
{
    cmd.Parameters["@ID"].Value = i;
    cmd.Parameters["@Name"].Value = i.ToString();

    cmd.ExecuteNonQuery();
}

reference:
http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php
http://stackoverflow.com/questions/8218867/c-sharp-sql-insert-command

2014年7月7日 星期一

Anti debugger tricks

Windows 有 IsDebuggerPresent API 可以讓程式知道自己是不是正在被 debug.
其實這個 API 就是去 PEB 裡面讀取 BeingDebugged 欄位.

程式也可以自己取得 PEB 位址, 然後讀取 BeingDebugged 欄位, 而不呼叫 API.
免得很容易就被人 bypass.

除了 BeingDebugged 欄位外, PEB 還有 NtGlobalFlag 欄位可以檢查是否被 debug.

GetStartupInfo API 也可以用來 anti debug, 因為被 Ollydbg lunch 的程式
StartupInfo 裡面的 dwFlags 會跟被 explorer lunch 起來的不一樣.

Reference:
http://www.codeproject.com/Articles/29469/Introduction-Into-Windows-Anti-Debugging