کتابخانه‌ی استاندارد · شبکه

تروجان net.trojan

پروتکل تروجان: کارخواه و کارساز TLS که مثل یک سایت HTTPS معمولی دیده می‌شوند، یک وب‌سایت جایگزین برای همه‌ی کسانی که کارخواه نیستند، حالت وب‌سوکت، UDP و اتصال‌دهنده‌ی زنجیره‌ی پراکسی.

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

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

تروجان پروتکل پراکسی‌ای است که طوری ساخته شده که چیز خاصی از آن به چشم نیاید. کارخواه یک اتصال TLS معمولی به یک کارساز باز می‌کند و یک سطر می‌فرستد که درهم گذرواژه و مقصد خواسته‌اش را دارد؛ اگر درهم درست باشد کارساز به آنجا وصل می‌شود و بایت‌ها را رله می‌کند. اگر بایت‌های نخست درخواست معتبر تروجان نباشند، کارساز شکایتی نمی‌کند. اتصال را با همه‌ی بایت‌هایش به یک وب‌سایت معمولی می‌دهد، پس بازدیدکننده یا کاوشگر از یک سایت واقعی یک صفحه‌ی واقعی می‌گیرد. این بسته هر دو سمت را دارد: شماره گیری کارخواه است و سرویس‌دهی کارساز را راه می‌اندازد. به تونل هم وصل می‌شود، به شکل پذیرنده تروجان و اتصال‌دهنده برای مسیریابی و زنجیره‌ی پراکسی. برای دیدن اینکه تکه‌ها در یک برنامه چگونه کنار هم می‌نشینند، ساختن برنامه‌ای به سبک v2ray یا VPN را بخوانید.

ایده‌های اصلی:

  • گذرواژه هرگز فرستاده نمی‌شود. آنچه روی سیم می‌رود درهم SHA-224 آن است (درهم گذرواژه) به شکل ۵۶ نویسه‌ی هگز. کارساز درهم‌ها را نگه می‌دارد (افزودن گذرواژه، افزودن درهم گذرواژه).
  • TLS پنهان می‌کند. درخواست تروجان درون جریان TLS است و کارسازی با گواهی معتبر و یک وب‌سایت واقعی در درگاه جایگزین مثل هر سایت HTTPS دیگر دیده می‌شود.
  • شکست بی‌صدا است. گذرواژه‌ی غلط، یک مرورگر، یک پویشگر: همه سایت جایگزین را می‌گیرند. جایگزین‌شده آن‌ها را می‌شمارد.
  • پیوند اتصالی روی TCP، TLS یا وب‌سوکت است. شماره گیری یکی برمی‌گرداند؛ با خواندن پیوند و نوشتن متن پیوند بخوانید و بنویسید و با بستن پیوند ببندید. با وب‌سوکت تروجان را درون یک وب‌سوکت می‌برد تا CDN یا پراکسی معکوس بتواند جلویش بنشیند.
  • شماره گیری یو دی پی یک نشست UDP باز می‌کند که هر بسته مقصد خودش را نام می‌برد (ارسال یو دی پی، خواندن بسته یو دی پی).

چیزهایی که آدم را گیر می‌اندازد:

  • از TLS با گواهی واقعی استفاده کنید. سرویس‌دهی کارساز واقعی است. سرویس‌دهی بدون رمز و سرویس‌دهی وب‌سوکت TLS ندارند: درهم گذرواژه و همه‌ی ترافیک برای هر کس سر راه خواناست و درهم قابل بازپخش است. آن‌ها را روی loopback، در آزمون، یا پشت پراکسی معکوسی که TLS را تمام می‌کند به کار ببرید. ناامن بررسی گواهی را خاموش می‌کند؛ بیرون از آزمون هرگز.
  • سایت جایگزین باید واقعی باشد. جایگزینی که نباشد، خالی باشد یا آشکارا ساختگی باشد کارساز را به‌آسانی قابل شناسایی می‌کند. بدون درگاه جایگزین کارخواه ناموفق فقط قطع می‌شود که خودش نشانه است. محتوای واقعی بدهید، روی همان دستگاه و با همان نام گواهی.
  • حالت وب‌سوکت جایگزین ندارد. کارخواه ناموفق سرویس‌دهی وب‌سوکت فقط بسته می‌شود. بگذارید پراکسی معکوسِ جلو تصمیم بگیرد دنیای بیرون چه ببیند.
  • حفاظت در برابر بازپخش نیست. درخواست nonce ندارد، پس هر کس بتواند آن را بخواند (اتصال ساده، بررسی گواهی خراب) می‌تواند بازپخشش کند. سانسورشکن یک سانسورشکن.حافظه تکرار و یک سانسورشکن.نگهبان کاوش دارد، ولی این بسته خودش از آن‌ها استفاده نمی‌کند.
  • کارساز کجا گوش می‌دهد. سرویس‌دهی (حالت تی ال اس) روی هر رابط IPv4 گوش می‌دهد چون چهره‌ی عمومی کارساز است؛ پس گذرواژه‌های طولانی و تصادفی بگذارید. سرویس‌دهی بدون رمز و سرویس‌دهی وب‌سوکت مگر bind_host چیز دیگری بگوید روی 127.0.0.1 گوش می‌دهند؛ 0.0.0.0 را فقط وقتی بدهید که چیزی زیر کنترل شما از بیرون به آنها می‌رسد.
  • گذرواژه و درهمش هم‌ارزند. هر کس درهم را داشته باشد می‌تواند احراز شود. پیکربندی را مثل پرونده‌ی گذرواژه نگه دارید.
  • پیوند یک تونل.جریان نیست. پیوند نوع اتصال خود بسته است. برای تونل.زنجیره و مسیریابی از سازگارکننده‌های اتصال‌دهنده و پذیرنده تروجان استفاده کنید که روی جریان‌ها کار می‌کنند.

یک کارساز، یک کارخواه و یک جایگزین

این برنامه همه‌ی ایده را روی loopback و بدون گواهی اجرا می‌کند: یک کارساز تروجان جلوی یک سرور پژواک، با یک وب‌سرور به عنوان جایگزین. کارخواه واقعی پژواک را می‌گیرد؛ هر کس دیگری ترافیک وب معمولی به همان درگاه می‌فرستد و صفحه‌ی وب را می‌گیرد. در کار واقعی سرویس‌دهی همین رفتار را با TLS جلویش اضافه می‌کند.

net-trojan-guide-loopback.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.تی سی پی
واردسازی شبکه.تروجان
واردسازی همگام سازی

ناپایا echo_port := 0
ناپایا web_port := 0
ناپایا web_seen := ""
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع echo_server():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تا درست:
            data := تی سی پی.خواندن(c، 4096)
            اگر data.طول() برابر 0:
                بشکن
            پایان
            تی سی پی.نوشتن(c، "echo:" + data)
        پایان
        تی سی پی.بستن(c)
    پایان
پایان

تابع web_server():
    srv := تی سی پی.پیوند(0)
    web_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        web_seen = تی سی پی.خواندن(c، 4096)
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: 12\r\nConnection: close\r\n\r\nhello probes")
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_servers():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(echo_server)
    _b := نخ‌ساز(web_server)
    همگام سازی.انتظار(ready)
پایان

تابع text_of(p: تهی*، n: صحیح): رشته:
    buf := حافظه.تخصیص((n + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، p، n برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    برگشت buf برگردان رشته
پایان

تابع read_text(l &: تروجان.پیوند، want: صحیح): رشته:
    buf := حافظه.تخصیص(8192 برگردان طبیعی۶۴)
    دیرکن حافظه.آزادسازی(buf)
    ناپایا out := ""
    تا out.طول() کوچکتر want:
        n := تروجان.خواندن پیوند(l، buf، 8192)
        اگر n کوچکتربرابر 0:
            بشکن
        پایان
        out += text_of(buf، n)
    پایان
    برگشت out
پایان

تابع ریشه:
    start_servers()
    ناپایا config := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(config، درست)
    تروجان.افزودن گذرواژه(config، "secret")
    تروجان.تعیین جایگزین(config، "127.0.0.1"، web_port)
    server := تروجان.سرویس‌دهی بدون رمز(config، 0)

    ناپایا client := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "secret")
    client.با تی ال اس = نادرست
    ناپایا link := تروجان.شماره گیری(client، "127.0.0.1"، echo_port)
    تروجان.نوشتن متن پیوند(link، "through trojan")
    سرچاپ read_text(link، 19)
    تروجان.بستن پیوند(link)

    stranger := تی سی پی.شماره گیری("127.0.0.1"، server.درگاه)
    تی سی پی.نوشتن(stranger، "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
    سرچاپ تی سی پی.خواندن(stranger، 4096).زیررشته(0، 15)
    تی سی پی.بستن(stranger)
    تروجان.توقف(server)
پایان
خروجیecho:through trojan HTTP/1.1 200 OK

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

ناپایا config := تروجان.پیکربندی کارساز جدید("fullchain.pem"، "privkey.pem")
تروجان.افزودن گذرواژه(config، "یک گذرواژه‌ی بلند و تصادفی")
تروجان.تعیین جایگزین(config، "127.0.0.1"، 8080)
server := تروجان.سرویس‌دهی(config، 443)

استفاده از تروجان در زنجیره‌ی پراکسی

برای مسیریابی و زنجیره، اتصال‌دهنده درخواست تروجان را روی هر جریانی که از پیش به کارساز می‌رسد می‌نویسد و پذیرنده تروجان آن را سمت کارساز می‌خواند. جریان زیرین تعیین می‌کند چه چیز خصوصی است: روی جریان TCP ساده این گام خواناست، پس زیرش TLS بگذارید. با یک تونل.شماره‌گیر که TLS را به عنوان بالادست می‌دهد، تونل.از طریق یک خروجی کامل می‌سازد:

hop := تروجان.اتصال‌دهنده جدید("proxy.example.com"، 443، "یک گذرواژه‌ی بلند و تصادفی")
outbound := تونل.از طریق(your_tls_dialer، hop)

راهنمای تونل کل خط لوله را با همین اتصال‌دهنده نشان می‌دهد. برای کارخواهی که مسیریابی نمی‌خواهد، شماره گیری خودش TLS را انجام می‌دهد و ساده‌تر است.

چه باید دانست

  • سرویس‌دهی را با گواهی واقعی و وب‌سایت جایگزین واقعی به کار ببرید. سرویس‌دهی بدون رمز و سرویس‌دهی وب‌سوکت برای loopback، آزمون و استفاده پشت چیزی هستند که TLS را تمام می‌کند.
  • حفاظت در برابر بازپخش و محدودکننده‌ای در برابر حمله‌ی brute force ندارد. گذرواژه‌های بلند و تصادفی بگذارید.
  • کارساز در حالت TLS روی هر رابط IPv4 و در حالت ساده و وب‌سوکت روی loopback گوش می‌دهد؛ با تعیین میزبان شنود عوضش کنید.
  • IPv6 کار می‌کند: کارساز می‌تواند روی ::1 یا :: گوش دهد (تعیین میزبان شنود)، هدف‌های TCP و UDP می‌توانند IPv6 باشند و آزمون‌های loopback روی ::1 اجرا می‌شوند. نام مقصد را کارساز حل می‌کند.
  • UDP درون همان اتصال اجرا می‌شود. خواندن بسته یو دی پی هر بار یک بسته می‌دهد.
  • آنچه می‌گیرید آزاد کنید: بستن پیوند برای پیوند، آزاد کردن نشست برای نشست.
  • هیچ گزارشی خودکار نوشته نمی‌شود.

گونه‌ها

اتصال‌دهنده Connector

ساختار اتصال‌دهنده
یک گام تروجان از یک تونل.زنجیره: روی جریانی که از پیش به کارساز تروجان می‌رسد درخواست تروجان را برای یک مقصد می‌نویسد. با اتصال‌دهنده جدید ساخته می‌شود. برای خصوصی بودن این گام، جریان زیرین باید از پیش رمزشده (TLS) باشد.
نامانگلیسیگونهتوضیح
نشانی کارسازserverتونل.نشانینشانی کارساز تروجان.
گذرواژهpasswordرشته = ""گذرواژه. به شکل درهم SHA-224 فرستاده می‌شود.
net-trojan-Adapter.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.تروجان
واردسازی شبکه.تونل
واردسازی فشرده سازی

تابع text_of(p: تهی*، n: صحیح): رشته:
    buf := حافظه.تخصیص((n + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، p، n برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    برگشت buf برگردان رشته
پایان

تابع ریشه:
    hop := تروجان.اتصال‌دهنده جدید("vpn.example.com"، 443، "password")
    سرچاپ hop.نام()، hop.کارساز().میزبان، hop.کارساز().درگاه

    pair := تونل.لوله جدید()
    سرچاپ hop.دست‌دهی(تونل.سر اول لوله(pair)، تونل.نشانی جدید("example.com"، 443))
    ناپایا expected := تروجان.کدگذاری درخواست("password"، تروجان.فرمان اتصال، "example.com"، 443)
    buf := حافظه.تخصیص(256 برگردان طبیعی۶۴)
    n := تونل.سر دوم لوله(pair).خواندن بایت(buf، 256)
    سرچاپ n، n برابر expected.طول، text_of(buf، n) برابر text_of(expected.داده، expected.طول)

    ناپایا inbound := تروجان.پذیرنده جدید()
    تروجان.افزودن گذرواژه به پذیرنده(inbound، "password")
    تروجان.افزودن گذرواژه به پذیرنده(inbound، "other")
    سرچاپ inbound.نام()، inbound.درهم گذرواژه‌ها.طول()، inbound.شمار پاسخ‌ها

    good := تونل.لوله جدید()
    تونل.سر دوم لوله(good).نوشتن(text_of(expected.داده، expected.طول) + "payload")
    session := inbound.دست‌دهی(تونل.سر اول لوله(good))
    سرچاپ session.موفق، session.مقصد.میزبان، session.مقصد.درگاه، session.پروتکل، session.فرمان، session.داده آغازین

    web := تونل.لوله جدید()
    تونل.سر دوم لوله(web).نوشتن("GET / HTTP/1.1\r\nHost: x\r\n\r\n")
    stranger := inbound.دست‌دهی(تونل.سر اول لوله(web))
    سرچاپ stranger.موفق، stranger.خطا، stranger.داده آغازین.طول()

    wrong := تروجان.کدگذاری درخواست("nope"، تروجان.فرمان اتصال، "example.com"، 443)
    bad := تونل.لوله جدید()
    تونل.سر دوم لوله(bad).نوشتن(text_of(wrong.داده، wrong.طول))
    rejected := inbound.دست‌دهی(تونل.سر اول لوله(bad))
    سرچاپ rejected.موفق، rejected.داده آغازین.طول() برابر wrong.طول
    inbound.پاسخ(تونل.سر اول لوله(bad)، rejected، نادرست)

    ناپایا chain := تونل.زنجیره جدید(تونل.مستقیم())
    تونل.افزودن گام(chain، hop)
    سرچاپ chain.نام()
    فشرده سازی.آزادسازی بافر(expected)
پایان
خروجیtrojan vpn.example.com 443 true 76 true true trojan 2 0 true example.com 443 trojan 1 payload false trojan authentication failed 27 false true chain>trojan

کارساز Server

تابع کارساز(): تونل.نشانی
نشانی کارساز تروجان.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان، target: تونل.نشانی): منطقی
درخواست تروجان (درهم، فرمان اتصال، مقصد) را روی جریان باز می‌نویسد. منتظر پاسخ نمی‌ماند چون تروجان پاسخی ندارد: داده می‌تواند بی‌درنگ دنبالش بیاید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

نام Name

تابع نام(): رشته
trojan را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

پذیرنده تروجان Inbound

ساختار پذیرنده تروجان
سمت کارساز تروجان برای تونل.پذیرنده: درخواست را از یک جریان می‌خواند، درهم گذرواژه را بررسی می‌کند و مقصد را برمی‌گرداند. درخواستی که بررسی را نگذراند پاسخ نمی‌گیرد و بایت‌های خوانده‌شده تا آن لحظه در تونل.داده آغازین می‌مانند، تا فراخواننده بتواند آن‌ها را به یک سایت طعمه بدهد. با پذیرنده جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
درهم گذرواژه‌هاhashesوکتور<رشته>درهم‌های پذیرفته‌شده‌ی گذرواژه، به شکل متن هگز ۵۶ نویسه‌ای.
شمار پاسخ‌هاrepliesصحیح = 0شمارنده‌ای که سازگارکننده نگه می‌دارد. تروجان پاسخی نمی‌فرستد، پس صفر می‌ماند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

نام Name

تابع نام(): رشته
trojan را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان): تونل.نشست
می‌خواند تا یک درخواست کامل برسد و سپس درهمش را با درهم‌های شناخته‌شده می‌سنجد. مقصد، فرمان و هر باری را که پس از درخواست آمده برمی‌گرداند، یا نشستی ناموفق که همچنان آنچه خوانده شده را دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

پاسخ Reply

تابع پاسخ(_s: dyn تونل.جریان، _sess: تونل.نشست، _ok: منطقی)
کاری نمی‌کند: تروجان پاسخی ندارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

پیکربندی کارخواه ClientConfig

ساختار پیکربندی کارخواه
چگونه به یک کارساز تروجان برسیم: نشانی و گذرواژه‌اش، گزینه‌های TLS و انتقال. با پیکربندی کارخواه جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
میزبان کارسازserver_hostرشته = ""نام میزبان یا IP کارساز.
درگاه کارسازserver_portصحیح = 443درگاه کارساز. پیش‌فرض ۴۴۳.
گذرواژهpasswordرشته = ""گذرواژه. به شکل درهم SHA-224 آن فرستاده می‌شود.
نام سرورsniرشته = ""نام سروری که در دست‌دهی TLS فرستاده و در گواهی بررسی می‌شود. خالی یعنی همان میزبان.
پروتکل برنامهalpnرشته = ""پروتکل ALPN که پیشنهاد می‌شود، مثلا h2 یا http/1.1. خالی یعنی هیچ.
ناامنinsecureمنطقی = نادرستدرست یعنی بررسی گواهی نادیده گرفته شود. فقط برای آزمون: حفاظتی را که TLS می‌دهد برمی‌دارد.
با تی ال اسuse_tlsمنطقی = درستدرست یعنی روی TLS اجرا شود، تنظیم عادی و امن. پیش‌فرض درست. با با وب‌سوکت تعیین می‌کند wss باشد یا ws.
با وب‌سوکتuse_wsمنطقی = نادرستدرست یعنی تروجان درون یک وب‌سوکت برده شود (تا CDN یا پراکسی معکوس بتواند جلویش بنشیند). پیش‌فرض نادرست.
مسیر وب‌سوکتws_pathرشته = "/"مسیر وب‌سوکت. پیش‌فرض /.
سرآیند همراه نخستین دادهlazy_headerمنطقی = نادرستدرست یعنی درخواست تروجان نگه داشته شود و همراه نخستین داده‌ای که می‌نویسید فرستاده شود، تا بسته‌ی نخست درخواستی با اندازه‌ی ثابت نباشد. پیش‌فرض نادرست.
مهلت اتصالtimeout_msصحیح = 10000اتصال چند میلی‌ثانیه می‌تواند طول بکشد. پیش‌فرض ۱۰۰۰۰.
net-trojan-Client.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.تی سی پی
واردسازی شبکه.تروجان
واردسازی همگام سازی

ناپایا echo_port := 0
ناپایا web_port := 0
ناپایا web_seen := ""
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع echo_server():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تا درست:
            data := تی سی پی.خواندن(c، 4096)
            اگر data.طول() برابر 0:
                بشکن
            پایان
            تی سی پی.نوشتن(c، "echo:" + data)
        پایان
        تی سی پی.بستن(c)
    پایان
پایان

تابع web_server():
    srv := تی سی پی.پیوند(0)
    web_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        web_seen = تی سی پی.خواندن(c، 4096)
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: 12\r\nConnection: close\r\n\r\nhello probes")
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_servers():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(echo_server)
    _b := نخ‌ساز(web_server)
    همگام سازی.انتظار(ready)
پایان

تابع text_of(p: تهی*، n: صحیح): رشته:
    buf := حافظه.تخصیص((n + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، p، n برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    برگشت buf برگردان رشته
پایان

تابع read_text(l &: تروجان.پیوند، want: صحیح): رشته:
    buf := حافظه.تخصیص(8192 برگردان طبیعی۶۴)
    دیرکن حافظه.آزادسازی(buf)
    ناپایا out := ""
    تا out.طول() کوچکتر want:
        n := تروجان.خواندن پیوند(l، buf، 8192)
        اگر n کوچکتربرابر 0:
            بشکن
        پایان
        out = out + text_of(buf، n)
    پایان
    برگشت out
پایان

تابع ریشه:
    start_servers()

    ناپایا config := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(config، درست)
    تروجان.افزودن گذرواژه(config، "secret")
    تروجان.افزودن درهم گذرواژه(config، تروجان.درهم گذرواژه("second"))
    سرچاپ config.درهم گذرواژه‌ها.طول()، config.مهلت دست‌دهی
    server := تروجان.سرویس‌دهی بدون رمز(config، 0)
    سرچاپ "server up:"، server.معتبر، تروجان.درگاه کارساز(server) برابر server.درگاه

    ناپایا client := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "secret")
    client.با تی ال اس = نادرست
    سرچاپ client.درگاه کارساز نابرابر 443، client.با وب‌سوکت، client.سرآیند همراه نخستین داده، client.مهلت اتصال
    ناپایا link := تروجان.شماره گیری(client، "127.0.0.1"، echo_port)
    سرچاپ "dial ok:"، تروجان.پیوند معتبر(link)، link.نوع برابر تروجان.پیوند تی سی پی
    سرچاپ تروجان.نوشتن متن پیوند(link، "hello trojan")
    سرچاپ read_text(link، 17)
    big := حافظه.تخصیص(30000 برگردان طبیعی۶۴)
    حافظه.تنظیم(big، 97، 30000 برگردان طبیعی۶۴)
    سرچاپ تروجان.نوشتن پیوند(link، big، 30000)
    ناپایا total := 0
    تا total کوچکتر 30005:
        buf := حافظه.تخصیص(8192 برگردان طبیعی۶۴)
        n := تروجان.خواندن پیوند(link، buf، 8192)
        حافظه.آزادسازی(buf)
        اگر n کوچکتربرابر 0:
            بشکن
        پایان
        total += n
    پایان
    سرچاپ "echoed"، total
    حافظه.آزادسازی(big)
    تروجان.تنظیم مهلت پیوند(link، 1000)
    تروجان.بستن پیوند(link)

    ناپایا second := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "second")
    second.با تی ال اس = نادرست
    second.سرآیند همراه نخستین داده = درست
    ناپایا lazy := تروجان.شماره گیری(second، "127.0.0.1"، echo_port)
    سرچاپ تروجان.نوشتن متن پیوند(lazy، "lazy header")
    سرچاپ read_text(lazy، 16)
    تروجان.بستن پیوند(lazy)

    همگام سازی.خواب میلی ثانیه(300)
    stats := تروجان.آمار(server)
    سرچاپ "stats:"، stats.پذیرفته‌شده، stats.احراز‌شده، stats.جایگزین‌شده
    تروجان.توقف(server)
پایان
خروجی2 5000 server up: true true true false false 10000 dial ok: true true true echo:hello trojan true echoed 30040 true echo:lazy header stats: 2 2 0

درخواست Request

ساختار درخواست
یک درخواست تروجان تجزیه‌شده: درهم گذرواژه، فرمان و مقصد.
نامانگلیسیگونهتوضیح
وضعیتstatusصحیح = 1تجزیه موفق، تجزیه نیازمند داده بیشتر یا تجزیه نامعتبر. نخست آن را بررسی کنید.
درهمhashرشته = ""درهم ۵۶ نویسه‌ای گذرواژه از درخواست.
فرمانcmdصحیح = 0فرمان اتصال یا فرمان یو دی پی.
نوع نشانیatypصحیح = 0نوع نشانی مقصد.
میزبانhostرشته = ""نام میزبان یا IP مقصد.
درگاهportصحیح = 0درگاه مقصد.
بایت‌های مصرف‌شدهconsumedصحیح = 0درخواست چند بایت گرفت. هر چه پس از آن باشد بار است.
net-trojan-Wire.salam
// زبان: فارسی
واردسازی شبکه.تروجان
واردسازی فشرده سازی

تابع ریشه:
    سرچاپ تروجان.اس‌اچ‌ای۲۲۴ هگز("")
    سرچاپ تروجان.اس‌اچ‌ای۲۲۴ هگز("abc")
    سرچاپ تروجان.درهم گذرواژه("password")
    digest := تروجان.اس‌اچ‌ای۲۲۴("abc" برگردان تهی*، 3)
    سرچاپ digest.طول، تروجان.هگز(digest) برابر تروجان.اس‌اچ‌ای۲۲۴ هگز("abc")

    request := تروجان.کدگذاری درخواست("password"، تروجان.فرمان اتصال، "example.com"، 443)
    سرچاپ تروجان.هگز(request)
    parsed := تروجان.تجزیه درخواست(request.داده، request.طول)
    سرچاپ parsed.وضعیت برابر تروجان.تجزیه موفق، parsed.فرمان برابر تروجان.فرمان اتصال، parsed.نوع نشانی برابر تروجان.نوع نشانی دامنه، parsed.میزبان، parsed.درگاه، parsed.بایت‌های مصرف‌شده
    سرچاپ parsed.درهم برابر تروجان.درهم گذرواژه("password")
    same := تروجان.کدگذاری درخواست با درهم(تروجان.درهم گذرواژه("password")، تروجان.فرمان اتصال، "example.com"، 443)
    سرچاپ تروجان.هگز(same) برابر تروجان.هگز(request)

    سرچاپ "short:"، تروجان.تجزیه درخواست(request.داده، request.طول - 3).وضعیت برابر تروجان.تجزیه نیازمند داده بیشتر
    junk := تروجان.تجزیه درخواست("GET / HTTP/1.1\r\nHost: a\r\n\r\n" برگردان تهی*، 28)
    سرچاپ "junk:"، junk.وضعیت برابر تروجان.تجزیه نامعتبر

    udp_request := تروجان.کدگذاری درخواست("password"، تروجان.فرمان یو دی پی، "2001:db8::1"، 53)
    p6 := تروجان.تجزیه درخواست(udp_request.داده، udp_request.طول)
    سرچاپ p6.فرمان برابر تروجان.فرمان یو دی پی، p6.نوع نشانی برابر تروجان.نوع نشانی آی‌پی۶، p6.میزبان، p6.درگاه

    packet := تروجان.کدگذاری بسته یو دی پی("8.8.8.8"، 53، "hi" برگردان تهی*، 2)
    سرچاپ تروجان.هگز(packet)
    up := تروجان.تجزیه بسته یو دی پی(packet.داده، packet.طول)
    سرچاپ up.وضعیت برابر تروجان.تجزیه موفق، up.نوع نشانی برابر تروجان.نوع نشانی آی‌پی۴، up.میزبان، up.درگاه، up.آغاز داده، up.طول داده، up.بایت‌های مصرف‌شده

    addr := تروجان.کدگذاری نشانی("example.com"، 443)
    سرچاپ تروجان.هگز(addr)
    ناپایا atyp := 0
    ناپایا host := ""
    ناپایا port := 0
    سرچاپ تروجان.تجزیه نشانی(addr.داده، addr.طول، 0، atyp، host، port)، atyp، host، port

    ناپایا ip4 := فشرده سازی.بافر بایت جدید()
    سرچاپ تروجان.تجزیه آی‌پی۴("192.168.1.20"، ip4)، تروجان.قالب‌دهی آی‌پی۴(ip4.داده، 0)
    ناپایا ip6 := فشرده سازی.بافر بایت جدید()
    سرچاپ تروجان.تجزیه آی‌پی۶("2001:db8::1"، ip6)، تروجان.قالب‌دهی آی‌پی۶(ip6.داده، 0)
    سرچاپ تروجان.فرمان اتصال، تروجان.فرمان یو دی پی، تروجان.نوع نشانی آی‌پی۴، تروجان.نوع نشانی آی‌پی۶، تروجان.تجزیه نیازمند داده بیشتر، تروجان.تجزیه نامعتبر
پایان
خروجیd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 d63dc919e201d7bc4c825630d2cf25fdc93d4b2f0d46706d29038d01 28 true 64363364633931396532303164376263346338323536333064326366323566646339336434623266306434363730366432393033386430310d0a01030b6578616d706c652e636f6d01bb0d0a true true true example.com 443 76 true true short: true junk: true true true 2001:db8::1 53 0108080808003500020d0a6869 true true 8.8.8.8 53 11 2 13 030b6578616d706c652e636f6d01bb 15 3 example.com 443 true 192.168.1.20 true 2001:db8::1 1 3 1 4 1 2

بسته یو دی پی UDPPacket

ساختار بسته یو دی پی
یک بسته‌ی UDP تروجان تجزیه‌شده: مقصدش و جای بار.
نامانگلیسیگونهتوضیح
وضعیتstatusصحیح = 1تجزیه موفق، تجزیه نیازمند داده بیشتر یا تجزیه نامعتبر.
نوع نشانیatypصحیح = 0نوع نشانی.
میزبانhostرشته = ""میزبانی که دیتاگرام برایش است یا از آن آمده.
درگاهportصحیح = 0درگاه.
آغاز دادهpayload_offصحیح = 0آفست بار در بایت‌های تجزیه‌شده.
طول دادهpayload_lenصحیح = 0طول بار.
بایت‌های مصرف‌شدهconsumedصحیح = 0بسته در مجموع چند بایت گرفت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

ساختار پیوند
یک اتصال به یا از یک همتای تروجان، روی TCP، TLS یا وب‌سوکت، با بافرهایی که تروجان لازم دارد. شماره گیری یکی برمی‌گرداند؛ کارساز برای هر کارخواه یکی می‌سازد. آن را با ارجاع به تابع‌های خواندن و نوشتن بدهید.
نامانگلیسیگونهتوضیح
نوعkindصحیح = 0پیوند تی سی پی، پیوند تی ال اس یا پیوند وب‌سوکت.
اتصال تی سی پیtcتی سی پی.اتصال شبکهاتصال TCP، وقتی نوع برابر پیوند تی سی پی است.
اتصال امنscتی ال اس.اتصالاتصال TLS، وقتی نوع برابر پیوند تی ال اس است.
اتصال وب‌سوکتwsوب‌سوکت.اتصال وباتصال وب‌سوکت، وقتی نوع برابر پیوند وب‌سوکت است.
بافر خواندنrbufفشرده سازی.بافر بایتبایت‌هایی که از همتا خوانده شده ولی هنوز تحویل داده نشده.
جایگاه خواندنroffصحیح = 0چه مقدار از بافر خواندن تحویل داده شده است.
بافر یو دی پیubufفشرده سازی.بافر بایتبایت‌های یک بسته‌ی UDP که هنوز در حال سرهم شدن است.
سرآیند معلقpendingفشرده سازی.بافر بایتدرخواست تروجانی که سرآیند همراه نخستین داده تا نخستین نوشتن نگه داشته است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

جریان پیوند LinkStream

ساختار جریان پیوند
یک پیوند که به صورت tunnel.Stream دیده می‌شود تا اتصال تروجان را بتوان با ابزارهای net.tunnel رله، مسیریابی و شمارش کرد. با به صورت جریان ساخته می‌شود. بستن آن فقط اتصال را خاموش می‌کند؛ بستن پیوند هنوز پیوند را آزاد می‌کند.
نامانگلیسیگونهتوضیح
پیوندlinkپیوند*پیوندی که دربرمی‌گیرد.
net-trojan-Modes.salam
// زبان: فارسی
/*
 * Salam Programming Language (2024-2026)
 *
 *   +-------------------+
 *   |     S A L A M     |
 *   +-------------------+
 *
 * Designed by Seyyed Ali Mohammadiyeh and the Salam Team
 * Born from a decade of language design experience (since 2018)
 *
 * Repository: https://github.com/SalamLang/Salam
 *
 */

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

ناپایا echo_port := 0
ناپایا udp_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع text_of(p: تهی*، n: صحیح): رشته:
    buf := حافظه.تخصیص((n + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، p، n برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    برگشت buf برگردان رشته
پایان

تابع echo_server():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تا درست:
            s := تی سی پی.خواندن(c، 4096)
            اگر s.طول() برابر 0:
                بشکن
            پایان
            _n := تی سی پی.نوشتن(c، s)
        پایان
        تی سی پی.بستن(c)
    پایان
پایان

تابع udp_server():
    s := یو دی پی.پیوند(0)
    udp_port = یو دی پی.درگاه(s)
    همگام سازی.اتمام(ready)
    تا درست:
        p := یو دی پی.دریافت(s، 2048)
        اگر p.داده.طول() بزرگتر 0:
            _n := یو دی پی.ارسال(s، p.میزبان فرستنده، p.درگاه فرستنده، "echo:" + p.داده)
        پایان
    پایان
پایان

تابع read_all_text(l &: تروجان.پیوند، want: صحیح): رشته:
    buf := حافظه.تخصیص(8192 برگردان طبیعی۶۴)
    دیرکن حافظه.آزادسازی(buf)
    ناپایا out := ""
    تا out.طول() کوچکتر want:
        n := تروجان.خواندن پیوند(l، buf، 8192)
        اگر n کوچکتربرابر 0:
            بشکن
        پایان
        out = out + text_of(buf، n)
    پایان
    برگشت out
پایان

تابع ریشه:
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _t1 := نخ‌ساز(echo_server)
    _t2 := نخ‌ساز(udp_server)
    همگام سازی.انتظار(ready)

    ناپایا cfg := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(cfg، درست)
    تروجان.افزودن گذرواژه(cfg، "secret")
    تروجان.تعیین حالت(cfg، تروجان.حالت ساده)
    stats := تونل.آمار جدید()
    تروجان.تعیین آمار ترافیک(cfg، stats)
    srv := تروجان.شنود(cfg، 0)
    سرچاپ "listen ok"، srv.معتبر، srv.میزبان

    ناپایا ccfg := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، srv.درگاه، "secret")
    ccfg.با تی ال اس = نادرست

    ناپایا ulink := تروجان.شماره گیری یو دی پی(ccfg)
    سرچاپ تروجان.ارسال یو دی پی(ulink، "127.0.0.1"، udp_port، "one" برگردان تهی*، 3)
    سرچاپ تروجان.ارسال یو دی پی(ulink، "127.0.0.1"، udp_port، "two" برگردان تهی*، 3)
    ناپایا pkt := تروجان.بسته یو دی پی جدید()
    ناپایا payload := فشرده سازی.بافر بایت جدید()
    سرچاپ تروجان.خواندن بسته یو دی پی(ulink، pkt، payload)، text_of(payload.داده، payload.طول)
    سرچاپ تروجان.خواندن بسته یو دی پی(ulink، pkt، payload)، text_of(payload.داده، payload.طول)
    تروجان.بستن پیوند(ulink)

    ناپایا link := تروجان.شماره گیری(ccfg، "127.0.0.1"، echo_port)
    سرچاپ تروجان.نوشتن متن پیوند(link، "hello stats")
    سرچاپ read_all_text(link، 11)
    تروجان.بستن پیوند(link)
    همگام سازی.خواب میلی ثانیه(300)
    سرچاپ "up"، stats.بایت بارگذاری() بزرگتربرابر 17، "down"، stats.بایت دریافت() بزرگتربرابر 17، "total"، stats.شمار کل()
    تروجان.توقف(srv)

    ناپایا rt := تونل.مسیریاب جدید("direct")
    ناپایا rule := تونل.قاعده جدید("block")
    سرچاپ تونل.قاعده درگاه(rule، "" + echo_port)
    تونل.افزودن قاعده(rt، rule)
    ناپایا rd := تونل.شماره‌گیر مسیریاب جدید(rt)
    تونل.افزودن به شماره‌گیر مسیریاب(rd، "block"، تونل.مسدود())
    ناپایا cfg2 := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(cfg2، درست)
    تروجان.افزودن گذرواژه(cfg2، "secret")
    تروجان.تعیین مسیریاب(cfg2، rd)
    تروجان.تعیین میزبان شنود(cfg2، "127.0.0.1")
    تروجان.تعیین حالت(cfg2، تروجان.حالت ساده)
    srv2 := تروجان.شنود(cfg2، 0)
    ناپایا c2 := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، srv2.درگاه، "secret")
    c2.با تی ال اس = نادرست
    ناپایا blocked := تروجان.شماره گیری(c2، "127.0.0.1"، echo_port)
    سرچاپ تروجان.نوشتن متن پیوند(blocked، "x")
    سرچاپ "blocked read"، read_all_text(blocked، 1).طول()
    تروجان.بستن پیوند(blocked)

    تروجان.توقف(srv2)
پایان
خروجیlisten ok true 127.0.0.1 true true true echo:one true echo:two true hello stats up true down true total 2 true true blocked read 0

خواندن Read

تابع خواندن(max: صحیح): رشته
تا max بایت را به صورت متن می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

خواندن بایت ReadBytes

تابع خواندن بایت(buf: تهی*، max: صحیح): صحیح
تا max بایت را در یک بافر می‌خواند و شمار آن را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

نوشتن Write

تابع نوشتن(data: رشته): صحیح
متن را روی پیوند می‌نویسد و طول آن را برمی‌گرداند، یا ۱- در شکست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

نوشتن بایت WriteBytes

تابع نوشتن بایت(ptr: تهی*، n: صحیح): صحیح
n بایت می‌نویسد و n برمی‌گرداند، یا ۱- در شکست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تنظیم مهلت SetDeadline

تابع تنظیم مهلت(millis: صحیح)
مهلت خواندن را به میلی‌ثانیه تعیین می‌کند؛ ۰ یعنی بدون مهلت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

خاموش کردن Shutdown

تابع خاموش کردن()
اتصال را در هر دو جهت خاموش می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

بستن نوشتن CloseWrite

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

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

بستن Close

تابع بستن()
مثل Shutdown: صاحب پیوند آن را با بستن پیوند می‌بندد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

معتبر Ok

تابع معتبر(): منطقی
تا وقتی پیوند باز است درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

پیکربندی کارساز ServerConfig

ساختار پیکربندی کارساز
تنظیمات یک کارساز تروجان: گواهی و کلید، گذرواژه‌های پذیرفته‌شده، وب‌سایتی که به همه‌ی دیگران نشان داده می‌شود و حدهای زمانی. از پیکربندی کارساز جدید شروع کنید.
نامانگلیسیگونهتوضیح
پرونده گواهیcert_fileرشته = ""پرونده‌ی گواهی PEM برای TLS. گواهی یک دامنه‌ی واقعی را به کار ببرید.
پرونده کلیدkey_fileرشته = ""پرونده‌ی کلید خصوصی PEM.
درهم گذرواژه‌هاhashesوکتور<رشته>درهم‌های پذیرفته‌شده‌ی گذرواژه. افزودن گذرواژه و افزودن درهم گذرواژه به آن اضافه می‌کنند.
میزبان جایگزینfallback_hostرشته = ""میزبان وب‌سایتی که هر اتصالِ غیرکارخواه معتبر تروجان را می‌گیرد. خالی یعنی 127.0.0.1.
درگاه جایگزینfallback_portصحیح = 0درگاه آن وب‌سایت. ۰، پیش‌فرض، یعنی نیست و چنین اتصال‌هایی فقط بسته می‌شوند.
بیشینه دست دادن مبداmax_per_sourceصحیح = 32چند اتصال از یک نشانی می‌توانند همزمان در دست‌دهی باشند. ۰ یعنی بدون سقف.
مهلت دست‌دهیhandshake_timeout_msصحیح = 5000کارخواه چند میلی‌ثانیه وقت دارد یک درخواست کامل بفرستد. پیش‌فرض ۵۰۰۰.
مهلت اتصال مقصدconnect_timeout_msصحیح = 10000رسیدن به مقصد (یا سایت جایگزین) چند میلی‌ثانیه می‌تواند طول بکشد. پیش‌فرض ۱۰۰۰۰.
مهلت بیکاریidle_timeout_msصحیح = 0اتصال را پس از آنکه راه افتاد، با این همه میلی‌ثانیه سکوت قطع کن. ۰، پیش‌فرض، یعنی هرگز.
حالتmodeصحیح = 0حالتی که شنود با آن سرویس می‌دهد: حالت تی ال اس (پیش‌فرض)، حالت ساده یا حالت وب‌سوکت.
میزبان شنودbind_hostرشته = ""نشانی‌ای که روی آن گوش داده می‌شود. خالی برای هر حالت پیش‌فرض امن می‌گیرد: همه‌ی رابط‌ها برای حالت تی ال اس و 127.0.0.1 برای حالت ساده و حالت وب‌سوکت که پشت چیزی که TLS را تمام می‌کند می‌نشینند. برای گوش دادن عمدی روی همه‌جا 0.0.0.0 بدهید.
شماره‌گیرdialerdyn تونل.شماره‌گیرtunnel.Dialerای که به مقصدها می‌رسد. وقتی has_dialer درست است به کار می‌رود؛ وگرنه مقصدها مستقیم و با connect_timeout_ms وصل می‌شوند.
دارای شماره‌گیرhas_dialerمنطقی = نادرستپس از تعیین شماره‌گیر یا تعیین مسیریاب درست است.
آمار ترافیکstatsتونل.آمارtunnel.Statsای که بایت‌ها و اتصال‌های این کارساز را می‌شمارد. وقتی has_stats درست است به کار می‌رود.
دارای آمار ترافیکhas_statsمنطقی = نادرستپس از تعیین آمار ترافیک درست است.
اجازه یو دی پیallow_udpمنطقی = درستدرست (پیش‌فرض) یعنی نشست‌های UDP پذیرفته می‌شوند. UDP همیشه مستقیم فرستاده می‌شود و از شماره‌گیر نمی‌گذرد؛ اگر مسیریاب باید بتواند همه‌چیز را ببندد این را نادرست کنید.
سیاست مقصدpolicyتونل.سیاست مقصدکدام مقصدها قابل دسترسی‌اند. به‌طور پیش‌فرض نشانی‌های حلقه محلی، خصوصی، پیوند محلی، فراداده و دیگر نشانی‌های ویژه رد می‌شوند. به DestPolicy نگاه کنید.
مسیریابrouterتونل.شماره‌گیر مسیریابمسیریابی که با تعیین مسیریاب تنظیم شده؛ هدف‌های یو دی پی که به خروجی مسدود می‌رود رها می‌شوند.
دارای مسیریابhas_routerمنطقی = نادرستدرست وقتی یک مسیریاب تعیین شده است.
بیشینه اتصال همزمانmax_connectionsصحیح = 1024بیشترین شمار اتصال همزمان؛ بیشتر از آن بسته می‌شود (ساکس) یا با ۵۰۳ پاسخ داده می‌شود (اچ‌تی‌تی‌پی). پیش‌فرض ۱۰۲۴ است و ۰ سقف را برمی‌دارد.
مهلت کل دست‌دهیhandshake_deadline_msصحیح = 10000کل زمانی که یک اتصال برای پایان دست‌دهی دارد، به میلی‌ثانیه، هر قدر هم آهسته بفرستد. پیش‌فرض ۱۰۰۰۰ است و ۰ آن را خاموش می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

نشست Session

ساختار نشست
نتیجه‌ی دست‌دهی: آیا کارخواه معتبری حرف زد، چه خواست و بایت‌های درگیر کدام‌اند.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستدرست وقتی درخواست معتبر بود و درهم گذرواژه‌اش شناخته‌شده است.
درخواستreqدرخواستدرخواست تجزیه‌شده: فرمان و مقصد.
بایت‌های خوانده‌شدهseenفشرده سازی.بافر بایتهمه‌ی بایت‌هایی که در دست‌دهی خوانده شد. وقتی معتبر نادرست است همین‌ها هستند که جایگزین برای وب‌سایت بازپخش می‌کند.
داده همراهextraفشرده سازی.بافر بایتباری که در همان خواندنِ درخواست رسیده و باید نخست به مقصد برود.
net-trojan-Handshake.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تروجان
واردسازی همگام سازی

ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

ناپایا config := تروجان.پیکربندی کارساز جدید(""، "")
تروجان.اجازه آدرس‌های خصوصی(config، درست)

تابع serve_one():
    listener := تی سی پی.پیوند(0)
    port = تی سی پی.درگاه(listener)
    همگام سازی.اتمام(ready)
    c := تی سی پی.پذیرش(listener)
    ناپایا link := تروجان.پیوند تی سی پی جدید(c)
    ناپایا session := تروجان.دست‌دهی(link، config)
    سرچاپ "server saw a valid client:"، session.معتبر
    سرچاپ session.درخواست.میزبان، session.درخواست.درگاه، session.درخواست.فرمان برابر تروجان.فرمان اتصال
    سرچاپ "bytes read:"، session.بایت‌های خوانده‌شده.طول، "payload after the request:"، session.داده همراه.طول
    تروجان.آزاد کردن نشست(session)
    تروجان.بستن پیوند(link)
پایان

تابع ریشه:
    تروجان.افزودن گذرواژه(config، "secret")
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    t := نخ‌ساز(serve_one)
    همگام سازی.انتظار(ready)

    conn := تی سی پی.شماره گیری("127.0.0.1"، port)
    request := تروجان.کدگذاری درخواست("secret"، تروجان.فرمان اتصال، "example.com"، 443)
    ناپایا link := تروجان.پیوند تی سی پی جدید(conn)
    تروجان.نوشتن بافر پیوند(link، request)
    سرچاپ تروجان.پیوند معتبر(link)، تروجان.توصیفگر پیوند(link) بزرگتر 0
    نخ‌پیوند(t)
    تروجان.بستن پیوند(link)
پایان
خروجیtrue true server saw a valid client: true example.com 443 true bytes read: 76 payload after the request: 0

آمار کارساز ServerStats

ساختار آمار کارساز
شمارنده‌های یک کارساز در حال اجرا. آمار آن‌ها را برمی‌گرداند.
نامانگلیسیگونهتوضیح
پذیرفته‌شدهacceptedصحیح۶۴ = 0اتصال‌های پذیرفته‌شده.
احراز‌شدهauthedصحیح۶۴ = 0اتصال‌هایی که کارخواه معتبر تروجان بودند.
جایگزین‌شدهfallbacksصحیح۶۴ = 0اتصال‌هایی که به وب‌سایت جایگزین سپرده شدند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

کارساز Server

ساختار کارساز
یک کارساز تروجان در حال اجرا. سرویس‌دهی، سرویس‌دهی بدون رمز و سرویس‌دهی وب‌سوکت آن را برمی‌گردانند و توقف پایانش می‌دهد.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستدرست وقتی درگاه بسته شد و کارساز در حال اجراست.
درگاهportصحیح = 0درگاهی که روی آن گوش می‌دهد؛ وقتی ۰ خواسته‌اید به کار می‌آید.
میزبانhostرشته = ""نشانی‌ای که کارساز روی آن گوش می‌دهد.
وضعیتstServerState*وضعیت درونی: پرچم توقف و شمارنده‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

پایاها و متغیرها

فرمان‌ها Cmd…

فرمان‌های فرمان.
نامانگلیسیمقدار
فرمان اتصالCmdConnect1
فرمان یو دی پیCmdUDP3

نوع‌های نشانی Atyp…

نوع‌های نشانی نوع نشانی.
نامانگلیسیمقدار
نوع نشانی آی‌پی۴AtypIPv41
نوع نشانی دامنهAtypDomain3
نوع نشانی آی‌پی۶AtypIPv64

نتیجه‌های تجزیه Parse…

مقدارهای وضعیت و وضعیت.
نامانگلیسیمقدار
تجزیه موفقParseOK0
تجزیه نیازمند داده بیشترParseNeedMore1
تجزیه نامعتبرParseInvalid2
مقدارهای نوع.
نامانگلیسیمقدار
پیوند تی سی پیLinkTCP0
پیوند تی ال اسLinkTLS1
پیوند وب‌سوکتLinkWS2

حالت‌های کارساز Mode…

مقدارهای mode: حالت تی ال اس، حالت ساده و حالت وب‌سوکت.
نامانگلیسیمقدار
حالت تی ال اسModeTLS0
حالت سادهModePlain1
حالت وب‌سوکتModeWS2

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تابع‌ها

اتصال‌دهنده جدید NewConnector

تابع اتصال‌دهنده جدید(server_host: رشته، server_port: صحیح، password: رشته): اتصال‌دهنده
برای نشانی یک کارساز تروجان و یک گذرواژه یک اتصال‌دهنده می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

پذیرنده جدید NewInbound

تابع پذیرنده جدید(): پذیرنده تروجان
یک پذیرنده تروجان بدون گذرواژه برمی‌گرداند. با افزودن گذرواژه به پذیرنده اضافه‌شان کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

افزودن گذرواژه به پذیرنده InboundAddPassword

تابع افزودن گذرواژه به پذیرنده(inb &: پذیرنده تروجان، password: رشته)
یک گذرواژه (به شکل درهمش ذخیره می‌شود) اضافه می‌کند که درون‌سو می‌پذیرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Adapter.salam

پیکربندی کارخواه جدید NewClientConfig

تابع پیکربندی کارخواه جدید(server_host: رشته، server_port: صحیح، password: رشته): پیکربندی کارخواه
برای یک میزبان، درگاه و گذرواژه‌ی کارساز پیکربندی می‌سازد، با TLS روشن و گزینه‌های دیگر در پیش‌فرض.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

شماره گیری Dial

تابع شماره گیری(cfg: پیکربندی کارخواه، host: رشته، port: صحیح): پیوند
به کارساز تروجان وصل می‌شود و درخواست یک میزبان و درگاه مقصد را می‌فرستد. یک پیوند برای خواندن و نوشتن برمی‌گرداند؛ پیوند معتبر را بررسی کنید. با سرآیند همراه نخستین داده درخواست منتظر نخستین نوشتن شما می‌ماند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

شماره گیری یو دی پی DialUDP

تابع شماره گیری یو دی پی(cfg: پیکربندی کارخواه): پیوند
وصل می‌شود و یک نشست UDP شروع می‌کند: هر بسته مقصد خودش را می‌برد. ارسال یو دی پی و خواندن بسته یو دی پی را به کار ببرید.
net-trojan-Udp.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.تروجان
واردسازی شبکه.یو دی پی
واردسازی همگام سازی
واردسازی فشرده سازی

ناپایا udp_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع udp_server():
    s := یو دی پی.پیوند(0)
    udp_port = یو دی پی.درگاه(s)
    همگام سازی.اتمام(ready)
    تا درست:
        p := یو دی پی.دریافت(s، 2048)
        اگر p.داده.طول() بزرگتر 0:
            یو دی پی.ارسال(s، p.میزبان فرستنده، p.درگاه فرستنده، "echo:" + p.داده)
        پایان
    پایان
پایان

تابع ریشه:
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    _t := نخ‌ساز(udp_server)
    همگام سازی.انتظار(ready)

    ناپایا config := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(config، درست)
    تروجان.افزودن گذرواژه(config، "secret")
    server := تروجان.سرویس‌دهی بدون رمز(config، 0)

    ناپایا client := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "secret")
    client.با تی ال اس = نادرست
    ناپایا link := تروجان.شماره گیری یو دی پی(client)
    سرچاپ "udp session:"، تروجان.پیوند معتبر(link)
    سرچاپ تروجان.نوشتن بسته یو دی پی(link، "127.0.0.1"، udp_port، "ping" برگردان تهی*، 4)

    ناپایا packet := تروجان.بسته یو دی پی جدید()
    ناپایا payload := فشرده سازی.بافر بایت جدید()
    سرچاپ تروجان.خواندن بسته یو دی پی(link، packet، payload)
    سرچاپ packet.میزبان، packet.درگاه برابر udp_port، packet.وضعیت
    buf := حافظه.تخصیص((payload.طول + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، payload.داده، payload.طول برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[payload.طول] = 0 برگردان طبیعی۸
    سرچاپ buf برگردان رشته
    تروجان.بستن پیوند(link)
    تروجان.توقف(server)
پایان
خروجیudp session: true true true 127.0.0.1 true 0 echo:ping

ارسال یو دی پی SendUDP

تابع ارسال یو دی پی(l &: پیوند، host: رشته، port: صحیح، p: تهی*، n: صحیح): منطقی
یک دیتاگرام را از راه نشست UDP به یک میزبان و درگاه می‌فرستد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Udp.salam

تجزیه آی‌پی۴ ParseIPv4

تابع تجزیه آی‌پی۴(text: رشته، out &: فشرده سازی.بافر بایت): منطقی
متن IPv4 را به چهار بایت تجزیه می‌کند که به یک بافر اضافه می‌شود. اگر نشانی نبود نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

تجزیه آی‌پی۶ ParseIPv6

تابع تجزیه آی‌پی۶(text: رشته، out &: فشرده سازی.بافر بایت): منطقی
متن IPv6 را به شانزده بایت تجزیه می‌کند که به یک بافر اضافه می‌شود. اگر نشانی نبود نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

قالب‌دهی آی‌پی۴ FormatIPv4

تابع قالب‌دهی آی‌پی۴(p: تهی*، off: صحیح): رشته
چهار بایت را از یک آفست به شکل متن نقطه‌دار درمی‌آورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

قالب‌دهی آی‌پی۶ FormatIPv6

تابع قالب‌دهی آی‌پی۶(p: تهی*، off: صحیح): رشته
شانزده بایت را از یک آفست به شکل متن IPv6 درمی‌آورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

کدگذاری نشانی EncodeAddr

تابع کدگذاری نشانی(host: رشته، port: صحیح): فشرده سازی.بافر بایت
یک میزبان و درگاه را به شکل نشانی تروجان (به سبک SOCKS5) می‌نویسد. IP نوع عددی خودش را می‌گیرد، هر چیز دیگر یک نام است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

تجزیه نشانی ParseAddr

تابع تجزیه نشانی(p: تهی*، n: صحیح، off: صحیح، atyp &: صحیح، host &: رشته، port &: صحیح): صحیح
یک نشانی را از حافظه در یک آفست می‌خواند: نوع، میزبان و درگاهش را پر می‌کند و برمی‌گرداند چند بایت گرفت، ۰ وقتی بیشتر لازم است و ۱- وقتی نامعتبر است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

کدگذاری درخواست با درهم EncodeRequestHash

تابع کدگذاری درخواست با درهم(hash: رشته، cmd: صحیح، host: رشته، port: صحیح): فشرده سازی.بافر بایت
یک درخواست تروجان را از درهمی که از پیش محاسبه شده می‌نویسد: ۵۶ نویسه‌ی هگز، شکست سطر، فرمان، نشانی و شکست سطر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

کدگذاری درخواست EncodeRequest

تابع کدگذاری درخواست(password: رشته، cmd: صحیح، host: رشته، port: صحیح): فشرده سازی.بافر بایت
یک درخواست تروجان برای یک گذرواژه، یک فرمان و یک مقصد می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

تجزیه درخواست ParseRequest

تابع تجزیه درخواست(p: تهی*، n: صحیح): درخواست
یک درخواست تروجان را از حافظه تجزیه می‌کند. وضعیت را بررسی کنید؛ در موفقیت بایت‌های مصرف‌شده می‌گوید بار از کجا شروع می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

کدگذاری بسته یو دی پی EncodeUDPPacket

تابع کدگذاری بسته یو دی پی(host: رشته، port: صحیح، payload: تهی*، n: صحیح): فشرده سازی.بافر بایت
یک بسته‌ی UDP می‌نویسد: نشانی مقصد، طول بار، شکست سطر و بار.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

تجزیه بسته یو دی پی ParseUDPPacket

تابع تجزیه بسته یو دی پی(p: تهی*، n: صحیح): بسته یو دی پی
یک بسته‌ی UDP را از حافظه تجزیه می‌کند. وضعیت را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

تابع پیوند تی سی پی جدید(c: تی سی پی.اتصال شبکه): پیوند
یک اتصال TCP پذیرفته‌شده یا شماره‌گیری‌شده را به شکل پیوند می‌پوشاند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Handshake.salam

تابع پیوند تی ال اس جدید(c: تی ال اس.اتصال): پیوند
یک اتصال TLS را به شکل پیوند می‌پوشاند.
net-trojan-Tls.salam
// زبان: فارسی
واردسازی شبکه.تروجان

تابع ریشه:
    ناپایا config := تروجان.پیکربندی کارساز جدید("fullchain.pem"، "privkey.pem")
    تروجان.افزودن گذرواژه(config، "a long random password")
    تروجان.تعیین جایگزین(config، "127.0.0.1"، 8080)
    server := تروجان.سرویس‌دهی(config، 443)
    سرچاپ "trojan up:"، server.معتبر

    ناپایا client := تروجان.پیکربندی کارخواه جدید("proxy.example.com"، 443، "a long random password")
    client.نام سرور = "proxy.example.com"
    client.پروتکل برنامه = "h2"
    client.سرآیند همراه نخستین داده = درست
    ناپایا link := تروجان.شماره گیری(client، "example.com"، 443)
    سرچاپ تروجان.پیوند معتبر(link)، link.نوع برابر تروجان.پیوند تی ال اس
    تروجان.بستن پیوند(link)
    تروجان.توقف(server)
پایان
تابع پیوند وب‌سوکت جدید(c: وب‌سوکت.اتصال وب): پیوند
یک اتصال وب‌سوکت را به شکل پیوند می‌پوشاند.

پیوند معتبر LinkOk

تابع پیوند معتبر(l: پیوند): منطقی
درست وقتی پیوند قابل استفاده است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

توصیفگر پیوند LinkFd

تابع توصیفگر پیوند(l: پیوند): صحیح۶۴
توصیفگر پرونده‌ی زیر پیوند را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Handshake.salam

خواندن پیوند LinkRead

تابع خواندن پیوند(l &: پیوند، buf: تهی*، max: صحیح): صحیح
تا یک شمار بایت را در یک بافر می‌خواند، نخست از آنچه از پیش در بافر بوده. برمی‌گرداند چند بایت، یا ۰ و کمتر در پایان یا خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

نوشتن پیوند LinkWrite

تابع نوشتن پیوند(l &: پیوند، p: تهی*، n: صحیح): منطقی
بایت‌ها را از حافظه می‌نویسد. اگر یک درخواست تروجان نگه داشته شده باشد نخست آن می‌رود. در شکست نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

نوشتن بافر پیوند LinkWriteBuf

تابع نوشتن بافر پیوند(l &: پیوند، b: فشرده سازی.بافر بایت): منطقی
یک بافر بایت کامل را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Handshake.salam

نوشتن متن پیوند LinkWriteStr

تابع نوشتن متن پیوند(l &: پیوند، s: رشته): منطقی
یک متن می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

تنظیم مهلت پیوند LinkSetTimeout

تابع تنظیم مهلت پیوند(l: پیوند، millis: صحیح)
مهلت خواندن و نوشتن را به میلی‌ثانیه تعیین می‌کند. ۰ آن را برمی‌دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

خاموش کردن پیوند LinkShutdown

تابع خاموش کردن پیوند(l: پیوند)
هر دو جهت را می‌ایستاند تا نخی که در یک خواندن مسدود است بیدار شود، بی‌آنکه پیوند آزاد شود.
net-trojan-WebSocket.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.تی سی پی
واردسازی شبکه.تروجان
واردسازی همگام سازی

ناپایا echo_port := 0
ناپایا web_port := 0
ناپایا web_seen := ""
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع echo_server():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تا درست:
            data := تی سی پی.خواندن(c، 4096)
            اگر data.طول() برابر 0:
                بشکن
            پایان
            تی سی پی.نوشتن(c، "echo:" + data)
        پایان
        تی سی پی.بستن(c)
    پایان
پایان

تابع web_server():
    srv := تی سی پی.پیوند(0)
    web_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        web_seen = تی سی پی.خواندن(c، 4096)
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: 12\r\nConnection: close\r\n\r\nhello probes")
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_servers():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(echo_server)
    _b := نخ‌ساز(web_server)
    همگام سازی.انتظار(ready)
پایان

تابع text_of(p: تهی*، n: صحیح): رشته:
    buf := حافظه.تخصیص((n + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، p، n برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    برگشت buf برگردان رشته
پایان

تابع read_text(l &: تروجان.پیوند، want: صحیح): رشته:
    buf := حافظه.تخصیص(8192 برگردان طبیعی۶۴)
    دیرکن حافظه.آزادسازی(buf)
    ناپایا out := ""
    تا out.طول() کوچکتر want:
        n := تروجان.خواندن پیوند(l، buf، 8192)
        اگر n کوچکتربرابر 0:
            بشکن
        پایان
        out = out + text_of(buf، n)
    پایان
    برگشت out
پایان

تابع ریشه:
    start_servers()
    ناپایا config := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(config، درست)
    تروجان.افزودن گذرواژه(config، "wspass")
    server := تروجان.سرویس‌دهی وب‌سوکت(config، 0)
    سرچاپ "ws server up:"، server.معتبر

    ناپایا client := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "wspass")
    client.با تی ال اس = نادرست
    client.با وب‌سوکت = درست
    client.مسیر وب‌سوکت = "/trojan"
    ناپایا link := تروجان.شماره گیری(client، "127.0.0.1"، echo_port)
    سرچاپ "ws dial ok:"، تروجان.پیوند معتبر(link)، link.نوع برابر تروجان.پیوند وب‌سوکت
    تروجان.نوشتن متن پیوند(link، "over websocket")
    سرچاپ read_text(link، 19)
    تروجان.خاموش کردن پیوند(link)
    تروجان.بستن پیوند(link)
    تروجان.توقف(server)
پایان
خروجیws server up: true ws dial ok: true true echo:over websocket

بستن پیوند LinkClose

تابع بستن پیوند(l &: پیوند)
پیوند را می‌بندد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

رله Relay

تابع رله(a: پیوند*، b: پیوند*): صحیح۶۴
داده را در دو جهت بین دو پیوند کپی می‌کند تا یکی تمام شود و برمی‌گرداند در کل چند بایت جابه‌جا شد.

بسته یو دی پی جدید NewUDPPacket

تابع بسته یو دی پی جدید(): بسته یو دی پی
یک بسته یو دی پی خالی برمی‌گرداند تا خواندن بسته یو دی پی آن را پر کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Udp.salam

خواندن بسته یو دی پی ReadUDPPacket

تابع خواندن بسته یو دی پی(l &: پیوند، pkt &: بسته یو دی پی، payload &: فشرده سازی.بافر بایت): منطقی
یک بسته‌ی UDP را از یک پیوند می‌خواند: مقصد بسته را پر می‌کند و بایت‌های بار را در یک بافر می‌گذارد. در پایان پیوند یا بسته‌ی خراب نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Udp.salam

نوشتن بسته یو دی پی WriteUDPPacket

تابع نوشتن بسته یو دی پی(l &: پیوند، host: رشته، port: صحیح، p: تهی*، n: صحیح): منطقی
یک بسته‌ی UDP برای یک میزبان و درگاه را روی یک پیوند می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Udp.salam

اس‌اچ‌ای۲۲۴ Sha224

تابع اس‌اچ‌ای۲۲۴(p: تهی*، n: صحیح): فشرده سازی.بافر بایت
درهم SHA-224 (۲۸ بایت) مقداری حافظه را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

هگز HexOf

تابع هگز(b: فشرده سازی.بافر بایت): رشته
بایت‌های یک بافر را به شکل هگز با حروف کوچک برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

اس‌اچ‌ای۲۲۴ هگز Sha224Hex

تابع اس‌اچ‌ای۲۲۴ هگز(s: رشته): رشته
درهم SHA-224 یک متن را به شکل ۵۶ نویسه‌ی هگز برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

درهم گذرواژه PasswordHash

تابع درهم گذرواژه(password: رشته): رشته
درهمی را که تروجان برای یک گذرواژه روی سیم می‌گذارد برمی‌گرداند: SHA-224 آن به شکل ۵۶ نویسه‌ی هگز.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Wire.salam

پیکربندی کارساز جدید NewServerConfig

تابع پیکربندی کارساز جدید(cert_file: رشته، key_file: رشته): پیکربندی کارساز
از یک پرونده‌ی گواهی و یک پرونده‌ی کلید پیکربندی می‌سازد. نام خالی برای سرویس‌دهی بدون رمز و سرویس‌دهی وب‌سوکت که TLS ندارند اشکالی ندارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

تعیین جایگزین SetFallback

تابع تعیین جایگزین(cfg &: پیکربندی کارساز، host: رشته، port: صحیح)
وب‌سایتی را تعیین می‌کند که هر اتصالِ غیرکارخواه معتبر را می‌گیرد. آن را به یک سایت واقعی (مال خودتان، روی همان دستگاه) اشاره بدهید تا کاوشگر یک وب‌سرور معمولی ببیند.
net-trojan-Fallback.salam
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.تی سی پی
واردسازی شبکه.تروجان
واردسازی همگام سازی

ناپایا echo_port := 0
ناپایا web_port := 0
ناپایا web_seen := ""
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع echo_server():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تا درست:
            data := تی سی پی.خواندن(c، 4096)
            اگر data.طول() برابر 0:
                بشکن
            پایان
            تی سی پی.نوشتن(c، "echo:" + data)
        پایان
        تی سی پی.بستن(c)
    پایان
پایان

تابع web_server():
    srv := تی سی پی.پیوند(0)
    web_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        web_seen = تی سی پی.خواندن(c، 4096)
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: 12\r\nConnection: close\r\n\r\nhello probes")
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_servers():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(echo_server)
    _b := نخ‌ساز(web_server)
    همگام سازی.انتظار(ready)
پایان

تابع text_of(p: تهی*، n: صحیح): رشته:
    buf := حافظه.تخصیص((n + 1) برگردان طبیعی۶۴)
    حافظه.کپی(buf، p، n برگردان طبیعی۶۴)
    (buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
    برگشت buf برگردان رشته
پایان

تابع read_text(l &: تروجان.پیوند، want: صحیح): رشته:
    buf := حافظه.تخصیص(8192 برگردان طبیعی۶۴)
    دیرکن حافظه.آزادسازی(buf)
    ناپایا out := ""
    تا out.طول() کوچکتر want:
        n := تروجان.خواندن پیوند(l، buf، 8192)
        اگر n کوچکتربرابر 0:
            بشکن
        پایان
        out = out + text_of(buf، n)
    پایان
    برگشت out
پایان

تابع ریشه:
    start_servers()

    ناپایا config := تروجان.پیکربندی کارساز جدید(""، "")
    تروجان.اجازه آدرس‌های خصوصی(config، درست)
    تروجان.افزودن گذرواژه(config، "secret")
    تروجان.تعیین جایگزین(config، "127.0.0.1"، web_port)
    سرچاپ config.میزبان جایگزین، config.درگاه جایگزین برابر web_port
    server := تروجان.سرویس‌دهی بدون رمز(config، 0)

    ناپایا wrong := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "not the password")
    wrong.با تی ال اس = نادرست
    ناپایا stranger := تروجان.شماره گیری(wrong، "127.0.0.1"، echo_port)
    answer := read_text(stranger، 40)
    سرچاپ "wrong password gets a web page:"، answer.شروع با("HTTP/1.1 200 OK")، answer.دربردارد("hello probes")
    تروجان.بستن پیوند(stranger)

    probe := تی سی پی.شماره گیری("127.0.0.1"، server.درگاه)
    تی سی پی.نوشتن(probe، "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
    page := تی سی پی.خواندن(probe، 4096)
    سرچاپ "plain web request gets the page too:"، page.دربردارد("hello probes")
    تی سی پی.بستن(probe)
    سرچاپ "the site saw:"، web_seen.زیررشته(0، 14)

    ناپایا right := تروجان.پیکربندی کارخواه جدید("127.0.0.1"، server.درگاه، "secret")
    right.با تی ال اس = نادرست
    ناپایا member := تروجان.شماره گیری(right، "127.0.0.1"، echo_port)
    تروجان.نوشتن متن پیوند(member، "real client")
    سرچاپ read_text(member، 16)
    تروجان.بستن پیوند(member)

    همگام سازی.خواب میلی ثانیه(300)
    stats := تروجان.آمار(server)
    سرچاپ "accepted"، stats.پذیرفته‌شده، "authed"، stats.احراز‌شده، "fallbacks"، stats.جایگزین‌شده
    تروجان.توقف(server)
پایان
خروجی127.0.0.1 true wrong password gets a web page: true true plain web request gets the page too: true the site saw: GET / HTTP/1.1 echo:real client accepted 3 authed 1 fallbacks 2

افزودن گذرواژه AddPassword

تابع افزودن گذرواژه(cfg &: پیکربندی کارساز، password: رشته)
گذرواژه‌ای را اضافه می‌کند که کارساز می‌پذیرد. فقط درهم SHA-224 آن نگه داشته می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

افزودن درهم گذرواژه AddPasswordHash

تابع افزودن درهم گذرواژه(cfg &: پیکربندی کارساز، hash: رشته)
گذرواژه‌ی از پیش درهم‌شده (۵۶ نویسه‌ی هگز) را اضافه می‌کند، تا گذرواژه‌ی ساده هرگز لازم نباشد در پیکربندی باشد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

دست‌دهی Handshake

تابع دست‌دهی(l &: پیوند، cfg: پیکربندی کارساز): نشست
نخستین بایت‌های کارخواه را می‌خواند تا یک درخواست کامل برسد، درهم گذرواژه را بررسی می‌کند و یک نشست برمی‌گرداند. هرگز به کارخواه پاسخ نمی‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Handshake.salam

آزاد کردن نشست FreeSession

تابع آزاد کردن نشست(s &: نشست)
بافرهای یک نشست را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Handshake.salam

جایگزین Fallback

تابع جایگزین(lp: پیوند*، cfg: پیکربندی کارساز، seen: فشرده سازی.بافر بایت): منطقی
به وب‌سایت جایگزین وصل می‌شود، بایت‌هایی را که کارخواه از پیش فرستاده بازپخش می‌کند و سپس در دو جهت رله می‌کند، پس کارخواه با سایت واقعی حرف می‌زند. اگر جایگزینی نباشد یا نرسد نادرست.
تابع پاسخ به پیوند(lp: پیوند*، cfg: پیکربندی کارساز): صحیح
یک کارخواه را روی یک پیوند سرویس می‌دهد: دست‌دهی، سپس رله به مقصد، یک نشست UDP یا جایگزین. برمی‌گرداند ۱ وقتی کارخواه معتبری سرویس گرفت، ۲ وقتی دست‌دهی شکست خورد و ۳ وقتی به مقصد نرسید. پیوند وب‌سوکت به جایگزین فرستاده نمی‌شود.

به صورت جریان AsStream

تابع به صورت جریان(lp: پیوند*): dyn تونل.جریان
یک پیوند را به صورت tunnel.Stream درمی‌آورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تعیین حالت SetMode

تابع تعیین حالت(cfg &: پیکربندی کارساز، mode: صحیح)
حالتی را که شنود به کار می‌برد برمی‌گزیند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تعیین میزبان شنود SetBind

تابع تعیین میزبان شنود(cfg &: پیکربندی کارساز، host: رشته)
نشانی‌ای را که شنود می‌بندد تعیین می‌کند؛ bind_host را ببینید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تعیین شماره‌گیر SetDialer

تابع تعیین شماره‌گیر(cfg &: پیکربندی کارساز، d: dyn تونل.شماره‌گیر)
اتصال‌های کارساز را به‌جای اتصال مستقیم از یک tunnel.Dialer می‌گذراند، مثلاً یک زنجیره یا پراکسی دیگر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تعیین مسیریاب SetRouter

تابع تعیین مسیریاب(cfg &: پیکربندی کارساز، rd: تونل.شماره‌گیر مسیریاب)
اتصال‌های کارساز را از یک tunnel.RouterDialer می‌گذراند تا قاعده‌ها برای هر مقصد تعیین کنند مستقیم برود، از پراکسی بگذرد یا بسته شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

تعیین سیاست مقصد SetPolicy

تابع تعیین سیاست مقصد(cfg &: پیکربندی کارساز، p: تونل.سیاست مقصد)
سیاست مقصد کارساز را تعیین می‌کند.

اجازه آدرس‌های خصوصی AllowPrivate

تابع اجازه آدرس‌های خصوصی(cfg &: پیکربندی کارساز، enabled: منطقی)
دسترسی به نشانی‌های حلقه محلی و خصوصی را می‌دهد. فقط وقتی اثر دارد که کارساز روی حلقه محلی بسته شده باشد؛ روی هر نشانی دیگر نادیده گرفته می‌شود.

تعیین آمار ترافیک SetStats

تابع تعیین آمار ترافیک(cfg &: پیکربندی کارساز، st: تونل.آمار)
بایت‌های بالا و پایین، اتصال‌ها، فعال‌ها و ناموفق‌ها را در یک tunnel.Stats که نگه می‌دارید می‌شمارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

شنود Listen

تابع شنود(cfg: پیکربندی کارساز، port: صحیح): کارساز
کارساز را با حالت پیکربندی (حالت تی ال اس، حالت ساده یا حالت وب‌سوکت) روی نشانی پیکربندی‌شده و یک درگاه (۰ یکی آزاد برمی‌گزیند) راه می‌اندازد. سرویس‌دهی، سرویس‌دهی بدون رمز و سرویس‌دهی وب‌سوکت همین فراخوانی با حالت ثابت‌اند. معتبر را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Modes.salam

سرویس‌دهی Serve

تابع سرویس‌دهی(cfg: پیکربندی کارساز، port: صحیح): کارساز
یک کارساز تروجان را روی یک درگاه (۰ یک درگاه آزاد برمی‌گزیند) با TLS راه می‌اندازد، با گواهی و کلید پیکربندی. شیوه‌ی عادی اجرا همین است. معتبر را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Tls.salam

سرویس‌دهی بدون رمز ServePlain

تابع سرویس‌دهی بدون رمز(cfg: پیکربندی کارساز، port: صحیح): کارساز
کارسازی بدون TLS راه می‌اندازد. هر کس سر راه باشد ترافیک را می‌خواند، پس فقط روی loopback، در آزمون، یا پشت چیزی که TLS می‌دهد به کار ببرید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

سرویس‌دهی وب‌سوکت ServeWS

تابع سرویس‌دهی وب‌سوکت(cfg: پیکربندی کارساز، port: صحیح): کارساز
کارسازی راه می‌اندازد که تروجان را درون وب‌سوکت و بدون TLS حرف می‌زند، برای نشستن پشت پراکسی معکوس یا CDN که TLS را تمام می‌کند. در این حالت سایت جایگزین نیست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-WebSocket.salam

درگاه کارساز ServerPort

تابع درگاه کارساز(s: کارساز): صحیح
درگاه یک کارساز را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

آمار Stats

تابع آمار(s: کارساز): آمار کارساز
شمارنده‌های یک کارساز را برمی‌گرداند: پذیرفته‌شده، احرازشده و سپرده‌شده به جایگزین.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam

توقف Stop

تابع توقف(s: کارساز)
پذیرش کارخواه‌های تازه را می‌ایستاند. اتصال‌هایی که در جریان‌اند خودشان تمام می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-trojan-Client.salam