יום שבת, 17 בדצמבר 2011

Android Development Environment



אי אפשר להתעלם מאנדרואיד שנהפכה למערכת ההפעלה למכשירים ניידים הפופלרית ביותר בעצם פתחה חזית מול IOS של MAC ואפשר לומר שהיא גמרה על Symbion של Nokia, ו Windows Mobile של Microsoft, קודם כל היא חינם ומבוססת על Kernel של Linux ובעזרת המפתחים של Google שפיתחו שכבת אפליקציה ב Java מאפשרת למפתחים פיתוח נוח ורחב לפלטפורומות שנות כמו מכשירים סלולרים ומחשבי כף יד.

מאמר זה הוא יריית הפתיחה לסדרת מאמרים חדשה לפיתוחים עבור מכשירים מבוססי Android.

סביבת הפיתוח גם היא חינם ומבוססת על Eclipse ובעזרת ה SDK של Android ניתן לשלב בין ה Eclipse ל Android , בנוסף יש ב Sdk תוכנת אימולציה (Emulator) שניתן דרכו לבצע Debug על מכשיר וירטואלי שמריץ Android.

דרישות לסביבה:

קודם כל צריך את הסביבת העבודה של Eclipse IDE for Java Developers.
חשוב מאוד! Eclipse דורש את ה JDK - Java Developing Kit שניתן להורדה בלינק זה .

לאחר מכן יש להוריד את ה Android Sdk שניתן להורדה בלינק זה.

Eclipse לא דורשת התקנה מיוחדת יש לחלץ את הקבצים מה Zip לאיזה תקייה שאנחנו רוצים וללחוץ על Eclipse.
לאחר הורדת ה SDK יש לחלץ את הקבצים לאיזה תקייה שאנחנו רוצים ולאחר מכן להריץ את ה SDK-MANAGER שמנהל לנו את הגרסאות של API's ומאפשר לנו להוריד גרסאות שונות, תהליך ההורדה עלול להיות ארוך מהרגיל, כמו כן ב SDK יש רכיבים נוספים שניתן להתקין כמו דוגמאות, מדריכים וכו', בנוסף מותקן לנו Emulator שמאפשר הדמייה של מערכת ההפעלה.

לאחר שסיימנו להוריד את ה Eclipse ואת ה SDK , נפרוס את הקבצים את קבצי ה Eclipse נפרוס ב C:\eclipse
ולאחר מכן נפרוס את ה SDK בתקייה C:\android.

בשלב זה נצטרף להתקין את ה ADT - Android Developing Tool בתוך ה Eclipse , יש ללכת ב Eclipse וללחוץ על Install New Software  והכניס את הקישור הבא:



נוספו בעצם 2 כפתורים חשובים לממשק Eclipse  שלנו:


הכפתור הימני אחראי על המכונות שלנו, דרכו בעצם נגדיר את המכונות הוירטואליות שיריצו את Android, נוכל להגדיר את רזולוצית המסך, כמות הזיכרון ב Flash והמון רכיבים נוספים


לחיצה על New על מנת ליצור מכונה חדשה.


לחיצה על New ליד ה Hardware מאפשרת לנו להגדיר תכונות נוספות במכשיר הוירטואלי.

עכשיו נחזור לכפתור השמאלי שאחראי על ה Api שלנו, קיימות המון גרסאות עבור ה Api של Android שהתחיל מגרסה 1 שמוגדרת כ Base , וממנה התגלגל עד גרסה 15 שנקראת Sandwitch שהיא העדכנית ביותר, גם מערכת ההפעלה מתגלגלת והתחילה מגרסה 1 , היום העדכנית ביותר בשלב זה היא 4.


זהו לאחר שהורדנו, התקנו ועדכנו מה שנשאר הוא לעשות New -> Android Project ולהתחיל לכתוב קוד.

בהצלחה...

יום חמישי, 13 באוקטובר 2011

Bypass Between Networks

באחד הפרויקטים שלי רציתי לממש מחשב בקרה לתעבורה ושליטה על החיבורים ברשת, כלומר מחשב מרכזי בעל 2 כרטיסי רשת , הראשון עבור האינטרנט שמגיע מ Router מרכזי שמשרת גם רשתות אחרות והשני מעביר מידע רק לתא בתוך הרשת , בקיצור חתכתי את הרשת לתא של מחשבים מסויימים שיעברו בקרה של ה Packets לפני שהם עוברים ליעד , בנוסף רציתי להשתמש ב Packet Filter חזק על מנת לסנן את החיבורים, אין ספק שעבור פרויקט מסוג זה אני חייב לעבוד עם Linux.


שימו לב! הפרויקט תוכנן על Virtual Box ומערכת הפעלה מסוג Fedora במחשב הבקרה, מול מחשבי Xp.

על מנת לממש את התהליך ב Virtual Box יש להגדיר מכונה של Linux עם 2 כרטיסי רשת, הכרטיס הראשון מוגדר כ Bridge Adaptor על מנת שנקבל כתובת מה DHCP שמחובר לאינטרנט, הכרטיס השני מוגדר כ Internal Network ומשייך אותו לרשת הפנימית דרך ה Switch של הרשת.

NIC 1


NIC 2


 אחרי שסיימנו להגדיר את ה Virtual Box נפעיל את המכונות הוירטואיליות, תחילה נגדיר את המחשב Linux  ונבין מה אנחנו רוצים שהוא יבצע, למעשה מדובר בכמה פקודות שנעבור עליהם בקצרה:

תחילה נעבור למצב Root במכונה:
#: su root
נכניס סיסמא.

כרגע במכונה יש לנו 2 כרטיסים eth0, eth1 , אם אנחנו מחוברים ל Router עם DHCP ב eth0 נבדוק שהוא קיבל כתובת ושיוצאים לאינטרנט במקרה ונרצה להגדיר את ההגדרות ידנית נפתח את הקובץ:

 #: gedit /etc/sysconfig/network-scripts/ifcfg-eth0

הקובץ צריך להיראות כך:
DEVICE=eth0  //device name
ONBOOT=yes  //start on boot
BOOTPROTO=static  // boot mode static
IPADDR= xxx.xxx.xxx.xxx  // your static ip address
NETMASK= xxx.xxx.xxx.xxx // network mask
GATEWAY = xxx.xxx.xxx.xxx // the router gateway
HWADDR = 00:00:00:00:00:00 //optional mac address

בשלב זה סיימנו את העבודה על eth0 ונגדיר כתובת עבור eth1:
#: ifconfig eth1 10.10.10.1

לא נגדיר Netmask.

נגדיר Ip-Forwarding:
#: sysctl -w net.ipv4.ip_forward=1

הגדרת Ip-Forwarding היא קריטית היא בעצם מאפשרת לנו להעביר Packets ולהפוך ל Gateway בין רשתות.

IPTABLES:

ה Firewall של Linux , הוא אחד הכלים החזקים ב Linux ומאפשר לנו לנהל את כל חוקי ה Firewall אני אגע רק בחלק קטן מאוד מהכלי הזה, הוא כלי עם המון אפשריות וניתן למצוא הרבה ספרים בנושא. 

תחילה נעשה Flush לחוקים ב Firewall:
#: iptables -F
#: iptables -t nat -F
# iptables -t mangle -F

נעשה Flush ל 3 טבלאות עיקריות , הכללית, של ה Nat ושל Mangle שאחראית על  ה Quality Of Servic  של Tcp  Header.

שימו לב!  במערכות ב Production אל תבצעו שלב זה... על מנת לא לפגוע בחוקים שהגדרתם בעבר.

השלב האחרון הוא הגדרת חוקים חדשים ב Iptables שיאפשרו לנו להעביר את ה Packets בין הכרטיסים

#:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

פקודה זו מגדירה לנו את ה Source Nat 

הגדרת ה Forwarding  לכרטיס eth1

#: iptables -A FORWARD -i eth1 -j ACCEPT

זהו מחשב הלינוקס מוכן , נעבור למחשב ה Xp ונגדיר לו כתובת סטטית לדוגמה: 10.10.10.2 וה Gateway הוא הכתובת של המכונת לינקוס 10.10.10.1 , כרגע לא מוגדר לנו שרת DNS ע"ג המכונת Linux אז לא נוכל להגיע לכתובת Domain אלא רק לכתובת IP.

ניתן להגדיר באופן ידני את כתובות ה DNS על מחשבי ה XP במאפייני הרשת או ע"ג מכונת ה Linux ע"י עריכה של הקובץ :

#: gedit /etc/resolv.conf

nameserver xxx.xxx.xxx.xxx

מגניב...

בהצלחה...

יום שני, 12 בספטמבר 2011

Php Soap Server and .NET Client

Webservices תמיד עניינו אותי ולכן חיפשתי משהו נחמד על מנת שתוכלו להכיר אותם טוב יותר, קיימת תחרות רבה בין 2 השיטות המובילות בתחום, שיטת ה REST הנפוצה במערכות Linux , כמו שראינו במאמרים בעבר , שם מרבית העבודה מתבצעת עם REST , ולכן העבודה היא הרבה יותר קשה לניתוח, כל חברה יכולה לממש את התתמשקות בצורה אישית ללא סטנדרט מסויים ובאחריות המשתמש לנתח את הנתונים בעצמו.
 השיטה השנייה Simple Object Access  Protocol - Soap , מוגדרת כסטנדרט ועל מנת להשתמש בו יש לעמוד בחוקים שלה, מיקרוספט אימצו את השיטה ומבחינתה זאת השיטה הטובה ביותר לפיתוח בפלטפורמות Windows , אני באמת לא יודע מה יותר טוב, עדיין REST פופלרי מאוד אבל Soap מומלץ לעבודה ע"י W3C העולמית שפיתחה עבורו תקן WSDL - Web Services Description Language  , לכן זה נראה לי ויכוח שכנראה אין בו מנצחים ומפסדים וצריכים להכיר את 2 השיטות.

  חשוב מאוד! המאמר הזה מתייחס לעבודה עם Soap בסביבת Linux ונוסה על מערכת הפעלה Fedora. 

 תשתית:

תחילה יש להבין שעבודה עם Soap בסביבת Linux מצריכה Php אבל לא סתם אלא Php 5.0 ומעלה , התמיכה המלאה ב Soap קיימת בגרסה 5 בלבד, גרסאות נמוכות יותר מצריכות עבודה מול כלים של צד שלישי , בקיצור סיפור מהתחת לכן לא מומלץ לשלב Soap במערכות קיימות עם Php נמוך מגרסה 5, וכמובן שרת Apache. יש להתקין את המחלקות של ה Soap ב Php

#: yum install php-soap

* יש להפעיל את ה Apache מחדש,  ולגשת לדף הבדיקות  phpinfo ולראות אם נוספו השורות הבאות:
soap
Soap Client enabled
Soap Server enabled
DirectiveLocal ValueMaster Value
soap.wsdl_cache11
soap.wsdl_cache_dir/tmp/tmp
soap.wsdl_cache_enabled11
soap.wsdl_cache_limit55
soap.wsdl_cache_ttl8640086400

אחרי שהכנו את ה Server נתחיל לרשום את הקוד, כאן העסק מתחלק ל 2 חלקים, חלק הראשון הוא המימוש של הפונקציות והפרמטרים, במקרה הזה נכתוב קובץ עם סיומת Php , בו נכתוב את הקוד עם כמה תוספות, החלק השני הוא החשיפה של ה Webservice בעזרת קובץ WSDL בפורמט Xml.

 נעבור בקצרה על מבנה הקובץ ה Wsdl , ניתן לקבל מידע רחב בנושא בלינק הבא:


  • לפי ה Element אפשר לראות שהפונקציה שחשופה לנו היא HelloWorld , מתחת שם הפונקציה ניתן לראות שיש לה "ילדים" שהם הפרמטרים שהיא מקבלת ומחזירה ומה הסוג שלהם.
  • תגיות PortType פעולות מופשטות להודעות נכנסות ויוצאות.
  • תגיות ה Message מייצגות מידע שמועבר, מאוד חשובים לשלבים הלוגיים של ה Webservice
  • תגיות ה Binding בעצם מייצגות את הפרוטוקול את מבנה ה Data שהוגדר ע"י PortType ספציפי.
  • תגית ה Port מייצגת איזה Port קצה.
  • תגית ה Service מייצגת סדרה של Ports שקשורים ל Service.


מבנה קובץ ה Php הוא מאוד פשוט, יש הצהרה תחילה על אובייקט Server$ שמסוג SoapServer , בשלב ההצהרה נעמיס את שם הקובץ ה WSDL לכן ממולץ שהקבצים ישבו באותה תקייה, לאחר מכן נוסיף לאובייקט את הפונקציה אותה אנו מעוניינים לחשוף ולאחר מכן נחבר את ה Handle על מנת שהיא תופעל. אין יותר מידי מה לפרט על הפונקציה בגדול אנחנו צריכים להוציא את הפרמטר שנשלח ע"י שימוש במערך וע"פ השם שניתן בקובץ ה Wsdl.

 

טיפ להתחלה:
 מומלץ לבנות את ה WSDL ע"ג ה Visual Studio בעזרת יצירת פרויקט Webservice , יש ליצור פונקציות פקטיביות ולאחר מכן לראות את ה WSDL שנוצר ובכך לחסוך את כתיבת ה WSDL , המנגנון האוטמטי ב VS בהחלט עושה את העבודה.

בהצלחה.

יום שני, 5 בספטמבר 2011

Skype Api With C#


חזרתי!, אחרי חופשה ארוכה של לימודים ומחקרים עם רצף מאמרים חדשים, החלטתי להתחיל דווקא מ Skype כחלק מסדרת המאמרים הנוגעים להתממשקות ל Api שונים כמו FaceBook ו Picasa.
Skype חברת התקשורת מבוססת על תשתית האינטרנט הגדולה בעולם, היא נותנת מגון שירותים חינמים ושרותים בתשלום, וכמובן היא פופלרית מאוד בגלל הפשוטות שלה , התמיכה בריבוי פלטפורומות ובכלל שינתה את כללי המשחק בכל עולם הטלפוניה.

אז ברור שאין יותר מה להוסיף על Skype ומי שלא מכיר אותה כנראה חי במערה בשנים האחרונות כי אין ספק שזה מוצר הכרחי עבור כל אחד ואין מה לעשות אם זה חינם זה תופס מה שהפך את Skype לשחקן מוביל בעולם, אבל לא הכול חינם חלק מהשרותים בתשלום כמו שליחת Sms , להתקשר לטלפון חיצוני ושיחות ועידה לכן חברות רבות משתמשות בשירותים של Skype על מנת לבסס את מערך התקשורת בחברה ללא צורך במפעיל מקומי.

תחילה לא האמינו שהעסק יצליח ואפילו Skype עצמה לא הכחישה, ונקנתה ע"י Ebay בשנת 2005 ב מעל 2 מיליארד דולר אבל Ebay לא הצליחו למנף את המוצר למימדים שהם רצו בשנת 2011 נקנתה ע"י Microsoft בסכום עצום מעל ל 8 מיליארד דולר, ובהחלט הניפה את הדגל בעולם התקשורת והיום אחד השחקנים המובלים בו, ההשקעה של Microsoft ענקית אבל גם התמורה, בקנייה אחת Microsoft נהפכה לענקית תקשורת שסביר מאוד שתשלב את Skype במערכות הפעלה עתידיות.

ל Skype קיים Api אבל הוא מפוקפק, הוא לא ממש עובד כמו שצריך , אבל קיים הרבה מידע וקהילה מאוד פעילה שניתן להעזר בה, קיימים מספר דברים הכרחיים על מנת שנוכל לעבוד מול ה Api דבר ראשון יש להתקין את ה Skype על המכונה שעליה נכתוב את התוכנית, חשוב מאוד שהגרסה תהיה פחות מ 5.0 כי יש ב Api באג שמונע להתחבר אליו מרחוק בנוסף צריך את הקובץ Skype4COM.dll שניתן למצוא ברחבי הרשת.


 using SKYPE4COMLib;

 SkypeClass myskype = new SkypeClass();

בעזרת מחלקה זאת ניתן לבצע את כל הפעולות שקשורות שליחת SMS , התקשרות וניהול אנשי קשר, ובאופן כללי זה מאוד פשוט וניתן למצוא המון מידע כיצד לבצע את רוב הפעולות בסקייפ.

יש משהו שקצת מציק, כל פעם שנפעיל את התוכנית שלנו נבקש לאשר את התחברות ב Skype לכן קיימת אפשרות לאשר את התוכנית באופן אוטומטי.


Tools -> Options -> Advanced -> Manage other programs access skype



אתרי מידע:
http://forum.skype.com/index.php?showtopic=142821
http://www.codeproject.com/KB/cs/skypecontrolapicsharp.aspx
http://archive.msdn.microsoft.com/SEHE/Release/ProjectReleases.aspx?ReleaseId=1871

בהצלחה,

יום חמישי, 21 באפריל 2011

Hard Drive Starting Guide

טרגדיה!! נמחק לי ה Hard Disk! מה אני יעשה איך אני אשחזר את הנתונים שלי?! עם מי לדבר? זה חלק מהשאלות שאתה שואל את עצמך כאשר עוברת עליך "טרגדיה" כזאת... אז דבר ראשון תנו לשבור לכם מיתוס, המידע בדיסק לא נעלם, אלא נשאר אלא אם כן נדרש המקום ע"י מערכת ההפעלה שלנו, כוננים קשיחים זה החלק הנע היחידי שנשאר עוד במחשבים (חוץ מהמאוררים) ועם הזמן המערכות שבו נשחקות כמו שהרכב שלנו נשחק, אבל אני לא רוצה להאשים את הכוננים על כך שהם לא אמינים, הם שירתו אותנו שנים רבות ואני מאמין שהם ישרתו אותנו עוד למרות שתכנולוגיות חדשות ושיפורים מראים עולם טוב יותר ובקרוב החלק הפרימטיבי הזה יוחלף בזיכרון Flash מהיר ועצבני, רק חשוב לי להדגיש כל הקשור לקבצים שנמחקו או כוננים שנדפקו לא קרו בגלל עייפות החומרים אלא בגלל טעויות משתמשים.

במאמר זה נכיר את המנגנון הזה וכיצד הוא עובד, בנוסף נשחזר כונן שנמחק ,לצורך העניין אני יקריב HD של 10 GB ישן.

המקומות הנסתרים של הכוננים הקשיחים:

כשפותחים כונן מהשקית, מקבלים קופסה כסופה עם כמה פינים שיוצאים החוצה , מחברים למחשב והעסק מתחיל לעבוד, בלי יותר מידי שאלות, למרבית האנשים זה מובן מאליו הקופסאות הכסופות האלה, אבל בתוכן קיים עולם עצום של אלקטרוניקה ופיזיקה.

אז איך בדיוק זה עובד?

הרעיון שמשותף לכל הכוננים זאת היכולת לאגור מידע, השאלה איך אפשר לאגור אותו? , נקודת ההתחלה עבורנו שהשפה של המחשב היא בינארית, המחשב מכיר 0 או 1 ולא יותר מזה, זה נשמע כמו מתג חשמלי שנדלק ונכבה ע"י פעולה של המשתמש, עכשיו תחשבו לכם על מיליונים של מתגים כאלה, שנשלטים ע"י תוכנה שלוקחת את המידע שלנו מאחסנת אותו בעזרת הדלקה וכיבוי של המתגים, אבל ברגע שתהיה לנו אפסקת חשמל כל המתגים היו מתאפסים והמידע היה נעלם, על מנת שנוכל לאגור את המידע שלנו נכנס פה אלמנט גאוני והוא המגנט, אפשר למגנט ולבטל מיגנוט במתכות ובצורה זו קיבלנו את ה 0 וה 1 שאנחנו צריכים.

אז אחרי התיאוריה נעבור לתכלס:


בפירוק הבסיסי אנחנו מקבלים 3 חלקים - עטיפה, מנגנון מכני ומנגנון אלקטרוני, המנגנון האלקטרוני מנהל לנו את המידע מול המנגנון המכני.

המנגנון המכני:


פירוק מנגנון המכני הוא עדין ומסובך ולא מומלץ לעשות את זה בבית אלא בחדר נקי עם מסכה על הפנים ,כל מגע לא נכון עלול להרוס את הדיסק לצמיתות.


  1. דיסק מתכת (אלומניום) שמכיל את המידע לפעמים יש יותר מדיסק אחת.
  2. מנוע שמסתובב בין 5,400 עד 15,000 סיבובים בדקה.




   3.  ראשי מחט שממגנטים נקודות ע"ג הדיסק.
   4.  נקודת החיבור עם המנגנון האלקטרוני.
   5.  חתיכת פלסטיק ששומרת על הציר של המחט ומונעת ממנה לחרוג מחוץ לדיסק.
   6.  מגנט עליון
   7.  מגנט תחתון.

כל מערכת הפעלה מכילה מיפוי עבור הכונן לפי השיטות שלה ב Windows למשל זה נקרא FAT - File Allocation Table שנכתב ע"י ביל גייטס בשלבים הראשונים של האימפריה ועבר שיפורים במהלך השנים, FAT מכיל מפה של נקודות המידע על הדיסק שנקראות Sectors וברגע שהכונן רוצה לכתוב או לקרוא הוא מעביר למחט את המיפוי של ה Sector.

שחזור מידע מדיסק שנמחק:

אז כמו שאמרתי בהתחלה המידע לא באמת נעלם אלא אם מערכת ההפעלה מבקשת את המקום, המתגים בדיסק עדיין דלוקים לפי המידע שהיה לפני שהדיסק נמחק, בעזרת EnCase תוכנה מעולם ה Forensic ניתן לשחזר מידע שנמחק.

יצירת Case חדש.


הכנסת הפרטים של ה"תיק שלנו" ובחירת הכונן שאותו אנחנו רוצים לשחזר



ביצוע Recover Folder יחשוף לנו את הקבצים והספריות שנמחקו.

בחירת הקובץ או הספרייה שאנחנו רוצים לשחזר


 
שחזור המידע.


סרט הדגמה:
 
בהצלחה...

יום שישי, 15 באפריל 2011

Pixel Bender Starting Guide



למי שלא מכיר Pixel Bender זה Framework שעוצב ע"י Adobe במטרה לכתוב Filters ו Effects עבור המוצרים שלה, הסביבה הזאת תומכת בהרבה מוצרים של Adobe כמו: Photoshop, After Effects ,Flex. זאת שפה עצמאית המתלבשת על שפת C, ומאפשרת לנו להריץ את הקוד שלנו ע"ג ה Gpu ולקבל ביצועים טובים יותר, קיימים עשרות דוגמאות כיצד לממש בעזרתו אפקטים ופילטרים רבים על תמונות ואפילו סרטים בעזרת After Effect, השפה יחסית נוחה לכתיבה והביצועים שלה באמת מרשימים.

שלב ראשון: נעים להכיר Pixel Bender

ניתן להוריד את ה Toolkit של Pixel Bender , באופן חופשי והוא מאוד מזכיר את ה Extended Script של Indesign , אותו ממשק משעמם וממש לא מובן אבל כנראה זה מה יש..., השפה עצמה לא כל כך מסובכת מה שבאמת מסובך הוא להבין כיצד לעבד את התמונה והחישובים שצריכים לעשות על הפיקסל בשביל לקבל את התוצאה שאנחנו מחפשים.

הרעיון הוא עיבוד כל פיקסל בתמונה בנפרד, קיימת פונקציה evalutePixel שמזכירה את הפונקציה Main של כל שפה אחרת שאנחנו מכירים, לפונקציה נשלח כל פעם פיקסל בודד מהתמונה ע"פ הקורדינטות של התמונה, ובעצם אותו אנחנו מעבדים ומחזירים בחזרה לזיכרון כתמונה חדשה וכל החישוב ע"ג ה Gpu שלנו.

קצת על הקוד:

כל קוד נפתח עם הכותרת הבאה:

< languageversion 1.0; >
  kernel NewFilter
   <
      namespace : "Your Namespace";
       vendor : "Your Vendor";
       version : 1;
       description : "your description";
    >

 הגדרת השפה שאיתה נעבוד, שם לפילטר, היצרן, גרסת השפה ותיאור.

{


   input image4 src;
   output pixel4 dst;

   void evaluatePixel()
  {
       dst = sampleNearest(src,outCoord());
   }
}

כל פילטר חייב לעבוד עם 2 פרמטרים גלובלים מסוג Input ו Output , ה Input מייצג את התמונה המקורית , Image4 חייב להיות מוגדר על מנת שהפונקציה Evaluate pixel תעבוד,4 Pixel מייצג אובייקט של פיקסל החוזר לתמונה, המורכב מ 4 הערוצים של RGBA- Red,Green,Blue,Alpha.
אז כמו שאמרתי בהתחלה הפונקציה evaluatePixel היא פונקצית ה Main שלנו, היא חייבת להחזיר פיקסל בודד בחזרה, במקרה שלנו קיימת הפונקציה sampleNearest דוגמת לנו את הפיקסל שהגיע מהתמונה המקורית , הפונקציה הפנימית outCoord מחזירה את הקורדינטות של הפיקסל המקורי ומשווים אותו ל dst שהוא הפיקסל החוזר ובעצם לא השתנה כלום בתמונה.
שימוש בפרמטרים חיצוניים:

Pixel Bender מאפשר לנו להעביר אליו פרמטרים מבחוץ לדוגמה מ Photoshop,Flash ו After Effects.
 parameter int size
<
   minValue:1;
   maxValue:50;
   defaultValue:1;
>

פונקציות:
  • Mathematical functions - פונקציות מתמטיקאיות על פיקסלים ובין פיקסלים.
  • Geometric functions - פונקציות גיאומטריות לחישוב מרחקים ורדיוסים בין פיקסלים.
  • Region functions - פונקציות על איזורים בתמונה.
  • Sampling functions - פונקציות דגימה של פיקסלים.
  • Intrinsic functions - פונקציות כלליות.
משתנים:
  • Scalar - משתני בסיס כמו Bool,Int,Float,Pixel
  • Vector - משתנים ויקטורים שמכילים בתוכם בין 2 ל 4 משתני Scalar לדוגמה Pixel 2 מכיל בתוכו 2 משתנים מסוג Pixel.
  • Matrix - משתנים למטריצות מכילים משתנים מסוג Vector \ Scalar לדוגמה Float4x4 מכיל בתוכו מטריצה מסוג של Float בגודל 4 שורות ועמודות.
ניתן לממש ביטויים רבים כמו If,For,While,Do אבל חייבים לשים לב אם זה נתמך באפליקציה שהולכת להריץ את הסקריפט לדוגמה לולאות לא נתמכות ב Flash לכן חשוב מאוד לדעת את התמיכה באפליקציות כי זה חלק חשוב בתכנון הפילטר.

דוגמה 1:
משחק בסיסי


חישובי צבעים , ושליטה על ערוץ צבע ספציפי.
דוגמה 2:
משחקי בהירות


שינוי בהירות התמונה ע"י פרמטר חיצוני.

דוגמה 3:
שליטה על ערוצי צבע


שליטה על ערוצי הצבע בעזרת פרמטרים חיצוניים.

דוגמה 4
משחק בין ערוצי הצבע


שינוי ערוצי הצבע במימוש פרמטר חיצוני בעזרת ביטוי IF, אפשרות השוואה ליותר מ 2 פרמטרים.

דוגמה 5:
טשטוש תמונה


נאספו 4 פיקסלים שמסביב הפיקסל המקורי , נבחרו ע"פ המרחק שעבר לנו בפרמטר החיצוני ואח"כ חולקו ב 5 על מנת לקבל פיקסל ממוצע של כל הפיקסלים כולל המקורי.

Graph Language

Pixel Bender מאפשר לנו אפשרות יחודית , אנחנו יכולים לשרשר פילטרים ביחד, כלומר פיקסל אחד יכול לרוץ על כמה Kernel שכל אחד מהם מייצג פילטר, ריבוי של הפונקציה evalutePixel מאפשר לנו שילוב של כמה פילטרים על פיקסל בודד.


כמו שהגדרנו קטע בלוק כ Kernel , אנחנו צריכים להגדיר בלוק של Graph , כרגיל גרסה , יצרן ותיאור של ה Graph , צריכים להגדיר Image4 גלובלי על מנת שיעבור בכל הפילטרים, כנ"ל גם לפיקסל שיוצא החוצה, לכל Kernel אנחנו מתייחסים כרגיל כמו שכבר ראינו, לאחר שכל הפילטרים מוכנים צריך להצהיר עליהם ברמת ה Graph  ,  בצורה זו יוצרים Node ב Graph.


  <graph name="IdentityGraph" xmlns:pbg="http://ns.adobe.com/PixelBenderGraph/1.0">
  <metadata name="namespace" value="Your Namespace">
  <metadata name="vendor" value="Your Vendor">
  <metadata name="version" type="int" value="1">

  <!-- Image inputs and outputs of the graph -->
  <inputimage name="global_src" type="image4">
  <outputimage name="global_dst" type="image4">
 
   <kernel>
                          Kernel Code Here!
   </kernel>
   <!-- Instances of the nodes -->
  <node id = "identity1" name ="Identity1" namespace = "Your Namespace" vendor = "Your Vendor" version ="1" >
</node>
   <kernel>
                          Kernel Code Here!
   </kernel>
   <!-- Instances of the nodes -->
   <node id = "identity2" name ="Identity2" namespace = "Your Namespace" vendor = "Your Vendor" version ="1" >
   </node>
 <kernel>
                         Kernel Code Here!
   </kernel>
    <!-- Instances of the nodes -->
    <node id = "identity3" name ="Identity3" namespace = "Your Namespace" vendor = "Your Vendor" version ="1" >
    </node>
   

לאחר שהגדרנו 3 בלוקים של Kernel והגדרנו להם Node על מנת שה Graph יכיר בהם נשאר להגדיר את הסדר שלהם, איזה פילטר יהיה ראשון ומה יבוא אחריו.
<!-- Connections -->
<connect fromImage="global_src" toNode="identity1" toInput="src"/>
<connect fromNode="identity1" fromOutput="dst" toNode="identity2" toInput="src"/>
<connect fromNode="identity2" fromOutput="dst" toNode="identity3" toInput="src" toImage="global_dst"/>
</graph>

גם בעבודה עם Graph Language צריך לשים לב לתמיכה, היא לא נתמכת ע"י Flash.

להורדה חינם מאתר Adobe , ניתן למצוא עשרות דוגמאות חינמיות באתר ה Exchange של Adobe.
בהצלחה...

יום שבת, 2 באפריל 2011

Mssql BackUp Application From Sketch

חשבתי רבות מה הדרך לעשות גיבויים עבור שרתי Mssql, תחילה הפתרון הפשוט להגדיר הגדרות של גיבויים ב Mssql עצמו, אבל רציתי יותר , רציתי לשמור כמה גרסאות של גיבויים לכל ה Databases שאני רוצה לגבות ע"פ זמנים שאני אקבע, רציתי גם לשמור לי את העותק של הגיבוי ע"ג שרת אחר ברשת שלי, רציתי גם לחסוך במקום ולקבץ את הקבצים בקיצור היו לי שאיפות.

אז תחילה ההיתי צריך לגבש מה בדיוק אני רוצה שהתוכנית תעשה, בהתחלה זה היה נראה דבר מאוד מובן לבצע גיבוי פשוט של ה Database אבל מה עם יכולת השליטה על מנגנון הגיבוי? , לכן דבר ראשון שחיפשתי זה שליטה, האפשרות להגיד למסד נתונים בצורה תכנותית - אני רוצה לגבות אותך אבל מרחוק... - אבל לפני הכל ההיתי צריך להבין איך מנגנון הגיבוי עובד במסדי נתונים מסוג Mssql.

אפשרויות גיבוי בעזרת Microsoft Sql Server 2005 :
בחנתי את צורת הגיבוי ב Mssql , זה נראה פשוט מאוד, לחצן ימני על ה Database שאנחנו רוצים לגבות:


השלב הבא הוא להגדיר לאן לשמור את קובץ ה Bak שזה פורמט הגיבוי עבור Mssql.

אין יותר מידי אפשרויות בוחרים נתיב לקובץ מומלץ שסוג הגיבוי יהיה Full, נותנים שם לגיבוי, וניתן להגדיר לו תוקף ע"פ ימים או תאריכים ספציפיים, אפשר להגיד שבגדול זה כל מה שצריך בתוכנת גיבוי ואלה הן התכונות העיקריות, שליטה על הזמנים היא גורם משפיע בכל הקשור למסדי נתונים הצורך להיות עם הנתונים המעודכנים ביותר הוא בלתי נמנע ולכן אפשרות זאת היא קריטית עבורי.


אבל מה בעצם לא ראיתי?
לא ראיתי את האפשרות לשמור לי גרסאות שונות ואם יש לי הרבה Databases העסק יכול להיות מסורבל, מה קורה אם אני רוצה לעשות זאת אוטומטי משרת מרוחק, ואולי גם לקבץ לי אותו ב Zip על הדרך ולשלוח לי אימייל כאשר הגיבוי התבצע, המון מחשבות רצו לי בראש ונראה לי שאני מתחיל להבין מה אני רוצה מהתוכנית הגיבויים שלי.
דרך נוספת שבדקתי היא אפשרות לגבות את הנתונים בעזרת משפט Sql , זה נראה אפשרי בעזרת הדוגמה הזאת:
BACK UP DATABASE db_name TO DISK = N'C:\backup\db_name.BAK'
אבל חסר לי פה מעקב על התהליך אני אף פעם לא יודע מתי הוא סיים ואם הוא סיים לגבות לכן הרעיון להשתמש במשפט Sql ירד משולחן הסירטוטים וההיתי צריך לחפש כיוון אחר...
הישועה הגיעה מה Mssql עצמו מסתבר של Mssql יש SDK רחב מאוד שתומך ב NET. מגרסה 2, יש מספר ספריות שנתנות לנו את האפשרות לשלוט ב Sql Agent שזה הוא ה Service שמנהל לנו את מסדי הנתונים.
Microsoft.SqlServer.ConnectionInfo
ספריה זאת אחראית על ההתחברות והאימות מול השרת.
 
Microsoft.SqlServer.Smo
מכיל מופע למנוע של ה Mssql , ובעצם זאת המחלקה העיקרית שנעבוד מולה.
 
מיקום הקבצים:
 
C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\9.0.242.0__89845dcd8080cc91
 
בנקודה זאת הבנתי שמצאתי את מה שאני מחפש, את השליטה , חזרתי לשולחן הסירטוטים והתחלתי לעצב את הרעיון של התוכנית.
 
 
שרת אחד מפעיל בתוכו תוכנית שמתחברת מרחוק למספר שרתים שמריצים Sql Server , בעזרת פקודה מרחוק השרתים מגבים את מסדי הנתונים ישירות ליחידת גיבוי, בשלב הזה הכל כבר נראה ברור , הרעיון שלי מגובש ואפשר להתחיל לכתוב את הקוד, במאמר זה אני יתאר את הקוד שמגבה בלבד למרות שהעלתי עוד רעיונות שיכולים להתלבש על המנגנון הזה אבל אותם אני אשמור לפעם אחרת.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace backup_mssql
{
   class Program
  {
    static void Main(string[] args)
    {
      BackupDeviceItem bdi = new BackupDeviceItem(@"\\storageunit\backup.bak",DeviceType.File);
      Backup bu = new Backup();
      bu.Database = "mydatabase";
      bu.Devices.Add(bdi);
      bu.Initialize = true;
      
      bu.PercentComplete += new PercentCompleteEventHandler(Backup_PercentComplete);
      bu.Complete +=new ServerMessageEventHandler(Backup_Complete);
     
      ServerConnection myconnection = new ServerConnection("192.1.1.1","username","password");
      Server server = new Server(myconnection);
      bu.SqlBackup(server);
      Console.WriteLine("Press any key to continue.");
      Console.ReadKey();
     }

     protected static void Backup_PercentComplete(object sender, PercentCompleteEventArgs e)
    {
      Console.WriteLine(e.Percent + "%.");
    }
   
    protected static void Backup_Complete(object sender, ServerMessageEventArgs e)
    {
      Console.WriteLine(e.ToString());
    }
  }
}

מעבר זריז על קוד מאפשר לנו לראות שתחילה אנחנו מגדירים Device , שבעצם מצביע לנתיב גיבוי חדש ע"ג יחידה חיצונית ברשת, קיימים 2 אירועים - קבלת האחוזים עד להשלמת התהליך , וסיום התהליך, קיימת נקודה חשובה בנוגע ל Device חשוב לזכור שה Sql Server Agent רץ עם הרשאות משלו ולפעמים לא ניתן לרשום את הגיבוי ליעד בגלל הרשאות כתיבה, לכן חשוב מאוד שכל ה Services של ה Mssql ירוצו עם הרשאות שמאפשרות כתיבה ליחידת גיבוי.

כפתור ימני על ה Service של Sql Server Agent אח"כ Log On יאפשר לנו להחליף את ההרשאות של ה Service למשתמש אחר.

בהצלחה...

יום שני, 28 במרץ 2011

SSH Starting Guide

SSH - בשמו המלא Secure Shell בעצם מאפשר תקשורת מאובטחת בין מחשבים ובא להחליף את ה Telnet, לפי מודל OSI הוא נמצא בשכבה השבעית ומשתמש ברכיבי SSL בשכבה ה 5, משתמש בפרוטוקול TCP ויוצא בדרך כלל בפורט 22.

קצת היסטוריה:

קיימות 2 גרסאות לתוכנית, הראשונה SSH-1 שנכתבה בשנת 1995 ע"י טאטו ילונן הוגה הרעיון וכשהבינו את הפוטינציאל יצאה גרסת SSH-2 עם שיפורי תקשורת ואבטחה, נוספו עוד אלמנטים רבים כמו העברת קבצים,ניתוב פורטים של TCP, ועבודה עם ממשקי X11.

מסתבר שהרעיון טוב אבל הביצוע לא כלכך טוב, במהלך השנים התגלו פריצות אבטחה שונות באפליקציה, הפריצה הראשונה נמצאה בשנת 1998 על גרסה 1.5, ונתנה להכניס לתוך ה Packet מידע לא מאושר, יצא מהר תיקון שנקרא SSH Compensation Attack Detector , הפירצה הבאה בשנת 2001 מאפשרת מציאה של הבלוק האחרון של IDEA-encrypted session שמכיל בתוכו את הצופן איתו אנו מצפינים את התקשורת, באותו חודש נמצאה פריצה נוספת שמאפשרת להעביר אימותים של משתמשים לשרתים אחרים.

בשנת 2006 יצא SSH-2 שמכיל בתוכו עדכוני אבטחה רבים אבל בשנת 2008 נמצאה פריצת אבטחה נוספת שמאפשרת לקודד חלקים מהמידע המוצפן בגלל הגדרות ברירת מחדל ושימוש בצפנים חלשים.

בואו נשחק:

צד שרת:
נפעיל את שירות ה SSH ע"ג השרת, קודם נבדוק אם ה Service עובד:
#: service sshd status

הפעלת השירות:
#: service sshd start

יצירת מפתח הצפנה
#: ssh-keygen -t dsa


בעצם נוצר לנו Private Key ו Public Key , בעזרת ה Public Key המשתמשים שמתחברים ל Server מצפינים את המידע וכשהוא מגיע לשרת ה Private Key שעומד מאחורי סיסמא שמגדירים בעת יצירת המפתחות מפענח את המידע.

המפתחות שלנו נמצאים בספריה המוסתרת ssh.


צד לקוח:
התחברות לשרת עם SSH:
#: ssh xxx.xxx.xxx.xxx




SSH Brute Force

השיטה הנפוצה לפריצה דרך SSH היא בשימוש Brute Force - הרצה של רשימת סיסמאות אקראיות מול ה Login עד לפגיעה בסיסמא הנכונה וכניסה למחשב המרוחק ,ב BackTrack קיים כלי למימוש ההתקפה שנקרא BruteSSH.
#: ./brutessh.py -h 192.168.1.104 -u root -d /wordlist/mylist.lst


שלחנו כתובת , שם משתמש במקרה שלנו root וקישור לרשימת מילים אקראית.

כיצד להגן על ה SSH שלי?
  • סיסמא מעל ל 8 תווים ממספרים ואותיות
  • הפניות ב Firewall לכתובות בטוחות בלבד.
  • שימוש בפורט אחר ממקום 22 - שינוי בקובץ sshd_config פרמטר Port.
  • לא לאפשר להתחבר כ Root - שינוי בקובץ sshd_config פרמטר PermitRootLogin.

לסיכום:

השימוש ב SSH רחב מאוד בכל מערכות ה Linux והפך לסוג של סטנדרט להתחברות מרחוק למרות פריצות ההאבטחה שבו, אם שומרים עליו כמו שצריך הוא מספק את הסחורה.

בהצלחה...

יום שבת, 26 במרץ 2011

Reverse Engineering With IDA

נושא ה Reverse Engineering או בעברית "הנדסה לאחור" הוא נושא מרתק ,מורכב ומאתגר , ראינו בעבר כבר דוגמה אחת ל Reverse Engineering בעזרת התוכנה Reflector שמראה לנו את הספריות של .Net וחושפת לנו את הפונקציות והמשתנים שבתוכנה שאנחנו רוצים לנתח, קיימים המון כלים בנושא והרשימה אינה נפסקת, זה תחום ענק שכל חברה רוצה שתהיה לה את האפשרות לנתח את המוצרים של המתחרים שלה על מנת שתוכל לבדוק ולגנוב ממנה רעיונות ופטנטים אבל לא רק חברות מעוניינות באפשרות הזאת, ראו את עולם משחקי המחשב הפיראטים שכל משחק חדש שיוצא מיד יוצאת לו גרסה פרוצה שמאפשרת לשחק את המשחק בחינם והכל בעזרת Reverse Engineering שנעשה על מערכות האבטחה של המשחק.


אז איך בדיוק עושים את זה?

Disassembler - זאת תוכנה שמאפשרת לנו להמיר שפת מכונה לשפת Assembler , ובעצם בצורה זאת נחשף לנו תרשים הזרימה של התוכנית , ניתן לראות את הפונקציות והמשתנים שהתוכנית מריצה וכך ניתן לראות את נקודות הבדיקה עבור סיסמאות או מספרים סיראלים ולהזריק לתוכה את המשתנים שלנו שיגרמו לתוכנית להתבלבל.

אז מה זה IDA?

Interactive Disassmbler - תוכנה שמאפשרת לנו לעשות Reverse Engineering , היא תומכת בהמון פלטפורמות וניתן לעשות איתה Debug לתוכנית ולעבור צעד צעד ולראות מה היא עושה וכיצד היא רצה.

נעבור על התוכנית שאותה נפרוץ , היא מדמה מערכת Login פשוטה שרשום בתוכה את הסיסמא שנדרש להכניס המשתמש.
#include stdio.h
#include conio.h
#include strings.h

int main()
{
   char line[100];
   printf("Welcome To CrackMe - Example For Authentication Application \n");
   printf("Enter Password for Login: \n");
   fgets(line,sizeof(line),stdin);

   int f;
   f = strcmp("crackmeifyoucan\n",line);

   if(f != -1 )
  {
     printf("Authentication Complete \n");
  }
  else
  {
     printf("Authentication Faild \n");
   }
     return 0;
}

כפי שניתן להבין מהתוכנית הסיסמא לכניסה היא crackmeifyoucan , ובעזרת פונקציית strcmp אנחנו בודקים את הקלט שהמשתמש מכניס,לאחר שהבנו את התוכנית שלנו נתחיל עם פיצוח ,תחילה יש להוריד את IDA מהאתר http://www.hex-rays.com/idapro/ אח"כ יש לפתוח את קובץ ה Exe של התוכנית שלנו.



לאחר טעינת הקובץ היפתח לנו טופס שאמור להראות כך:

IDA מכיל בתוכו המון אפשריות במאמר הזה אני יסביר באופן כללי על החלונות שאיתם נעבוד, החלון Name מכיל בתוכו את כל השמות - פונקציות , פרמטרים וממשקים.

החלון Strings מכיל את כל המחרוזות בתוכנית.


זה הוא ה Bar של התוכנית מרגע טעינת התוכנית בתוכנה  - כולל בתוכו גם את הקוד של הספריות הנלוות עבור הרצת התוכנית וגם את הקוד שלנו, הוא יראה לנו את כל הקוד שחלקו לא רלונטי כי הוא שייך לספריות החיצוניות שנטענות לפני פונקציית ה Main שלנו, נסייר בעזרת החץ עד שנמצא את הפונקציה.


sub_4013C0 הפונקציה Main של התוכנית כפי שניתן לראות בתמונה.



כפי שניתן לראות בתרשים התוכנה את סדר הפעולות שלה, הודעת פתיחה, הכנסת הסיסמא ובעצם ה IF שאומר לאן התוכנה אמורה להמשיך, כבר בשלב הזה ניתן לראות מה הסיסמא שהתוכנית מצפה לה.



כפתור ימני על שורת Strcmp יאפשר לנו הוספת BreakPoint ששם נעצור את התוכנית ונבצע Debug.


לאחר שקבענו BreakPoint ניתן להריץ את התוכנית.


נריץ את התוכנית , נכניס כל ערך לשדה הסיסמא ונחכה עד שהתוכנית תעצור ב BreakPoint שלנו.
נתקדם בתוכנית שלנו בעזרת הכפתורים הבאים (בדומה לשאר ה Debuggers , אפשרות להיכנס לפונקציה או לעבור לשורה הבאה).

נקפוץ עד השורה הבאה:

ונראה אם ה Zero Flag השתנה ב General Registers

אם הוא לא אפס אז הסיסמא שהכנסנו שגויה , ניתן לו ערך חדש:


בצורה זאת עקפנו את מנגנון הבדיקה של התוכנית והכנסנו ערך משלנו לאחר הבדיקה, בעצם גרמנו לתוכנית להמשיך כאילו הכנסנו את הסיסמא הנכונה, ניתן לראות את התהליך בסרטון הבא:


בהצלחה...

יום שישי, 4 במרץ 2011

Packet Sniffing With C

אחרי שהבנו איך לכתוב "חבילות מלוכלכות"  נסיים את נושא ה Raw Packet באיך להאזין לחבילות שלנו, הרעיון של המאמר הזה הוא להשלים את נושא ה Raw Socket ושלבו הסופי הוא כתיבת Sniffer שיקרא את החבילות שלנו מה Raw Socket ויציג לנו אותם בדומה ל TcpDump, אז כבר הבנו ממאמרים קודמים מה זאת חבילה וכיצד היא בנויה , נעבור על זה בקצרה - יש לנו חבילה מרכזית שמחולקת לחבילות קטנות המכילות מידע עבור התנועה שלה ברחבי הרשת ע"פ מודל OSI.

ה Sniffer שלנו הולך לתפוס רק את ה Protocol שאנחנו רוצים ולא את כל התנועה על מנת שנוכל להתמקד על הפרוטוקולים בצורה ובנייה שלהם למקרים שנרצה לכתוב חבילה דומה עם הכלים שלמדנו במאמרים הקודמים, אנחנו נמקד את ההאזנה שלנו ל 3 פרוטוקולים נפוצים - ICMP,TCP,UDP.


ICMP - Internet Control Message Protocol

מטרת הפרוטוקול הזה הוא לבדוק טעויות ותקלות ברשת הוא חלק מחבילת פרוטוקולים  Internet Protocol Suite שבתקן RFC 792 ואחד השימושים הנפוצים בו בדיקת זמני תגובה בעזרת חבילת Ping , ניתן גם למצוא חריגות, נניח ש Router מעביר את החיבלות שלו ברשת לנתבים או למחשבים אחרים הוא חייב להוריד את ה TTL - Time To Live  באחד  וכך גם המחשב אחריו עד שהחבילה מגיעה ליעד, אם ה TTL מגיע לאפס אבל החבילה עדיין לא היגיעה ליעד שלה חוזרת לנו הודעת שגיאה של הפרוטוקול - Time-to-live exceeded in transit.

מבנה של חבילה מסוג ICMP הוא פשוט מאוד, וקצר מאוד מכיל בתוכו 2 שורות ברוחב 32 ביט, השורה הראשונה מכילה לנו 8 ביטים של Type , ו 8 ביטים ל Code, ו 16 ביטים ל CheckSum, אם הוא נשלח בגרסת IPv4 אז נחשב רק את גודל החבילה של ה ICMP אבל אם הוא גרסה IPv6 יש חישוב של גודל החבילה עם Pseudo Header.



סוגים וקודים חוזרים:
Type
       0  Echo Reply
           Codes:
                      0 - Echo reply
       3  Destination Unreachable
           Codes:
                      0 - Destination network unreachable
                      1 - Destination host unreachable
                      2 - Destination protocol unreachable
                      3 - Destination port unreachable
                      4 - Fragmentation required
                      5 - Source route failed
                      6 - Destination network unknown
                      7 - Destination host unknown
                      8 - Source host isolated
                      9 - Network administratively prohibited
                     10 - Host administratively prohibited
                     11 - Network unreachable for TOS
                     12 - Host unreachable for TOS
                     13 - Communication administratively prohibited
       4  Source Quench
           Codes:
                     0 - Source quench (congestion control)
                        
       5 Redirect Message
          Codes:
                     0 - Redirect Datagram for the Network
                     1 - Redirect Datagram for the Host
                     2 - Redirect Datagram for the TOS & network
                     3 - Redirect Datagram for the TOS & host

       8 Echo Request
          Codes:
                    0 - Echo request

       9 Router Advertisement
          Codes:
                    0 - Router Advertisement

     10 Router Solicitation
          Codes:
                     0 - Router discovery/selection/solicitation

     11 Time Exceeded
          Codes:
                     0 - TTL expired in transit
                     1 - Fragment reassembly time exceeded

     12 Bad IP header
        Codes: 
                   0 - Pointer indicates the error
                   1 - Missing a required option
                   2 - Bad length
    
      13 Timestamp
         Codes:
                    0 - Timestamp
    
      14 Timestamp Reply
         Codes:
                    0 - Timestamp reply

      15 Information Request
          Codes:
                      0 - Information Request

      16 Information Reply
          Codes:
                     0 - Information Reply

      17 Address Mask Request
          Codes:
                     0 - Address Mask Request

       18 Address Mask Reply
         Codes:          
                     0 - Address Mask Reply
 
       30 Traceroute
          Codes:
                     0 - Information Request

TCP -Transmission Control Protocol

את החבילה הזאת אנחנו מכירים טוב כבר מאמרים קודמים אבל נעשה עליה חזרה קטנה, זה הפרוטוקול הנפוץ בעולם להעברת נתונים בין בין מחשבים ברשת, העברת המידע לשכבת האפליקציה ע"פ מודל ה OSI, יש לו שימושים רבים בהמון פרוטוקלים אפליקטיבים כמו HTTP,FTP,SSH ועוד.


הפרוטוקול מאוד אמין ומתבצעת בו "לחיצת יד" עם המחשבים שרוצים לפתוח תקשורת בניהם, משמעות לחיצת היד היא בעצם לאמת שהחבילה באמת תגיע ליעד - מחשב המקור שולח למחשב היעד חבילה עם Syn לביצוע Synchronize, מחשב היעד מחזיר הודעת Syn-Ack שמאשרת לנו את ביצוע ה Synchronize , והמחשב המקור שולח הודעה נוספת ליעד Ack , שבעצם פותח את העברת המידע בין המחשבים, כל חבילה משלב זה שתגיע ליעד תהיה עם דגל Ack.

קיימת בקרה על הפרוטוקול כאשר יש לחיצת יד כל חבילה מקבלת מספר בסדר עולה, כך שמחשב היעד יכול לעקוב אחרי החבילות במקרה שחבילה חסרה הוא יבקש אותה מחדש.

UDP - User Datagram Protocol
פרוטוקל מהיר עבור אפליקציות שלא דורשות אמינות ובקרה או שהן מבצעות אותן בעצמם, כלומר לאפליקציה לא איכפת לאבד חבילות מאשר תהליך האימות שמעקב את קבלת החבילה למשל מערכות Voip וטלפוניה משתמשות ב UDP.



כפי שניתן לראות מבנה החבילה מאוד פשוט בניגוד לחבילת TCP, סה"כ מעבירים פורט יעד ומקור, גודל החבילה עם המידע,ה CheckSum עם ה Ip Header והחבילה נשלחת אין לא בדיקה ולא בקרה.

אחרי שהבנו את הפרוטוקלים אפשר להתחיל לכתוב את הקוד, התוכנית שלנו מאוד פשוטה, היא יוצרת Raw Socket עבור הפרוטוקל שעליו נאזין ע"י המשתמש, התוכנה מפרקת את החבילה ומראה לנו את המידע שעובר בחבילה.



רכיבים נחוצים:

מערכת Linux במקרה שלי OpenSuse
Eclipse
קוד להורדה: