Arduino рдкрд░ Keylogger

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рджрд╛рдпрд░рд╛ рдЗрддрдирд╛ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИред рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрдХрд╛рд░реНрдп рд╕рдордп рдХреА рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрд╕реВрдЪрдирд╛ рд░рд┐рд╕рд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдФрд░, рд╢рд╛рдпрдж, рдпрд╣ рд╕рдм рд╣реИред

рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ, рдпрд╣ рдЪреАрдЬ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреБрдВрдЬреА рд╕рдВрдпреЛрдЬрди рдХреЛ рджрдмрд╛рдпрд╛ - Arduino рдиреЗ рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рди рд▓рд┐рдпрд╛ рдФрд░ ... рдХреЗрддрд▓реА рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рднреЗрдЬрд╛ред рдХреЗрддрд▓реА рдирд╣реАрдВ рддреЛ рдХреБрдЫ рдФрд░ред

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

рдЦреИрд░, рдЕрдкрдиреЗ рдирд┐рдЬреА рдЬреАрд╡рди рдореЗрдВ рдЖрдк рдЬреЛ рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдЬрдм рддрдХ рдпрд╣ рдЖрдкрдХреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИред

рд╕рдм рдХреБрдЫ, рд╣рдо рдХрд╛рдиреВрдиреА рд░реВрдк рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдЕрдм рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХрд╛ рд╕рд░рд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреИрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рдПред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рддреЛ, рд╣рдореЗрдВ рдПрдХ рджрд░реНрдЬрди рддрд╛рд░реЛрдВ рдФрд░ рджреЛ рдмреЛрд░реНрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

1) Arduino рд▓рд┐рдпреЛрдирд╛рд░реНрдбреЛ



2) USB рд╣реЛрд╕реНрдЯ рд╢реАрд▓реНрдб



рдХреНрдпреЛрдВ Arduino рд▓рд┐рдпреЛрдирд╛рд░реНрдбреЛ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддрд╛ рд╣реИ рдФрд░, рдЕрдкрдиреЗ рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, ATmega32u4 рдореЗрдВ USB рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИред

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

рдФрд░ рдХрд╛рдлреА рдХреБрдЫ рд╕рдорд░реНрдерд┐рдд рдкрд░рд┐рдзреАрдп рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ:

1) рдЫрд┐рдкрд╛рдИ рдбрд┐рд╡рд╛рдЗрд╕: рдХреАрдмреЛрд░реНрдб, рдорд╛рдЙрд╕, рдЬреЙрдпрд╕реНрдЯрд┐рдХ, рдЖрджрд┐
2) рдЧреЗрдо рдХрдВрдЯреНрд░реЛрд▓рд░
3) ADK- рд╕рдВрдЧрдд Android рдлреЛрди рдФрд░ рдЯреИрдмрд▓реЗрдЯред

рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдПрдВ ред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреАрдмреЛрд░реНрдб рд╣реИред рдпрд╣ HID рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдХреАрдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рдЫрд┐рдкрд╛рдИ рдХреЛрдб 8 рдмрд╛рдЗрдЯреНрд╕:

1) 1 рдмрд╛рдЗрдЯ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╢реЛрдзрдХ (рдПрд▓ Ctrl, рдЖрд░ Ctrl, рдПрд▓ рд╢рд┐рдлреНрдЯ, рдЖрд░ рд╢рд┐рдлреНрдЯ, рдЖрджрд┐) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
2) 2 рдмрд╛рдЗрдЯреНрд╕ - рдЖрд░рдХреНрд╖рд┐рдд рдФрд░ рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдЕрд╢рдХреНрдд рд╣реИред
3) 3-8 рдмрд╛рдЗрдЯреНрд╕ - 6 рдХреБрдВрдЬреА рдХреЗ рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

рд╕рдм рдХреБрдЫ, рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде, рдЕрдм рдЖрдк рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд╡реИрд╕реЗ, рдЖрд░реЗрдЦ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЖрд░реЗрдЦ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдВ рд╣реИ ред

рдЕрдм рдпрд╣ рдмрддрд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реИред

Arduino рд▓рд┐рдпреЛрдирд╛рд░реНрдбреЛ рдХреА рдПрдХ рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ рдкрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: SPI рдХрдиреЗрдХреНрдЯрд░ ICSP рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ (рд╡реЗ 6 рдХрдиреЗрдХреНрдЯрд░ рджрд╛рдИрдВ рдУрд░ рдордзреНрдп рдореЗрдВ рд╣реИрдВ) рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдЙрдиреНрд╣реЗрдВ USB рд╢реАрд▓реНрдб рдбрд┐рдЬрд┐рдЯрд▓ рдХрдиреЗрдХреНрдЯрд░реНрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

1) рдкреАрд▓рд╛ рддрд╛рд░: рдкрд┐рди 4 MOSI (USB рд╣реЛрд╕реНрдЯ рд╢реАрд▓реНрдб рдкрд░ рдкрд┐рди 11 рд╕реЗ рдЬреБрдбрд╝рд╛)ред
2) рдЧреНрд░реЗ рддрд╛рд░: рдкрд┐рди 1 MISO (USB рд╣реЛрд╕реНрдЯ рд╢реАрд▓реНрдб рдкрд░ 12 рдкрд┐рди рд╕реЗ рдЬреБрдбрд╝рд╛)ред
3) рдЧреНрд░реАрди рд╡рд╛рдпрд░: рдкрд┐рди 3 рдПрд╕рд╕реАрдХреЗ (рдпреВрдПрд╕рдмреА рд╣реЛрд╕реНрдЯ рд╢реАрд▓реНрдб рдкрд░ рдкрд┐рди 13 рд╕реЗ рдЬреБрдбрд╝рд╛)ред

рд╣рдо рдиреАрдЪреЗ рдкрд╛рдВрдЪ рддрд╛рд░реЛрдВ рдФрд░ рдПрдХ рд╡рд╛рдпрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╢рдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:

1) рд░реАрд╕реЗрдЯ
2 рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ ) 3.3V рд╕реЗ 3.3V
3) 5V рд╕реЗ 5V
4) GND рд╕реЗ GND
5) VIN рд╕реЗ VIN
6) рд░реАрд╕реЗрдЯ рдХреЛ D7 рдХреЗ рд▓рд┐рдП

рдЕрдм рдирд┐рдпрдВрддреНрд░рдг рдкрд┐рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
1) рдбреА 7 рд╕реЗ рдбреА 7
2) рдбреА 10 рд╕реЗ рдбреА 10

рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╣реИред

рддреЛ, рдПрдХ рд╕рд░реНрдХрд┐рдЯ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ Arduino IDE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЖрдИрдбреАрдИ рд╕реНрд╡рдпрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

USB рд╣реЛрд╕реНрдЯ рд╢реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп ( рдпрд╣рд╛рдВ ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреЛрдб рд╕реНрд╡рдпрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рд╣реИ:

#include <hidboot.h>
#include <SPI.h>
#include <SD.h>

//     .
class KeyboardOut
{
  private:
    KeyReport _keyReport; //   8   .
    
    void send_report();
    
  public:
    size_t press(uint8_t mod, uint8_t key);
    size_t release(uint8_t mod, uint8_t key);
};

KeyboardOut keyboard_out;

//     .
size_t KeyboardOut::press(uint8_t mod, uint8_t key) {
  uint8_t i;
  
  _keyReport.modifiers |= mod;
  
  if (_keyReport.keys[0] != key && _keyReport.keys[1] != key && 
    _keyReport.keys[2] != key && _keyReport.keys[3] != key &&
    _keyReport.keys[4] != key && _keyReport.keys[5] != key) {

    for (i=0; i<6; i++) {
      if (_keyReport.keys[i] == 0x00) {
        _keyReport.keys[i] = key;
        break;
      }
    }
    if (i == 6) {
      return 0;
    }	
  }
  send_report();
  return 1;
}

//     .
size_t KeyboardOut::release(uint8_t mod, uint8_t key) {
  uint8_t i;
  
  _keyReport.modifiers &= mod;
  
  for (i=0; i<6; i++) {
    if (0 != key && _keyReport.keys[i] == key) {
      _keyReport.keys[i] = 0x00;
    }
  }
  send_report();
  return 1;
}

void KeyboardOut::send_report()
{
  HID_SendReport(2, &_keyReport, sizeof(KeyReport));	//     .
}

//     USB Host Shield.
class KeyboardIn : public KeyboardReportParser
{
  protected:
    void OnKeyDown  (uint8_t mod, uint8_t key);
    void OnKeyUp  (uint8_t mod, uint8_t key);
};

KeyboardIn keyboard_in;

//     USB Host Shield.
void KeyboardIn::OnKeyDown(uint8_t mod, uint8_t key)
{
  keyboard_out.press(mod, key);
  
  uint8_t c = OemToAscii(mod, key);    //     
  PrintHex<uint8_t>(key, 0x80);            //     
}

//     USB Host Shield.
void KeyboardIn::OnKeyUp(uint8_t mod, uint8_t key)
{
  keyboard_out.release(mod, key);
  
  uint8_t c = OemToAscii(mod, key);
  PrintHex<uint8_t>(key, 0x80);
}

USB     UsbHost;

HIDBoot<HID_PROTOCOL_KEYBOARD>    HidKeyboard(&UsbHost);

void setup()
{
  UsbHost.Init();
  
  delay( 200 );

  HidKeyboard.SetReportParser(0, (HIDReportParser*)&keyboard_in);
}

void loop()
{
  UsbHost.Task();
}

рдпрд╣ рдХреЗрд╡рд▓ USB Arduino рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ PC рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдХреАрдмреЛрд░реНрдб рдХреЛ USB Host Shield, IDE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Arduino рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╕! рдХреБрдВрдЬреА рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рддреИрдпрд╛рд░ рд╣реИ!

рдкрд░рд┐рдгрд╛рдо:

1) Arduino рдЕрдкрдиреА рдХрдо рдХреАрдордд рдФрд░ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдФрд░ рд╕реЗрдВрд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
2) рдпрд╣ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреАрдмреЛрд░реНрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреАрд╡реА, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░рд┐рдХ рдХреЗрддрд▓реА, рдПрдХ рджреАрдкрдХ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдореЙрдбреНрдпреВрд▓ рдЦрд░реАрджрдиреЗ рд╣реЛрдВрдЧреЗред

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


All Articles