PDA

View Full Version : تجزيه httpHeader از ارتباطي با پروتكل tcp



youngold
شنبه 17 تیر 1391, 17:51 عصر
وقتتون بخير

در يك كانكشن با پروتكل tcp ميخوايم از ابتداي اولين پاكت كه در اون http header حاوي فيلد هاي http response هست فيلد host در http header رو به دست بياريم اما اين فيلد در http request وجود داره و اين response جواب درخواست هست ، چون با raw socket داريم پاكت ها رو دريافت ميكنيم ، پيشنهاد شما براي به دست آوردن , host ,uri چيه؟

نمونه زير از http response هست كه با گوش دادن به اولين پاكت دريافت شده داريمش كه همونطور كه ميبينيد ابتداي اون http header هست

"\b\n???\0\f??HTTP/1.1 200 OK\r\nDate: Sat, 07 Jul 2012 12:39:03 GMT\r\nExpires: -1\r\nCache-Control: private, max-age=0\r\nContent-Type: text/html; charset=UTF-8\r\nServer: gws\r\nX-XSS-Protection: 1; mode=block\r\nX-Frame-Options: SAMEORIGIN\r\nContent-Length: 25422\r\nConnection: Keep-Alive\r\nContent-Encoding: gzip\r\n\r\n?\b\0\0\0\0\0???y{???8?>???8bM??/Rh??8K?6I????pmJ?I?K}?w\v\t???4=????uCa\f?`0 ???]7v???kM?i??\0??0???'??N??\"??M?<mnf????N??x?;x ????`????????????#?3i??u??{?k?3?N?$??'???,h?{ vx2\b????????Efnk?^??,??\b?%YkJf??,???D-?#?<??V?&^??.?y?!?wA?<?l?OH???S???\tf\bTt???L?X??9i? MZ?\b?8v??v?g?%I?*\vi??D???%??'g!????N2\v }????J?`??0\"????????Z???#mx?|??y???c??O????zhF????g?&????-{|>\t#?M????I\a??y???[[k???????t??@LBR(??????\a?:k???1Z:@??@??,?\a?dG? C?5??NY?m???4N>????????????v????7???n??o????6???cn????nw?;4\a?? A?Vw\b????'???-???\vWV?? ?|2??t?5?L#?>?r????@?= ??????4#?^???3????ul??\0???F\aR???k\\??/?????Z?\b?I'r\fB???????g^????Fg?????%??z??{?? ????1?Z?8??w??5???N??????t??0u????9cP6l{?\t\f,?? 7m3?fG??`?????5\a??:Y???C[????????????? ?k??L??H?I'????kk?rT[????h5`y???W?_k???(??E?:?`???br?^????1?????P??? ???????S??i(????#+O???????c???\0bk???x?Z????g?? ?????d:??????td??\f??Hsv?]s???}?????|?v??\v?]\nZ.??N?Z?!P?E+f??%????u?';????8???e?1?9??? mS?cu\rg?X?5?j?f;?\tgI??|?G?C0&?2?/~2??B???~?~??h???I?~??????c?$???V??:?<???{I??DZv?/?"


نكته ديگه اينكه وقتي اين يا هر response رو utf8.getstring و يا ascii.getstring ميگيريم كد هاي بهم ريخته ديكُد نميشه

مرسي ، لطفاً پيشنهادتون رو بگيد

youngold
یک شنبه 18 تیر 1391, 00:39 صبح
دوستان كلاسي براي تجزيه http header نداريد؟

youngold
یک شنبه 18 تیر 1391, 01:05 صبح
دوستان اين ارتباط از طريق browser هست كه وقتي يك آدرس رو ميزنه header response رو ميخوايم كه دامين هم توشه.

Saeed_m_Farid
یک شنبه 18 تیر 1391, 11:20 صبح
سلام
دوست عزیز، می‌دونم از دست من شاکی هستی (چون تاپیک قبلی (http://barnamenevis.org/showthread.php?349323) رو نصفه کاره ول کردی اومدی اینجا) ولی فکر کنم حرف بدی نزدم و صحبت‌ام فقط اینه که اگه درست سوال بپرسین، زودتر و بهتر جواب می‌گیرین. پس بنظرم بهتره نه خودتون رو گیج کنید، نه دیگران رو؛ خیلی از مواردی که تو تاپیک‌هاتون ذکر می‌کنید فقط شامل برداشت‌های اشتباه / بی‌معنی فنی هستند، چرا؟




در يك كانكشن با پروتكل tcp ميخوايم از ابتداي اولين پاكت كه در اون http header حاوي فيلد هاي http response هست فيلد host در http header رو به دست بياريم اما اين فيلد در http request وجود داره و اين response جواب درخواست هست
چون با raw socket داريم پاكت ها رو دريافت ميكنيم ، پيشنهاد شما براي به دست آوردن , host ,uri چيه؟
نكته ديگه اينكه وقتي اين يا هر response رو utf8.getstring و يا ascii.getstring ميگيريم كد هاي بهم ريخته ديكُد نميشه




اونجا هم گفتم، وقتی دارید در لایه Application کار می‌کنید، دیگه با لایه‌های پایین‌تر نباید کار داشته باشید: قبول! شما از TCP استفاده می‌کنید، ولی وقتی درخواست Http می‌فرستید دیگه معلومه روی چی سوار هستید و نیاز نیست خودتون رو با اون لایه درگیر کنید (مگر اینکه قصدتون نوشتن پورت اسکنر و DDOS و ... باشه که کار خوبی نیستن!)، چون فقط باعث سردرگمی بیشترتون میشه؛ بعنوان نمونه در Responses ما چیزی بنام Host نداریم! پس جای غلطی دارید دنبال Host می‌گردین، ضمناً به Resource های پروتکل HTTP پکت نمی‌گن، اصطلاحاً متدها یا verbs نامیده میشن که شامل نه مِتُد (HEAD، GET، POST، PUT، DELETE، TRACE، OPTIONS، CONNECT، PATCH) هست و ما عموماً با GET / POST کار می‌کنیم (پروتکل باینری نیست که لازم باشه اسامی عجیب غریب روش بذاریم، پکت، دیتاگرام و ... بنا به برداشت من، معمولاً به واحدهای اطلاعاتی شامل مقادیر باینری اطلاق میشه)
شما نمی‌تونید برای ویندوزهای معمول و درشرایط عادی با Raw Sockets (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v=vs.85%29.aspx) کار کنید! در Windows Vista، Windows XP-SP3، Windows XP-SP2 و Windows 7 ارسال و دریافت اطلاعات روی Raw Sockets محدود شده، مگر اینکه فقط از ویندوزهای عهد بوقی یا نسخه های سرور استفاده کنید[1]
وقتی دات نت، اینقدر کلاس آماده و کامل (WebRequest و HttpWebRequest و HttpWebResponse) برای اینکار در دسترس شما قرار داده، اینکار کاملاً غیراصولی و اشتباه هست! کسی که میخواد Header یه پروتکل رو decode کنه، باید خود پروتکل رو بنظر من حفظ باشه، اونهم پروتکل ساده‌ای مثل HTTP ...

پیشنهاد: مطالعه لینک زیر رو برای آموزش گام به گام برای کارهای فضولی! داخلی و Header پروتکل ها و ... پیشنهاد می‌کنم:

Client (and Server) Sockets Communication (http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8h.html)


__________________________
[1]: جهت جلوگیری از برنامه های Port scanner و استفاده های مخرب برای چیزایی مثل SharpPcap (http://sourceforge.net/apps/mediawiki/sharppcap/index.php?title=Main_Page) و ... کلاً در ویندوزهای دسکتاپ، آب رو از ورودی بستن! مطابق با بند آخر این مقاله MSDN (http://msdn.microsoft.com/en-us/library/ms740548%28VS.85%29.aspx):

http://barnamenevis.org/images/misc/quote_icon.png



Limitations on Raw Sockets

On Windows 7, Windows Vista, Windows XP with Service Pack 2 (SP2), and Windows XP with Service Pack 3 (SP3), the ability to send traffic over raw sockets has been restricted in several ways



TCP data cannot be sent over raw sockets.
UDP datagrams with an invalid source address cannot be sent over raw sockets. The IP source address for any outgoing UDP datagram must exist on a network interface or the datagram is dropped. This change was made to limit the ability of malicious code to create distributed denial-of-service attacks and limits the ability to send spoofed packets (TCP/IP packets with a forged source IP address).
A call to the bind (http://msdn.microsoft.com/en-us/library/ms737550%28v=vs.85%29.aspx) function with a raw socket for the IPPROTO_TCP protocol is not allowed. Note The bind (http://msdn.microsoft.com/en-us/library/ms737550%28v=vs.85%29.aspx) function with a raw socket is allowed for other protocols (IPPROTO_IP, IPPROTO_UDP, or IPPROTO_SCTP, for example).

These above restrictions do not apply to Windows Server 2008 R2, Windows Server 2008 , Windows Server 2003, or to versions of the operating system earlier than Windows XP with SP2.

Note The Microsoft implementation of TCP/IP on Windows is capable of opening a raw UDP or TCP socket based on the above restrictions. Other Winsock providers may not support the use of raw sockets.
There are further limitations for applications that use a socket of type SOCK_RAW. For example, all applications listening for a specific protocol will receive all packets received for this protocol. This may not be what is desired for multiple applications using a protocol. This is also not suitable for high-performance applications. To get around these issues, it may be required to write a Windows network protocol driver (device driver) for the specific network protocol. On Windows Vista and later, Winsock Kernel (WSK), a new transport-independent kernel mode Network Programming Interface can be used to write a network protocol driver. On Windows Server 2003 and earlier, a Transport Driver Interface (TDI) provider and a Winsock helper DLL can be written to support the network protocol. The network protocol would then be added to the Winsock catalog as a supported protocol. This allows multiple applications to open sockets for this specific protocol and the device driver can keep track of which socket receives specific packets and errors. For information on writing a network protocol provider, see the sections on WSK and TDI in the Windows Driver Kit (WDK).

youngold
پنج شنبه 05 مرداد 1391, 17:01 عصر
اينقدر هم كه گفتي پيچيده نبود حلش كردم از دست بي خوابي ...
كافي بود ميگفتي همون httpHeader توي محتوا بسته ها (كه به مرورگر ميره و مياد) هست !
مسئله بسيار ساده اي بود!
البته خيلي وقت از زدن اين تاپيك گذشت ولي باز گفتم نتيجه رو بگم كسي ديگه تاپيك رو ميخونه متوجه بشه چي شد