Ngrok v2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ

Ngrok v2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ


ngrok рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реБрд░рдВрдЧ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрддрд╛ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рд╕рднреА рдХреЙрд▓ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдкреЛрд░реНрдЯ рдкрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, 2016 рдХреЗ рдмрд╛рдж рд╕реЗ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕рдВрд╕реНрдХрд░рдг (рдПрдирдЧреНрд░реЛрдХ v1) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдФрд░ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрдВрдж рд╕рдВрд╕реНрдХрд░рдг (рдПрдирдЧреНрд░реЛрдХ рд╡реА 2) рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕реАрдЦрдиреЗ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдУрдкрди рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЬрд░реВрд░реА рд╣реИ? Ngrok рд╡рд┐рдХрд▓реНрдк


рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рддреАрди:


  • рд╕рд░реНрд╡ рдХрд░реЗрдВ ред рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ SSH рд░рд┐рд╡рд░реНрд╕ рдкреЛрд░реНрдЯ рдлрд╝реЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрдВрдж рд╣реИред

    рдлрд╝рд┐рд╢рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕реЗрд░реНрд╡реЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИред

    рд╕реЗрд░реНрд╡реЛ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдХреБрдЫ рдирдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕реА рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

  • localtunnel.me ред рдпрд╣ рд╣реЛрд╕реНрдЯ рд╣реЗрдбрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдПрдХ HTTP рд╕реБрд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ HTTPS рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдЗрдЯ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИред
  • pagekite.net ред HTTP рдФрд░ TLS рд╕реБрд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред 30-рджрд┐рд╡рд╕реАрдп рдкрд░реАрдХреНрд╖рдг рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

(PS рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рд╣реИред рдХреНрд░реВрди рдПрд╕рдПрд╕рдУ рдкреЛрд░реНрдЯ рдЕрдЧреНрд░реЗрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ HTTP рд╕реБрд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реЗрд╡рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕реЗрд╡рд╛ рдХреЗрд╡рд▓ HTTP рд╕реБрд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬреЛ рдПрдирд░реЛрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ)


рд╢рд┐рд╖реНрдЯ рдкреНрд░рдпрд╛рд╕ # 1: рдорд┐рддрд╡реНрдпрдпреА


рдЖрдЗрдП рдорд┐рддреНрдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕реБрдирдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


$ mitmproxy $ http_proxy=http://127.0.0.1:8080 https_proxy=http://127.0.0.1:8080 ngrok http 8080 #     

рдмреЗрд╢рдХ, рдЖрд╡реЗрджрди рдПрдХ рдЕрдорд╛рдиреНрдп рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкрд░ рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рддреНрд░реБрдЯрд┐ рдкрд╛рда рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ DNS- рдУрд╡рд░-HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ngrok tunnel.us.ngrok.com рд╕рд░реНрд╡рд░ рдкрддреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ:


 Get https://dns.google.com/resolve?cd=true&name=tunnel.us.ngrok.com&type=AAAA: x509: certificate signed by unknown authority 

рдЖрдЗрдП рдЦреБрдж рд╣реА tunnel.us.ngrok.com рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:


 $ curl https://tunnel.us.ngrok.com/ curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above. 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкрд┐рдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдЗрдП рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


 $ curl -k https://tunnel.us.ngrok.com Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file. $ curl -k --output - https://tunnel.us.ngrok.com     -illegal WNDINC frame length: 0x474554 

"рдЕрд╡реИрдз WNDINC рдлреНрд░реЗрдо рд▓рдВрдмрд╛рдИ" рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ Google, рдЧреЛ рдЯреВ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдирд░реЛрдХ v2 рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


Muxado рдкреБрд╕реНрддрдХрд╛рд▓рдп


рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдХреНрд╕рд╛рдбреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 $ nm ./ngrok | grep muxado 00000000008ae2c0 T github.com/inconshreveable/muxado.(*addr).Network 00000000008ae2e0 T github.com/inconshreveable/muxado.(*addr).String 0000000000e31b40 B github.com/inconshreveable/muxado.bufferClosed 0000000000e31b50 B github.com/inconshreveable/muxado.bufferFull 00000000008ad430 T github.com/inconshreveable/muxado.Client 0000000000e31b60 B github.com/inconshreveable/muxado.closeError 00000000008b4c00 T github.com/inconshreveable/muxado.(*condWindow).Broadcast 00000000008b2ed0 T github.com/inconshreveable/muxado.(*condWindow).Decrement 00000000008b2da0 T github.com/inconshreveable/muxado.(*condWindow).Increment 00000000008b2d30 T github.com/inconshreveable/muxado.(*condWindow).Init ... 

рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдХрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ рдХреЗ рд▓рд┐рдП):


  1. ngrok рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  2. рд▓реЗрдЦрдХ рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд░реНрдг рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рдереЗред

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рддреНрд░реБрдЯрд┐ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд (TLS) рдХрдиреЗрдХреНрд╢рди рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ muxado рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ TLS рд╕рддреНрд░ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рда рдореЗрдВ рдирд┐рд░рд░реНрдердХ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдореЗрдВ рдУрд╡рд░рдСрд▓ рдордХреНрд╕реИрдбреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрдВрдк рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрд▓ (* рд╕реНрдЯреНрд░реАрдо) рдХреЛ рд░реЛрдХрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд░реАрдб рдФрд░ (* рд╕реНрдЯреНрд░реАрдо)ред


ABI


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЧреЛ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ (рдиреЗрдЯрдХреИрдЯ рдкреНрд░рд╛рдкреНрдд рдкрд╛рд░реНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛):


рдХреЛрдб
 package main import "net" import "github.com/inconshreveable/muxado" func main() { var conn net.Conn conn, _ = net.Dial("tcp", "127.0.0.1:1234") sess := muxado.Client(conn, &muxado.Config{}) conn, _ = sess.Open() data := []byte("Hello, world!") conn.Write(data) } 

рдЗрд╕рд▓рд┐рдП, рдпрд╛рддрд╛рдпрд╛рдд рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:


  • рдЕрджреНрд╡рд┐рддреАрдп рдереНрд░реЗрдб рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ (рдПрдХ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рдереНрд░реЗрдб рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ)ред
  • рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдлрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред
  • рдбреЗрдЯрд╛ рдмрдлрд░ рдХреА рд▓рдВрдмрд╛рдИред

Github.com/inconshreveable/muxado.(*stream).Write рдлрд╝рдВрдХреНрд╢рди (рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ рдХрд┐ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдирд╛рдо рдХреА рдЧрдбрд╝рдмрдбрд╝реА рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ) рдкрд░ objdump рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рд╕реЗ рддрд░реНрдХ рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:


  4de2d6: 48 8b 44 24 58 mov 0x58(%rsp),%rax 4de2db: 48 89 44 24 08 mov %rax,0x8(%rsp) 4de2e0: 48 8b 44 24 60 mov 0x60(%rsp),%rax 4de2e5: 48 89 44 24 10 mov %rax,0x10(%rsp) 4de2ea: 48 8b 44 24 68 mov 0x68(%rsp),%rax 4de2ef: 48 89 44 24 18 mov %rax,0x18(%rsp) 

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рд╣рдореЗрдВ рдХрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, gdb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред


 Thread 1 "test" hit Breakpoint 1, github.com/inconshreveable/muxado.(*stream).Write (buf=..., err=..., n=<optimized out>, s=<optimized out>) at /home/sergey/muxado/src/github.com/inconshreveable/muxado/stream.go:81 81 func (s *stream) Write(buf []byte) (n int, err error) { (gdb) set language c Warning: the current language does not match this frame. (gdb) p {char*[4]}$rsp $1 = { 0x4e0cbf <main.main+319> "H\213l$XH\203\304`\303\350\002A\367\377\351\255\376\377\377", '\314' <repeats 13 times>, "dH\213\f%\370\377\377\377H;a\020vKH\203\354\bH\211,$H\215,$\017\266\005k\003\025", 0xc0000b4000 "", 0xc000014300 "Hello, world!", 0xd <error: Cannot access memory at address 0xd>} 

рдЗрд╕ рд╕рд░рдгреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рд╣реИ, рдФрд░ рдпрд╣ рдкрд╛рд╕ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рджреЛ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рд╕рд░рдгреА рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрддрд╛ рд╣реИ; рдЪреВрдБрдХрд┐ рд╕реВрдЪрдХ рдХреЛ рдзрд╛рд░рд╛ рдореЗрдВ рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЗ рд╕реЗрд▓ рдореЗрдВ рд╣реИред рдпрд╣ (рдЖрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде) рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ, рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ (* рд╕реНрдЯреНрд░реАрдо) рдХреИрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ (рдЬреИрд╕реЗ (* рд╕реНрдЯреНрд░реАрдо)ред рд╕рдм рдХреБрдЫ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ)ред рдпрд╣ рд╕реНрд╡рдпрдВ рдЕрдВрддрд░рд╡рд┐рд░реЛрдз рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИред


Naive try # 2: рд░рдирдЯрд╛рдЗрдо рдлрдВрдХреНрд╢рди рд╣реБрдХ


рдЪрд▓реЛ рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (* рд╕реНрдЯреНрд░реАрдо)ред рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП:


рдХреБрдЫ рдЗрд╕ рддрд░рд╣
 unsigned long long write_hook() { volatile long long* rsp = RSP(); void* stream = (void*)rsp[1]; char* buf = (char*)rsp[2]; long long len = rsp[3]; UNSET_HOOK(); unsigned long long ans; PUSH(rsp[3]); PUSH(rsp[2]); PUSH(rsp[1]); CALL(syscall_write); POP(24, ans); SET_HOOK(); return ans; } 

рдЬрдм рдЗрд╕ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдПрдирд░реЛрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реЙрд░реНрдо рдХрд╛ рдХреНрд░реИрд╢ рдорд┐рд▓рддрд╛ рд╣реИ:


 unexpected fault address 0x0 fatal error: fault [signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x4a2dc6] goroutine 1 [running]: runtime.throw(0xac7ca8, 0x5) /usr/local/Cellar/go/1.8.3/libexec/src/runtime/panic.go:596 +0x95 fp=0xc42016f9f0 sp=0xc42016f9d0 runtime.sigpanic() ... 

рдпрд╣рд╛рдВ рд╣рдо рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдХреЗ рдЪреЗрд╣рд░реЗ рдореЗрдВ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрд╛рдзрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛрд░реЛрдЗрди рд╕реНрдЯреИрдХ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрджрд┐ рдореМрдЬреВрджрд╛ рд╕реНрдЯреИрдХ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреВрд╕рд░реА рдЬрдЧрд╣ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬреАрд╕реАрдкреА рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдкреБрд░рд╛рдиреЗ рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЖрд░рдмреАрдкреА рд░рдЬрд┐рд╕реНрдЯрд░ (рддрдерд╛рдХрдерд┐рдд рдлреНрд░реЗрдо рдкреЙрдЗрдВрдЯрд░) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдЖрдк рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореБрдХреНрдд рдкреБрд░рд╛рдиреЗ рд╕реНрдЯреИрдХ (рдЙрдкрдпреЛрдЧ-рдмрд╛рдж-рдореБрдХреНрдд) рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рддреЛ C рдпрд╣рд╛рдБ рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред


# 3 рдХрд╛ рдкреНрд░рдпрд╛рд╕: gdb рд╕реНрдХреНрд░рд┐рдкреНрдЯ


рд╣рдо gbb рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рднреА рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛:


 set language c break github.com/inconshreveable/muxado.(*stream).Write commands set $stream={void*}($rsp+8) set $buf={char*}($rsp+16) set $len={long long}($rsp+24) p $stream p (*$buf)@$len p $len cont end run tcp 8080 -log stdout -log-format logfmt -log-level debug 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реНрдг рдбрдВрдк рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:


  • рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рди рд╣реЛ рдЬрд╛рдПред рд░рд┐рдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдпреЛрдЬрд┐рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдбреЗрдЯрд╛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред (рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдЯреИрдХ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рднреА рддреБрдЪреНрдЫ рд╣реИред рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ $ rsp + 48 рд╣реИ)
  • рддреАрд╕рд░реА рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ред Gdb рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╛рд░реНрд╕рд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ABI рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рджреЗрдЦреЗрдВ) рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдбрдВрдк рджреГрд╢реНрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ рдФрд░ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

# 4 рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рд╡рд┐рдзрд╛рдирд╕рднрд╛


рдмрд╛рдЗрдирд░реА рдХреЛ рдПрдирдбреНрд░реЛрдХ рдУрдмрдЬрдВрдк рдХреЗ рд╕рд╛рде рдЦреЛрд▓рддреЗ рд╣реБрдП, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ .text рдФрд░ .rodata рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ 0xc10 = 3088 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЕрдВрддрд░ рд╣реИ:


  9773eb: e9 50 ff ff ff jmpq 977340 <type..eq.[2]github.com/kevinburke/cli.Flag>   .rodata: 0000000000978000 <type.*>: 

рдлрд╛рдЗрд▓ рдореЗрдВ рд╣реА рд╡рд╣реА рдЧреИрдк рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдЬреАрд░реЛ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рднрд░реА рд╣реЛрддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП .text рдЦрдВрдб рд╡рд╛рд▓реЗ рдЦрдВрдб рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ (рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЦреЛрдЬ / рдмрджрд▓реЗрдВ) рдФрд░ рдХреЙрд▓ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрдерд╛рди рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

X86_64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдВрдХреНрд░рдордг рдирд┐рд░реНрджреЗрд╢ 5 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ: рдЕрдВрддрд┐рдо рдкрддреЗ (рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рдЗрдВрдЯ) рдХреЛ рдУрдкрдХреЛрдб (рдИ 9) + рдСрдлрд╕реЗрдЯред рдЪреВрдВрдХрд┐ ngrok рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 2 рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдирдП рдХреЛрдб рд╕рд╣рд┐рдд .text рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ 9 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкрд╣рд▓реЗ 5 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЬрдВрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  8b0e70: 64 48 8b 0c 25 f8 ff mov %fs:0xfffffffffffffff8,%rcx 8b0e77: ff ff 

рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рдкрддрд╛ func + 9 рдкрд░ рдЬрд╛рдПрдВ

рдлрд╝рдВрдХреНрд╢рди (* рд╕реНрдЯреНрд░реАрдо) рдореЗрдВ рд░реАрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рдеред рд╕рдм рдХреБрдЫ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:


  8b0f6d: 7f 22 jg 8b0f91 <github.com/inconshreveable/muxado.(*stream).Read+0xa1> ... 8b0f8c: 48 83 c4 58 add $0x58,%rsp 8b0f90: c3 retq 8b0f91: 48 8b 5c 24 60 mov 0x60(%rsp),%rbx 

рд░рд┐рдЯ рдирд┐рд░реНрджреЗрд╢ (рд░рд┐рдЯреЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд░рд┐рдЯреЗрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ) рдХреЗрд╡рд▓ 1 рдмрд╛рдЗрдЯ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдПрдХ рдХреВрдж рд▓рдХреНрд╖реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдВрдХреНрд░рдордг рдирд┐рд░реНрджреЗрд╢ рдХрд╣реАрдВ рднреА рд╕реНрд╡рдпрдВ рд╣реА рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ (рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рдж, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред


рдкреВрд░реНрдг рдХреЛрдбрд╛рдВрддрд░рдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреЛрдб
 section .text org 0x9773f0 use64 write_pre_hook: ;      (*stream).Write push dword 0x74697277 call log add rsp, 8 mov rcx, [fs:-8] ;   (*stream).Write    jmp 0x8b0e79 read_post_hook: ;     0x8b0f8c add rsp, 0x58 ;    ret, .  push dword 0x64616572 call log add rsp, 8 ret log: ;  ,         push rdi push rsi push rdx push rax ;; stack layout: ;; rsp+32 ret ;; rsp+40 kind ('read' or 'writ') ;; rsp+48 ret0 ;; rsp+56 &stream ;; rsp+64 buf ;; rsp+72 len ;; rsp+80 unknown ;; rsp+88 n ;; rsp+96 err ;       mmap mov rax, 9 mov rdi, 0 mov rsi, 44 add rsi, [rsp+72] mov rdx, 3 push r10 push r8 push r9 mov r10, 34 mov r8, -1 mov r9, 0 syscall test rax, rax js segfault pop r9 pop r8 pop r10 ;     mov edi, [rsp+40] mov [rax], edi lea rdi, [rax+4] lea rsi, [rsp+56] push rcx mov rcx, 40 ;up to rsp+96 rep movsb ;    mov rsi, [rsp+72] ;rsp+64 mov rcx, [rsp+80] ;rsp+72 rep movsb pop rcx ;  write mov rdi, 3 mov rsi, rax mov rdx, 44 add rdx, [rsp+72] push rax call writeall ;   pop rdi mov rsi, 44 add rsi, [rsp+72] mov rax, 11 syscall test rax, rax jnz segfault ;   pop rax pop rdx pop rsi pop rdi ret writeall: mov rax, 1 syscall test rax, rax js segfault add rsi, rax sub rdx, rax test rdx, rdx jnz writeall ret segfault: ;          mov [0], rax 
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрдХреНрд░рдо
 import sys stream = sys.stdin.buffer while True: chunk = stream.read(44) if not chunk: break assert len(chunk) == 44 kind = chunk[:4].decode('ascii') assert kind in ('read', 'writ') str_id = hex(int.from_bytes(chunk[4:12], 'little')) l = int.from_bytes(chunk[20:28], 'little') n = int.from_bytes(chunk[36:], 'little') if kind == 'read' else l buf = stream.read(l) assert len(buf) == l if '--full-data' not in sys.argv: buf = buf[:n] print('((%r, %s, %d), (%r, %d))'%(kind, str_id, l, buf, n)) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ngrok рд╕реЗ рдЯреНрд░реИрдлрд┐рдХ рдбрдВрдк рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг рд╣реИред рдЗрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦреЗрдВ!


рдвреЗрд░
 (('writ', 0xc420326600, 4), (b'\x00\x00\x00\x00', 4)) (('writ', 0xc420148e00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420326600, 227), (b'{"Version":["2"],"ClientId":"","Extra":{"OS":"linux","Arch":"amd64","Authtoken":"3FjYRxVDd2QvNkX13h82k_6Thwfp93PUZEpsz3vYe5v","Version":"2.2.8","Hostname":"tunnel.us.ngrok.com","UserAgent":"ngrok/2","Metadata":"","Cookie":""}}\n', 227)) (('read', 0xc420326600, 512), (b'{"Version":"2","ClientId":"df05b949e58359ea6901cff60935531d","Error":"","Extra":{"Version":"prod","Cookie":"lh7YagbqJ9ixLYyE05ZDMPvaYNVm5isu$xF1Mp8fDc689269YUGlGNAV/0XRyrEH390rwGqILZqYS5+qDUNbMn2l4puKD2CJHAgI83yo49aopujf0uhPBm4t997BTBvpFSg+zrgnrW9cRNuO8ApSe2+OPpUuPK0GZYZ1bpbz7Pod7cJycwVIgDFZZXLxEeNdXylQxSax9YOxgxcHeLBa79OjqrJpEUUWYtTNiMa5wxkr0AwKh","AccountName":"\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb3\xd0\xb5\xd0\xb9 \xd0\x9b\xd0\xb8\xd1\x81\xd0\xbe\xd0\xb2","SessionDuration":0,"PlanName":"Free"}}', 430)) (('read', 0xc420148a00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420148200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc420148200, 111), (b'{"Id":"","Proto":"https","Opts":{"Hostname":"","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 111)) (('read', 0xc420148200, 512), (b'{"Id":"39b1e32e134eff8671b02268945643f9","URL":"https://deb82e2e.ngrok.io","Proto":"https","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"WUiWWfM9kRbpFpXoEOCydiJdEob7BKN0$EHrXSWq/fY/mRDRSTNqkVWEVCDJUyBdMSU5uSEMH5RHq5D9W1gA1BTWTUEUbltyhQIlhTJvGxezhDeOYqGe5CwNFHnIOVNidToULds48FCVdWc0zRC3Djyack74P9mQ11VHKQKAXPzXUXlUbo6TRkwMWKrpN0q93pmL3fQamRP6cREZTl2YMdnFUZtwHwyh4LGacxGAvdCP867rTKBL/3eWLdkcF2lSPdHuH8V51RzCMWMIbvmtyySzE', 512)) (('read', 0xc420148200, 1024), (b'cOIiZ09W6pMPTHoTcih0"}}', 23)) (('writ', 0xc4200ea200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc4200ea200, 127), (b'{"Id":"","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 127)) (('read', 0xc4200ea200, 512), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","URL":"http://deb82e2e.ngrok.io","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"G4nIrca8GTvq4H62sTmqdb144FmhMgrg$U6TwkKWafv/3+bFM5AP7xIFfkWqx+HUsYWhkYXivrtMfcqan0mKZx99LHGI7mm5lOMmvI+Kdy7WF/GnwrMDXrRFwhYowczaWKRKnUimnNtndq7rdttMevFabwe5WSzwf+IZhWzQ2yvcW31+qVuS7F6uykUSw+mnBNtsdXFSNpToagqQOM66A8LT+l3f3OOHKrWpdq39Bz2RfoRmXaRpkDrdfT6vPUQd6S8uVUnv3t2173Ik7AgT9PlzOMJ', 512)) (('read', 0xc4200ea200, 1024), (b'hhVDbeM2HP+qV6S5I="}}', 21)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('read', 0xc420148a00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148a00, 4), (b'\x00ys7', 4)) (('read', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('writ', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc4200ea200, 4), (b'\x00\x00\x00\x03', 4)) (('read', 0xc4200ea200, 8), (b'M\x00\x00\x00\x00\x00\x00\x00', 8)) (('read', 0xc4200ea200, 77), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","ClientAddr":"***.***.**.***:17815"}', 77)) (('read', 0xc4200ea200, 32768), (b'GET / HTTP/1.1\r\nHost: deb82e2e.ngrok.io\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 Midori/6\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: ru-RU\r\nX-Forwarded-For: ***.***.**.***\r\n\r\n', 359)) (('writ', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('writ', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc4200ea200, 32768), (b'', 0)) xF1Mp8fDc689269YUGlGNAV / 0XRyrEH390rwGqILZqYS5 + qDUNbMn2l4puKD2CJHAgI83yo49aopujf0uhPBm4t997BTBvpFSg + zrgnrW9cRNuO8ApSe2 + OPpUuPK0GZYZ1bpbz7Pod7cJycwVIgDFZZXLxEeNdXylQxSax9YOxgxcHeLBa79OjqrJpEUUWYtTNiMa5wxkr0AwKh", "ACCOUNTNAME": "\ xd0 \ XA1 \ xd0 \ xb5 \ xd1 \ x80 \ xd0 \ xb3 \ xd0 \ xb5 \ xd0 \ XB9 \ xd0 (('writ', 0xc420326600, 4), (b'\x00\x00\x00\x00', 4)) (('writ', 0xc420148e00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420326600, 227), (b'{"Version":["2"],"ClientId":"","Extra":{"OS":"linux","Arch":"amd64","Authtoken":"3FjYRxVDd2QvNkX13h82k_6Thwfp93PUZEpsz3vYe5v","Version":"2.2.8","Hostname":"tunnel.us.ngrok.com","UserAgent":"ngrok/2","Metadata":"","Cookie":""}}\n', 227)) (('read', 0xc420326600, 512), (b'{"Version":"2","ClientId":"df05b949e58359ea6901cff60935531d","Error":"","Extra":{"Version":"prod","Cookie":"lh7YagbqJ9ixLYyE05ZDMPvaYNVm5isu$xF1Mp8fDc689269YUGlGNAV/0XRyrEH390rwGqILZqYS5+qDUNbMn2l4puKD2CJHAgI83yo49aopujf0uhPBm4t997BTBvpFSg+zrgnrW9cRNuO8ApSe2+OPpUuPK0GZYZ1bpbz7Pod7cJycwVIgDFZZXLxEeNdXylQxSax9YOxgxcHeLBa79OjqrJpEUUWYtTNiMa5wxkr0AwKh","AccountName":"\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb3\xd0\xb5\xd0\xb9 \xd0\x9b\xd0\xb8\xd1\x81\xd0\xbe\xd0\xb2","SessionDuration":0,"PlanName":"Free"}}', 430)) (('read', 0xc420148a00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420148200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc420148200, 111), (b'{"Id":"","Proto":"https","Opts":{"Hostname":"","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 111)) (('read', 0xc420148200, 512), (b'{"Id":"39b1e32e134eff8671b02268945643f9","URL":"https://deb82e2e.ngrok.io","Proto":"https","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"WUiWWfM9kRbpFpXoEOCydiJdEob7BKN0$EHrXSWq/fY/mRDRSTNqkVWEVCDJUyBdMSU5uSEMH5RHq5D9W1gA1BTWTUEUbltyhQIlhTJvGxezhDeOYqGe5CwNFHnIOVNidToULds48FCVdWc0zRC3Djyack74P9mQ11VHKQKAXPzXUXlUbo6TRkwMWKrpN0q93pmL3fQamRP6cREZTl2YMdnFUZtwHwyh4LGacxGAvdCP867rTKBL/3eWLdkcF2lSPdHuH8V51RzCMWMIbvmtyySzE', 512)) (('read', 0xc420148200, 1024), (b'cOIiZ09W6pMPTHoTcih0"}}', 23)) (('writ', 0xc4200ea200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc4200ea200, 127), (b'{"Id":"","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 127)) (('read', 0xc4200ea200, 512), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","URL":"http://deb82e2e.ngrok.io","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"G4nIrca8GTvq4H62sTmqdb144FmhMgrg$U6TwkKWafv/3+bFM5AP7xIFfkWqx+HUsYWhkYXivrtMfcqan0mKZx99LHGI7mm5lOMmvI+Kdy7WF/GnwrMDXrRFwhYowczaWKRKnUimnNtndq7rdttMevFabwe5WSzwf+IZhWzQ2yvcW31+qVuS7F6uykUSw+mnBNtsdXFSNpToagqQOM66A8LT+l3f3OOHKrWpdq39Bz2RfoRmXaRpkDrdfT6vPUQd6S8uVUnv3t2173Ik7AgT9PlzOMJ', 512)) (('read', 0xc4200ea200, 1024), (b'hhVDbeM2HP+qV6S5I="}}', 21)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('read', 0xc420148a00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148a00, 4), (b'\x00ys7', 4)) (('read', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('writ', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc4200ea200, 4), (b'\x00\x00\x00\x03', 4)) (('read', 0xc4200ea200, 8), (b'M\x00\x00\x00\x00\x00\x00\x00', 8)) (('read', 0xc4200ea200, 77), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","ClientAddr":"***.***.**.***:17815"}', 77)) (('read', 0xc4200ea200, 32768), (b'GET / HTTP/1.1\r\nHost: deb82e2e.ngrok.io\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 Midori/6\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: ru-RU\r\nX-Forwarded-For: ***.***.**.***\r\n\r\n', 359)) (('writ', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('writ', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc4200ea200, 32768), (b'', 0)) " WUiWWfM9kRbpFpXoEOCydiJdEob7BKN0 $ EHrXSWq / рд╡рд┐рддреНрддреАрдп рд╡рд░реНрд╖ / mRDRSTNqkVWEVCDJUyBdMSU5uSEMH5RHq5D9W1gA1BTWTUEUbltyhQIlhTJvGxezhDeOYqGe5CwNFHnIOVNidToULds48FCVdWc0zRC3Djyack74P9mQ11VHKQKAXPzXUXlUbo6TRkwMWKrpN0q93pmL3fQamRP6cREZTl2YMdnFUZtwHwyh4LGacxGAvdCP867rTKBL / 3eWLdkcF2lSPdHuH8V51RzCMWMIbvmtyySzE ', (('writ', 0xc420326600, 4), (b'\x00\x00\x00\x00', 4)) (('writ', 0xc420148e00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420326600, 227), (b'{"Version":["2"],"ClientId":"","Extra":{"OS":"linux","Arch":"amd64","Authtoken":"3FjYRxVDd2QvNkX13h82k_6Thwfp93PUZEpsz3vYe5v","Version":"2.2.8","Hostname":"tunnel.us.ngrok.com","UserAgent":"ngrok/2","Metadata":"","Cookie":""}}\n', 227)) (('read', 0xc420326600, 512), (b'{"Version":"2","ClientId":"df05b949e58359ea6901cff60935531d","Error":"","Extra":{"Version":"prod","Cookie":"lh7YagbqJ9ixLYyE05ZDMPvaYNVm5isu$xF1Mp8fDc689269YUGlGNAV/0XRyrEH390rwGqILZqYS5+qDUNbMn2l4puKD2CJHAgI83yo49aopujf0uhPBm4t997BTBvpFSg+zrgnrW9cRNuO8ApSe2+OPpUuPK0GZYZ1bpbz7Pod7cJycwVIgDFZZXLxEeNdXylQxSax9YOxgxcHeLBa79OjqrJpEUUWYtTNiMa5wxkr0AwKh","AccountName":"\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb3\xd0\xb5\xd0\xb9 \xd0\x9b\xd0\xb8\xd1\x81\xd0\xbe\xd0\xb2","SessionDuration":0,"PlanName":"Free"}}', 430)) (('read', 0xc420148a00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420148200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc420148200, 111), (b'{"Id":"","Proto":"https","Opts":{"Hostname":"","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 111)) (('read', 0xc420148200, 512), (b'{"Id":"39b1e32e134eff8671b02268945643f9","URL":"https://deb82e2e.ngrok.io","Proto":"https","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"WUiWWfM9kRbpFpXoEOCydiJdEob7BKN0$EHrXSWq/fY/mRDRSTNqkVWEVCDJUyBdMSU5uSEMH5RHq5D9W1gA1BTWTUEUbltyhQIlhTJvGxezhDeOYqGe5CwNFHnIOVNidToULds48FCVdWc0zRC3Djyack74P9mQ11VHKQKAXPzXUXlUbo6TRkwMWKrpN0q93pmL3fQamRP6cREZTl2YMdnFUZtwHwyh4LGacxGAvdCP867rTKBL/3eWLdkcF2lSPdHuH8V51RzCMWMIbvmtyySzE', 512)) (('read', 0xc420148200, 1024), (b'cOIiZ09W6pMPTHoTcih0"}}', 23)) (('writ', 0xc4200ea200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc4200ea200, 127), (b'{"Id":"","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 127)) (('read', 0xc4200ea200, 512), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","URL":"http://deb82e2e.ngrok.io","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"G4nIrca8GTvq4H62sTmqdb144FmhMgrg$U6TwkKWafv/3+bFM5AP7xIFfkWqx+HUsYWhkYXivrtMfcqan0mKZx99LHGI7mm5lOMmvI+Kdy7WF/GnwrMDXrRFwhYowczaWKRKnUimnNtndq7rdttMevFabwe5WSzwf+IZhWzQ2yvcW31+qVuS7F6uykUSw+mnBNtsdXFSNpToagqQOM66A8LT+l3f3OOHKrWpdq39Bz2RfoRmXaRpkDrdfT6vPUQd6S8uVUnv3t2173Ik7AgT9PlzOMJ', 512)) (('read', 0xc4200ea200, 1024), (b'hhVDbeM2HP+qV6S5I="}}', 21)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('read', 0xc420148a00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148a00, 4), (b'\x00ys7', 4)) (('read', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('writ', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc4200ea200, 4), (b'\x00\x00\x00\x03', 4)) (('read', 0xc4200ea200, 8), (b'M\x00\x00\x00\x00\x00\x00\x00', 8)) (('read', 0xc4200ea200, 77), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","ClientAddr":"***.***.**.***:17815"}', 77)) (('read', 0xc4200ea200, 32768), (b'GET / HTTP/1.1\r\nHost: deb82e2e.ngrok.io\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 Midori/6\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: ru-RU\r\nX-Forwarded-For: ***.***.**.***\r\n\r\n', 359)) (('writ', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('writ', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc4200ea200, 32768), (b'', 0)) " G4nIrca8GTvq4H62sTmqdb144FmhMgrg $ U6TwkKWafv / (('writ', 0xc420326600, 4), (b'\x00\x00\x00\x00', 4)) (('writ', 0xc420148e00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420326600, 227), (b'{"Version":["2"],"ClientId":"","Extra":{"OS":"linux","Arch":"amd64","Authtoken":"3FjYRxVDd2QvNkX13h82k_6Thwfp93PUZEpsz3vYe5v","Version":"2.2.8","Hostname":"tunnel.us.ngrok.com","UserAgent":"ngrok/2","Metadata":"","Cookie":""}}\n', 227)) (('read', 0xc420326600, 512), (b'{"Version":"2","ClientId":"df05b949e58359ea6901cff60935531d","Error":"","Extra":{"Version":"prod","Cookie":"lh7YagbqJ9ixLYyE05ZDMPvaYNVm5isu$xF1Mp8fDc689269YUGlGNAV/0XRyrEH390rwGqILZqYS5+qDUNbMn2l4puKD2CJHAgI83yo49aopujf0uhPBm4t997BTBvpFSg+zrgnrW9cRNuO8ApSe2+OPpUuPK0GZYZ1bpbz7Pod7cJycwVIgDFZZXLxEeNdXylQxSax9YOxgxcHeLBa79OjqrJpEUUWYtTNiMa5wxkr0AwKh","AccountName":"\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb3\xd0\xb5\xd0\xb9 \xd0\x9b\xd0\xb8\xd1\x81\xd0\xbe\xd0\xb2","SessionDuration":0,"PlanName":"Free"}}', 430)) (('read', 0xc420148a00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420148200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc420148200, 111), (b'{"Id":"","Proto":"https","Opts":{"Hostname":"","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 111)) (('read', 0xc420148200, 512), (b'{"Id":"39b1e32e134eff8671b02268945643f9","URL":"https://deb82e2e.ngrok.io","Proto":"https","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"WUiWWfM9kRbpFpXoEOCydiJdEob7BKN0$EHrXSWq/fY/mRDRSTNqkVWEVCDJUyBdMSU5uSEMH5RHq5D9W1gA1BTWTUEUbltyhQIlhTJvGxezhDeOYqGe5CwNFHnIOVNidToULds48FCVdWc0zRC3Djyack74P9mQ11VHKQKAXPzXUXlUbo6TRkwMWKrpN0q93pmL3fQamRP6cREZTl2YMdnFUZtwHwyh4LGacxGAvdCP867rTKBL/3eWLdkcF2lSPdHuH8V51RzCMWMIbvmtyySzE', 512)) (('read', 0xc420148200, 1024), (b'cOIiZ09W6pMPTHoTcih0"}}', 23)) (('writ', 0xc4200ea200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc4200ea200, 127), (b'{"Id":"","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 127)) (('read', 0xc4200ea200, 512), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","URL":"http://deb82e2e.ngrok.io","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"G4nIrca8GTvq4H62sTmqdb144FmhMgrg$U6TwkKWafv/3+bFM5AP7xIFfkWqx+HUsYWhkYXivrtMfcqan0mKZx99LHGI7mm5lOMmvI+Kdy7WF/GnwrMDXrRFwhYowczaWKRKnUimnNtndq7rdttMevFabwe5WSzwf+IZhWzQ2yvcW31+qVuS7F6uykUSw+mnBNtsdXFSNpToagqQOM66A8LT+l3f3OOHKrWpdq39Bz2RfoRmXaRpkDrdfT6vPUQd6S8uVUnv3t2173Ik7AgT9PlzOMJ', 512)) (('read', 0xc4200ea200, 1024), (b'hhVDbeM2HP+qV6S5I="}}', 21)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('read', 0xc420148a00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148a00, 4), (b'\x00ys7', 4)) (('read', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('writ', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc4200ea200, 4), (b'\x00\x00\x00\x03', 4)) (('read', 0xc4200ea200, 8), (b'M\x00\x00\x00\x00\x00\x00\x00', 8)) (('read', 0xc4200ea200, 77), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","ClientAddr":"***.***.**.***:17815"}', 77)) (('read', 0xc4200ea200, 32768), (b'GET / HTTP/1.1\r\nHost: deb82e2e.ngrok.io\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 Midori/6\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: ru-RU\r\nX-Forwarded-For: ***.***.**.***\r\n\r\n', 359)) (('writ', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('writ', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc4200ea200, 32768), (b'', 0)) + IZhWzQ2yvcW31 + qVuS7F6uykUSw + mnBNtsdXFSNpToagqQOM66A8LT + l3f3OOHKrWpdq39Bz2RfoRmXaRpkDrdfT6vPUQd6S8uVUnv3t2173Ik7AgT9PlzOMJ ', (('writ', 0xc420326600, 4), (b'\x00\x00\x00\x00', 4)) (('writ', 0xc420148e00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420326600, 227), (b'{"Version":["2"],"ClientId":"","Extra":{"OS":"linux","Arch":"amd64","Authtoken":"3FjYRxVDd2QvNkX13h82k_6Thwfp93PUZEpsz3vYe5v","Version":"2.2.8","Hostname":"tunnel.us.ngrok.com","UserAgent":"ngrok/2","Metadata":"","Cookie":""}}\n', 227)) (('read', 0xc420326600, 512), (b'{"Version":"2","ClientId":"df05b949e58359ea6901cff60935531d","Error":"","Extra":{"Version":"prod","Cookie":"lh7YagbqJ9ixLYyE05ZDMPvaYNVm5isu$xF1Mp8fDc689269YUGlGNAV/0XRyrEH390rwGqILZqYS5+qDUNbMn2l4puKD2CJHAgI83yo49aopujf0uhPBm4t997BTBvpFSg+zrgnrW9cRNuO8ApSe2+OPpUuPK0GZYZ1bpbz7Pod7cJycwVIgDFZZXLxEeNdXylQxSax9YOxgxcHeLBa79OjqrJpEUUWYtTNiMa5wxkr0AwKh","AccountName":"\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb3\xd0\xb5\xd0\xb9 \xd0\x9b\xd0\xb8\xd1\x81\xd0\xbe\xd0\xb2","SessionDuration":0,"PlanName":"Free"}}', 430)) (('read', 0xc420148a00, 4), (b'\xff\xff\xff\xff', 4)) (('writ', 0xc420148200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc420148200, 111), (b'{"Id":"","Proto":"https","Opts":{"Hostname":"","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 111)) (('read', 0xc420148200, 512), (b'{"Id":"39b1e32e134eff8671b02268945643f9","URL":"https://deb82e2e.ngrok.io","Proto":"https","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"WUiWWfM9kRbpFpXoEOCydiJdEob7BKN0$EHrXSWq/fY/mRDRSTNqkVWEVCDJUyBdMSU5uSEMH5RHq5D9W1gA1BTWTUEUbltyhQIlhTJvGxezhDeOYqGe5CwNFHnIOVNidToULds48FCVdWc0zRC3Djyack74P9mQ11VHKQKAXPzXUXlUbo6TRkwMWKrpN0q93pmL3fQamRP6cREZTl2YMdnFUZtwHwyh4LGacxGAvdCP867rTKBL/3eWLdkcF2lSPdHuH8V51RzCMWMIbvmtyySzE', 512)) (('read', 0xc420148200, 1024), (b'cOIiZ09W6pMPTHoTcih0"}}', 23)) (('writ', 0xc4200ea200, 4), (b'\x00\x00\x00\x01', 4)) (('writ', 0xc4200ea200, 127), (b'{"Id":"","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":""},"Extra":{"Balance":false,"Token":""}}\n', 127)) (('read', 0xc4200ea200, 512), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","URL":"http://deb82e2e.ngrok.io","Proto":"http","Opts":{"Hostname":"deb82e2e.ngrok.io","Auth":"","Subdomain":"","HostHeaderRewrite":false,"LocalURLScheme":""},"Error":"","Extra":{"Token":"G4nIrca8GTvq4H62sTmqdb144FmhMgrg$U6TwkKWafv/3+bFM5AP7xIFfkWqx+HUsYWhkYXivrtMfcqan0mKZx99LHGI7mm5lOMmvI+Kdy7WF/GnwrMDXrRFwhYowczaWKRKnUimnNtndq7rdttMevFabwe5WSzwf+IZhWzQ2yvcW31+qVuS7F6uykUSw+mnBNtsdXFSNpToagqQOM66A8LT+l3f3OOHKrWpdq39Bz2RfoRmXaRpkDrdfT6vPUQd6S8uVUnv3t2173Ik7AgT9PlzOMJ', 512)) (('read', 0xc4200ea200, 1024), (b'hhVDbeM2HP+qV6S5I="}}', 21)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x00ys7', 4)) (('read', 0xc420148a00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148a00, 4), (b'\x00ys7', 4)) (('read', 0xc420148e00, 4), (b'\x00ys7', 4)) (('writ', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('writ', 0xc420148a00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc420148e00, 4), (b'\x11|\xb9\x99', 4)) (('read', 0xc4200ea200, 4), (b'\x00\x00\x00\x03', 4)) (('read', 0xc4200ea200, 8), (b'M\x00\x00\x00\x00\x00\x00\x00', 8)) (('read', 0xc4200ea200, 77), (b'{"Id":"9714ddd4cb111adf6599f099cec98482","ClientAddr":"***.***.**.***:17815"}', 77)) (('read', 0xc4200ea200, 32768), (b'GET / HTTP/1.1\r\nHost: deb82e2e.ngrok.io\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 Midori/6\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: ru-RU\r\nX-Forwarded-For: ***.***.**.***\r\n\r\n', 359)) (('writ', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148a00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('read', 0xc420148e00, 4), (b'\x0e\xb2\xc0\x01', 4)) (('writ', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('writ', 0xc420148a00, 4), (b'X\xa3?+', 4)) (('read', 0xc420148e00, 4), (b'X\xa3?+', 4)) (('read', 0xc4200ea200, 32768), (b'', 0)) 

рдЗрд╕ рдбрдВрдк рд╕реЗ рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рд╕реБрд░рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╡рд╛рд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╡рд╛рд╣ рд╕реНрд╡рдпрдВ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИред
  • рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХ 32-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ - рдзрд╛рд░рд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП 0, рд╕реБрд░рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП 1 рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП 3 рд╣реИред
  • рдЯрд╛рдЗрдк -1 рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░реАрдо рдПрдХ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рд╣реИред рдХрдиреЗрдХреНрд╢рди рд╕рд░реНрдЬрдХ рд╕рдордп-рд╕рдордп рдкрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ 4 рдмрд╛рдЗрдЯ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ 2 рдРрд╕реЗ рдкреНрд░рд╡рд╛рд╣ рд╣реИрдВред
  • рдЬрдм рдПрдХ рдЖрд╡рдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ 32-рдмрд┐рдЯ рдкреНрд░рдХрд╛рд░ 3, 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдПрд▓ (рдереЛрдбрд╝рд╛-рдПрдВрдбрд┐рдпрди) рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рдВрдмрд╛рдИ рдПрд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ JSON рд╡рд╕реНрддреБ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рд░реНрд╡рд┐рд╕ рдкреИрдХреЗрдЯ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЪреВрдВрдХрд┐ muxado рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕реНрд░реЛрдд рд╕реЗ рд╕реАрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдирд░реЛрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрдВрд╕реЛрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдерд╛ред GitHub

рдкреБрдирд╢реНрдЪ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

Source: https://habr.com/ru/post/hi485564/


All Articles