2010年2月25日 星期四

c raw socket in linux

在linux下利用c來偽造封包,並不是表面上拿到原始碼就可以執行那麼簡單。

要達到這個目的,linux提供了raw socket方式。使用者需要自己定義ip header的內容。如果要進一步偽造更上層的tcp與udp封包,就需要自己定義tcp header或是udp header。mac層無法使用raw socket偽造。

tenouk網站中有詳盡的linux socket programming可以參考,當然也包括了raw socket部分。需要注意的是,在tcp與udp的raw socket範例,它們採用了自己定義的ip header以及tcp header與udp header。而裡面的structure,在ubuntu 9.11上測試是錯誤的,必須要自己參考系統的ip.h及tcp.h與udp.h。IP Header Data Structure這篇文章有說到關於不同系統,它的header上其實是有差異的。當然為了節省麻煩與跨平台可攜,還是建議採用系統的header比較方便。cprogrammming有一篇是關於使用系統header的討論。

編譯過後,執行需要root權限才能送出封包。而在destination上要注意的是,如果該host不存在,通常系統會先發出arp封包詢問。如果詢問無結果,由於系統無法填入mac位址,就不能送出。而source則無此限制。

參考資料:
[1] A brief programming tutorial in C for raw sockets
[2] Advanced TCP/IP - THE RAW SOCKET PROGRAM EXAMPLES
[3] SOCKET PART 10 - MORE TCP & UDP CLIENT & SERVER PROGRAM EXAMPLES
[4] Linux raw socket programming- cprogramming.com

2010年2月19日 星期五

[PSP] Assassin’s Creed- Bloodlines

ACT類型。

這款遊戲是跟隨著刺客教條2一起出的。但老實說,我並沒有玩過一代或是二代。整個遊戲的畫面在PSP上來說算是很不錯的,利用了很多光影的效果來彌補場景。建築物也是隨意爬行,很有自由度。在任務上也標示了地圖指標,也不怕會迷路。

或許也是太自由的關係,動作上可能考慮有太多可能性,反而有時候會卡住或是不好操作。任務上就一直暗殺,護送等等,變化也沒有很多樣。頭目戰當然不可能用暗殺的,都是直接開打。

我打起來就像是三國無雙一樣,哈。

IGN Trailer連結

201002201547_001

[360] Army of Two: The 40th Day

TPS類型。

這片射擊遊戲其實期待了很久呢!實際遊玩結果我也覺得很滿意。畫面比前一代提升了很多,而且讀取速度也變快了。開始玩之後就停不下來了。

助手的AI還算不錯,在簡單模是下不會隨便被射死。槍的話我則是從頭到尾都用同一把槍。要升級槍實在太花錢了,這代的商店設計簡直就是要你玩第二輪。但是呢,整體耐玩性不高,破完一輪就可以準備要收工了。

裡面的中文很好笑,根本是老外看不懂亂寫。建議要做在華人場景的,中文標示語還是要得先研究一下。

army_of_two_the_40th_day_frontcover_large_qM5F6j7hwwyfbAD

[360] Prototype

ACT類型。

這遊戲的特點就是可以感染路人,並變成他的模樣。整個遊戲就在像GTA一樣的方式下進行。行動上也沒有限制,想要攀岩走壁都可以達成。以初次接觸到這類型的感覺來說,是很爽快的。

一開始的序章中,主角真得很強,就像是技能點滿一樣,但是隨著故事開始倒敘之後,又要重最爛的開始了。雖然有四種能力,但是我實際上用到也只有兩種而已。在高速的戰鬥下,遊戲沒有做好自動鎖定人的機制,變成常常跑得很快,卻啥人的抓不到。

進行到最後,老實說有點boring呢。重複性有點高了點。

Prototype-Xbox-360-Cover

2010年2月9日 星期二

Post form data by javascript

在html上,有時候我們是自己用javascript定義GET字串作發送的,像是test?a=1&b=2這樣子的形式。然後再利用eval作法送出去,作法像下面的樣子。

var code=”location=test?a=1&b=2”;
eval(code);

後來基於某種原因,希望改成用POST方式傳送。在不改變原有form的前提下,有人說可以利用xmlHttpRequest方式傳送,但我認為這方式只能在背景執行,對於一些像真正submit的form需要換頁而言並不適用。後來我有找到利用javascript即時建立一個隱藏form的方式傳送,我認為這是最好的解法。改寫了一些適合我的程式碼。

<script language=javascript>

var para="a=1&b=2";

function submitFrm(){
  para_array = para.split('&');
  var postForm = document.createElement("form");
  postForm.setAttribute("method", "post");
  postForm.setAttribute("action", "test");
  var i=0;
  for(i=0;i<para_array.length;i++){
    hash_array=para_array[i].split('=');
    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("name", hash_array[0]);
    hiddenField.setAttribute("value", hash_array[1]);;
    hiddenField.setAttribute("type", "hidden");
    postForm.appendChild(hiddenField);
  }
  document.body.appendChild(postForm);
  postForm.submit();
}

</script>

參考資料:
[1] Javascript Post on Form Submit open a new window

c-faq

這c-faq是原文翻譯過來了,雖然辭不達意,但是我覺得有很多值得一看的,包括了許多在c中很靈異的狀況,或是較好的寫法,都可以在這裡獲得答案。有興趣可以再看原文版。

網址:http://twpug.net/docs/ccfaq/node1.html

順便附上裡面提到的C語言新手十誡(The Ten Commandments for Newbie C Programmers)。這篇文章有附上範例,比直接啃原文好多了。

2010年2月1日 星期一

Massive javascript data type

javascript由於型態之間較為鬆散,型態轉換可以利用自動來完成。這樣好像不錯的樣子,但對我而言是個大災難。

型態命名好像都隨意的樣子,但若經過運算的話,常常會得到意想不到的結果。在這裡建議對於每一個變數都要確實掌握型態,初始化或是轉換也要明確使用函式進行轉換,否則單憑想著"反正瀏覽器會幫我轉換",到時候debug就等著一行一行看了。

JavaScript的資料型態及變數記載了一些自動轉換的規則,可以用來參考。數字、字串的判斷,可以由JavaScript中isNaN函数就可以獲得了。

如果有更好的IDE就好了。