PDA

View Full Version : سوال: نوشتن برنامه ی پروکسی



debugger
چهارشنبه 23 فروردین 1391, 00:37 صبح
حتما همه ی شما با برنامه ی Proxifire کار کردین وقتی ip , port و پروتکل https را ست می کنید و یک یوزر و پسورد میدید و برنامه را می بندید

از این به بعد شما هر نرم افزاری یا هر مرورگری باز کنید از پروکسی ست شده استفاده می کند.

حال سوال من اینه که چطوری میشه برنامه ای شبیه به این نوشت که با اجرای اون برنامه و ست کردن پروکسی همه برنامه های داخل سیستم عامل برای وصل شدن به اینترنت از این برنامه استفاده کنند ؟؟

با تشکر

gsearch
چهارشنبه 23 فروردین 1391, 03:59 صبح
شما باید تنظیمات Internet Option در کنترل پنل رو تغییر بدید.
برای انجام این کار راحترین کار استفاده از رجیستری ویندوزه:
RegistryKey registry = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
registry.SetValue("ProxyEnable", 1);
registry.SetValue("ProxyServer", server + ":" + port);

در این حالت اگر IE باز باشه باید ریستارت بشه.

و یا با استفاده از WinInet اون رو رفرش کرد.
مثل نمونه زیر:

using System;
using Microsoft.Win32;
using System.Runtime.InteropServices;

namespace ConsoleApplication_SetProxy
{
class Program
{
[DllImport("wininet.dll")]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
public const int INTERNET_OPTION_REFRESH = 37;
static bool settingsReturn, refreshReturn;

private static void SetSystemProxy(string server, string port)
{
RegistryKey registry = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
registry.SetValue("ProxyEnable", 1);
registry.SetValue("ProxyServer", server + ":" + port);

settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}

static void Main(string[] args)
{
string server, port;
Console.WriteLine("Enter Proxy Server Address:");
server = Console.ReadLine();
Console.WriteLine("Enter Port NO:");
port = Console.ReadLine();

SetSystemProxy(server, port);
}

}
}

debugger
چهارشنبه 23 فروردین 1391, 07:12 صبح
دوست عزیز خیلی ممنونم از پاسختون

اما در این روش فقط برای IE پروکسی ست میشود . اگر برنامه proxifire را دیده باشین . می بینید که همه ی برنامه ها از یاهو مسنجر گرفته تا فایرفاکس و هر چیزی که با اینترنت سر و کار داره از پروکسی استفاده می کنه و کلا IP شما عوض میشه

من فکر می کنم با مباحث TCPClient , Socket, HttpRequest و ... در ارتباط هست . ولی روش و طرز کار را نمی دونم . چون شناخت کافی روی این مباحث ندارم

تو تالار هم جستجو کردم از این نوع مباحث حتی به تعداد انگشتان دست هم تاپیک نداریم !!!!!!

hakim22
چهارشنبه 23 فروردین 1391, 09:12 صبح
به نظر من کتاب Network programming for .net رو مطالعه بفرمایید . در مورد انواع پروتکل ها و کار با شبکه های محلی ، اینترنت و ftp کدهای نمونه نوشته و توضیحات مفصل ارائه کرده.

vof.ir
چهارشنبه 23 فروردین 1391, 11:44 صبح
با سلام
به نظر من انگار که یک جورایی میاد یک وی پی ان ایجاد میکنه، که خودکار تمام اتصالات را که از ویندوز خارج می شوند بر روی اون بستر هدایت میکند!

Esmail Solhkhah
چهارشنبه 23 فروردین 1391, 12:27 عصر
اما در این روش فقط برای IE پروکسی ست میشود . اگر برنامه proxifire را دیده باشین . می بینید که همه ی برنامه ها از یاهو مسنجر گرفته تا فایرفاکس و هر چیزی که با اینترنت سر و کار داره از پروکسی استفاده می کنه و کلا IP شما عوض میشبرنامه مزبور، دیفالت از پروتکل SOCKS استفاده میکنه که این پروتکل لایه پنجمی هست ، همونطور که میدونید اطلاعات بروزرها یا برنامه های کاربردی یا هر کوفت و زهر مار دیگه ای که

نیاز به استفاده از شبکه دارن از لایه اول شروع میکنن به پایین رفتن طبیعتا بروز شما هم از این قائده پیروی میکنه واسه همینه که تو روشهای مرسوم شما باید رو بروزری که استفاده

میکنید آدرس پروکسی سرور و پورت رو ست کنید چون بروزر تو لایه اول کار میکنه ولی پروتکل SOCKS تو لایه سشن هست و اطلاعات تمامی درخواست کنندگان لایه های بالاتر منجمله

لایه Application از این لایه عبور میکنن.

موفق باشید.

vof.ir
چهارشنبه 23 فروردین 1391, 18:12 عصر
تا عنوان تاپیک را د یدم خواستم بگم که کجایید آقای Esmail Solhkhah (http://barnamenevis.org/member.php?27551-Esmail-Solhkhah)
بله،
خب حالا برای دسترسی به همچین لایه ای و یا کد نویسی برای این لایه ، از کجا باید شروع کرد؟!؟!؟!؟

gsearch
چهارشنبه 23 فروردین 1391, 19:21 عصر
در این روش فقط برای IE پروکسی ست میشود
توی این روش پروکسی سیستم رو ست می کنید و در نتیجه هر برنامه توی ویندوز که از پروکسی سیستم استفاده می کنه، تحت تاثیر قرار می گیره.
البته برنامه های مختلف می تونن این تنظیمات رو نادیده بگیرند. مثلا توی فایرفاکس شما می تونی انتخاب کنی که از پروکسی سیستم استفاده بکنه یا بدون پروکسی و یا ...


من فکر می کنم با مباحث TCPClient , Socket, HttpRequest و ... در ارتباط هست .شما برای پیاده سازی پروکسی سرور بسته به اینکه چه امکاناتی رو نیاز دارید باید از این موارد استفاده کنید.
همانطور که آقا اسماعیل توضیح دادن، ابتدا باید مشخص کنید که می خواید از HTTP Proxy استفاده کنید یا SOCKS

در صورت استفاده از HTTP Proxy می تونید:
* توی لایه APPLICATION کار کنید و از کلاس HttpListener استفاده کنید.
در این صورت کار ساده تره و یه سری کارها راحت تر انجام می شه. ولی دست تون بسته است و محدودیت بیشتری برای کار با request و response های http دارید.
* یا توی لایه Transport و با استفاده از کلاس های Socket یا TcpClient و TcpListener برنامه تون رو بنویسید
در اینجا با جزئیات بیشتری سروکار دارید و کار بیشتری رو می طلبه. ولی محدویت توی کار با مدیریت درخواست ها و کار با هدرهای http و موارد دیگه ندارید.

اگه می خواین از SOCKS استفاده کنید (تا اونجایی که می دونم) باید توی لایه انتقال کار کنید و پروتکل ورژن مورد نظرتون رو خودتون پیاده سازی کنید، بر اساس تعریف RFC مربوطه.
فکر نکنم توی دات نت کلاس یا امکانات خاصی برای SOCKS وجود داشته باشه.
یه سرچ بزنید ببینید کتابخانه ای برای کار با SOCKS پیدا می کنید که کارتون رو ساده تر کنه (که احتمالا باید باشه)
به هر حال چون تجربه پیاده سازی SOCKS رو ندارم، بهتره در این مورد از تجربه دوستان دیگه استفاده کنید.

debugger
چهارشنبه 23 فروردین 1391, 20:56 عصر
با تشکر از همه دوستان
بنده میخوام از HTTP , HTTPS استفاده کنم . نیاز به Socks نیست .

از دوستان نمونه کد یا یک مرجع سریع اگر در اختیار دارید . لطفا بنده را راهنمایی فرمائید . چون وقت پیاده سازی زیادی برای نرم افزار ندارم

فرض کنید ما یک IP , Port در اختیار داریم میخواهیم برنامه ای بنویسیم که وقتی آی پی و پورت در اون ست شد و برنامه اجرا شد . همه ی برنامه های موجود در سیستم از اون استفاده کند. پروتکل HTTP , HTTPS هم مد نظر هست
حال میشه به صورت الگوریتمیک بفرمائید بنده چه کارهایی باید انجام بدم . چون با راهنمایی های شما بنده با چیز های زیادی اشنا شدم اما الان نمی تونم سر هم کنم

با تشکر از همه ی دوستان

gsearch
چهارشنبه 23 فروردین 1391, 22:53 عصر
بهترین منبع msdn هست.
برای شروع کار، به صورت خلاصه روند کار رو میگم
شما نیازه اطلاعاتی کلی درباره عملکرد پروتکل HTTP داشته باشی و با MultiThreading هم آشنا باشید.

با این پیش فرض شما برای شروع کار باید روی سرور (که می تونه به صورت Localhost هم باشه) به پورت مربوطه گوش بدی.

پس از دریافت هر درخواست اون رو به یک ترد برای هندل شدن ارسال کنی.
عملکرد این قسمت مربوط می شه به منطق پروکسی سرورتون. مثلا می تونی بعضی در خواست ها رو بلاک کنی، کش کنی و ...
قسمت اصلیش اینه که درخواست ورودی رو redirect می کنی به سرور مربوطه. پاسخ رو که از سرور دریافت کردی اون رو به کلاینت می فرستی.
روند کلی کار به صورت زیر است که شما مراحل 2 و 3 و 5 رو باید انجام بدی.

1- ارسال HTTP Request از طرف کلاینت
2- دریافت درخواست و بررسی هدر http
3- ارسال درخواست به http server
4- پردازش درخواست و ارسال پاسخ
5- دریافت پاسخ و ارسال آن برای کلاینت

MSDN یه مثال از HttpListener داره به اون نگاه بنداز. بعد HttpWebRequest و HttpWebResponse رو بررسی کن.
ساختار کلی کار به شکل زیر هست که باید بر اساس خواسته های مد نظرت تکمیلش کنی و یا تغییرش بدی.

private void test()
{
// آدرس و پورت پروکسی سرور
string prefix = "http://127.0.0.1:8080/";
HttpListener listener = new HttpListener();
listener.Prefixes.Add(prefix);
listener.Start();
while (true)
{
// گوش دادن برای درخواست جدید
HttpListenerContext context = listener.GetContext();
ThreadPool.QueueUserWorkItem(new WaitCallback(handleRequest), context);
}
}

private void handleRequest(object context)
{
// دسترسی به درخواست کلاینت
HttpListenerRequest request = ((HttpListenerContext)context).Request;
// بررسی هدر و کارهای دیگه

// ارسال درخواست به سرور اصلی
// و دریافت پاسخ

// ارسال پاسخ به کلاینت
HttpListenerResponse response = ((HttpListenerContext)context).Response;
// مقدار دهی هدر و بدنه پاسخ
}

vof.ir
چهارشنبه 30 فروردین 1391, 16:53 عصر
با اجازه اساتید من تحلیل و درک خودم از مسئله را می نویسم

پروکسی فایر را مبنا قرار می دهم.
این نرم افزار میاد به نوعی عمل می کند که تمام درخواست هایی که در از کامپیوتر به بیرون میخواهند بروند را از طریق خودش به عبور می دهد و جواب های بازگشتی را نیز به همین صورت،

خب فایر فاکس و دانلود منیجر و .. میان با یک پورتی که برای خودشان هست یک اتصال به بیرون برقرار می کنند و درخواست هاشون را ارسال می کنند و جواب هاشونو از اون طریق می گیرند.
خب اگر ما بخواهیم به پورت هایی که این نرم افزار ها برای اتصال به بیرون ازشون استفاده می کنند گوش دهیم، باید به طریقی بفهمیم که شماره پورتها چند هستند؟

مسئله دیگر هم اینه که، توی خود نرم افزار مثلا پروکسی فایر، باید کاری شبیه به نت انجام بشه به این طریق که ، مثلا فایر فاکس میاد از پروت 3423 به سرور یاهو درخواست می فرسته،
خب ما این وسط پروکسی فایر داریم که اومده به پورت 3423 فایر فاکس گوش میده و درخواست به سرور یاهو را از فایر فاکس میگیره و خود پروکسی فایر اون درخواست را میفرسته به سرور یاهو، سرور یاهو هم جواب را ارسال میکنه
و پروکسی فایر که داره مثلا با پورت 7895 کار میکنه، اون جواب را میگیره و اینجاست که باید کاری شبیه به نت انجام بشه، یعنی این جواب را به پورت 3423 که فایر فاکس داره بهش گوش میده بفرسته.
تا بدین جا را موافق هستید؟

اون بحثی که بیاییم با httpListener کار کنیم،
خب در این روش که کدش هم بالا هست باز ما داریم به یک پورت خاص گوش می دهیم . یعنی 8080، و خب مجبوریم به همه بگیم که به این پورت درخواستتان را ارسال کنید. درسته؟ که این با پروکسی فایر تضاد دارد.
از طرفی من فکر میکنم که یه جایی هست که به صورت پیش فرض، این کارهایی که من گفتم را انجام میده، یعنی دروازه خروجی ورودی سیستم عامل به نت هست،

حالا با این تفاسیر، چه باید کرد؟

gsearch
پنج شنبه 31 فروردین 1391, 03:29 صبح
تحلیلت تقریبا درسته.

من اینجوری بیانش می کنم.
یک پروکسی سرور داریم که میاد درخواستهای ورودی رو دریافت می کنه، هر بلایی که می خواد سرشون میاره و بعد پاسخ رو ارسال می کنه. (مثله همون چیزی که پست قبلی گفتم)
این قسمت رو می شه با سوکت پروگرمینگ حل کرد.

یک قسمت کار هم مربوط می شه به redirect کردن تمامی درخواست های به پورتی که پروکسی سرور ما داره بهش گوش می ده.
بخش چالش برانگیزش این قسمته.
یه راهش که توی پستهای قبلی گفتم، تغییر تنظیمات پروکسی سیستمه که مدنظرتون نیست.

راه دومش که مد نظر شماست و تا اونجایی که می دونم با سی شارپ شدنی نیست، سر و کله زدن با سیستم کالها یا بهتر بگم api های ویندوزه.
در واقع شما با hook کردن Winsock می تونین درخواست هایی که از کلیه سوکت ارسال میشن رو دریافت کنید و ...
برای اینکار هم باید برین توی دنیای driver نویسی. یا حداقل با استفاده از ابزارهای دیگه بتونین با ++C این کار رو انجام بدین.

برنامه FreeCap (http://www.freecap.ru/eng/?p=download)تقریبا همین کار رو می کنه. شاید بتونین ازش ایده بگیرین. ( سورسش دلفیه )

یه نگاهی هم به این (http://stackoverflow.com/questions/2214053/c-redirect-outgoing-connections)بندازین بد نیست. اینجا گفته برای ویندوز ویستا به بعد میشه از WFP (http://msdn.microsoft.com/en-us/windows/hardware/gg463267.aspx) استفاده کرد.

فکر کنم مباحث تخصصی میشه و نیازه زمان بیشتری برای فعالیت در این زمینه صرف کنید.

vof.ir
پنج شنبه 31 فروردین 1391, 12:34 عصر
ممنون از توضیح خوب شما
لینکهای خوبی را هم معرفی کرده بودید.
فقط اینکه، صحبتی که من داشتم درست هست یا نه؟ میخوام بدونم برداشت من و تحلیل من صحیح هست یا خیر؟

gsearch
جمعه 01 اردیبهشت 1391, 01:22 صبح
همونطور که تو پست قبلی گفتم بله.
کلیت کار همینه.
موفق باشی

aminalimirzaei
چهارشنبه 22 شهریور 1391, 16:08 عصر
حتما همه ی شما با برنامه ی Proxifire کار کردین وقتی ip , port و پروتکل https را ست می کنید و یک یوزر و پسورد میدید و برنامه را می بندید

از این به بعد شما هر نرم افزاری یا هر مرورگری باز کنید از پروکسی ست شده استفاده می کند.

حال سوال من اینه که چطوری میشه برنامه ای شبیه به این نوشت که با اجرای اون برنامه و ست کردن پروکسی همه برنامه های داخل سیستم عامل برای وصل شدن به اینترنت از این برنامه استفاده کنند ؟؟

با تشکر

سلام.من هم دقیقا همین مشکل شمارو دارم همه نقل قول ها رو هم خوندم اما چیزای که گفته بودن کافی نبود اگه خودتون به نتیجه ای رسیدید حتما توی این تاپیک بذارینش