рдШреБрдЯрдиреЗ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рдЯреАрд╕реАрдкреА рд╕реНрдирд┐рдлрд░ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛ (рднрд╛рдЧ рдПрдХ)

рдПрдХ рдмрд╛рд░, рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореБрдЭреЗ рдПрдХ рдмреИрдХрд╕реНрдЯ рд░реЙрдХрд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рдереА, рдЬрд┐рд╕реЗ рдЬрдХреНрд╕реНрдЯрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ YouTube, рдлреЗрд╕рдмреБрдХ рд╡реАрдбрд┐рдпреЛ, GoogleVideo рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╕реАрдзреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рд╣рд░ рдмрд╛рд░ рд╡рд┐рдВрдбреЛрдЬ рдмреВрдЯ рдХрд░рдиреЗ рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рдмреАрдПрд╕рдУрдбреА рдорд┐рд▓рд╛ред рд╕реЗрдл рдореЛрдб рдореЗрдВ рдЬрд╛рдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЗрд╕ рд░рдЪрдирд╛ рдХреЛ рдирдлреАрдЧ рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рд╢реНрди рдереЗред
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрдзреНрдпрдпрди рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдирдбреАрдЖрдИрдПрд╕ рдорд┐рдирд┐рдкреЛрд░реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдмреВрдЯ рд╕рдордп рдкрд░ рдорд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред "рдпреЗ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВ?" рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

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


рдпрд╣ рдУрдкрд╕ рд╡рд┐рдВрдбреЛрдЬ, рд╡рд┐рдирдПрдкреАрдЖрдИ рдФрд░ рд╕реА ++ рдХреЗ рдХреБрдЫ рдЬреНрдЮрд╛рди рдХреЛ рдорд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдкреВрдЫреЗрдВред рдореИрдВ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд╣реАрдВ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ)ред рдХреБрдЫ рдЦрд╛рд▓реА рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдирд┐рд░реНрдорд╛рдг рд╣реИрдВ, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдирдбреАрдЖрдИрдПрд╕ рдорд┐рдирд┐рдкреЛрд░реНрдЯ рдЪрд╛рд▓рдХ рдФрд░ рдиреАрд▓реА рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдгрдп рдХреЗ рдкреНрд░рддрд┐рдкрдХреНрд╖реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЗрд░рд┐рдд рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ HTTP рдпрд╛ TCP / IP рдкреИрдХреЗрдЯреНрд╕ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдХреИрд╕реЗ рдкрдХрдбрд╝реЗрдВрдЧреЗ? рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  1. рдкрддреЛрдВ рдХреЛ URL рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
    рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ HTTP GET рд╡рд╛рд▓реЗ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдкреИрдХреЗрдЯреНрд╕ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ GET рдХрд╣рд╛рдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИред рдирд┐рд░реНрдгрдп рдмрд▓реНрдХрд┐ рд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рд╛рдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджреВрд╕рд░реА рдУрд░, " www.youtube.com/watch?v=o78nFVB1tJA " рдЬреИрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкрддреЗ рдЖрдкрдХреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред
  2. рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
    рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрдВрдЯреЗрдВрдЯ-рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ HTTP рд╣реЗрдбрд░ рдХреЛ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╡реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, YouTube рд╕реЗ рдлреНрд▓реИрд╢ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдЙрдкрд░реЛрдХреНрдд рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдореИрдВ рд╕реИрдХреНрд╕реЛрдлреЛрди рдмрдЬрд╛рддрд╛ рд╣реВрдВ, рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реЗрдбрд░ "рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рд╡реАрдбрд┐рдпреЛ / x-flv" рд╣реЛрдЧрд╛, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлреНрд▓реИрд╢ рд╡реАрдбрд┐рдпреЛ рд╢реАрд░реНрд╖рдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдЧрд╛ред MPEG4 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣реЗрдбрд░ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ / mp4 рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╣реЛрдЧрд╛ред

рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡рддрдГ 1) рдФрд░ 2 рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред

DLL рдЬрд╛рд▓ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ DLL рдХреА рд╢реБрд░реВрдЖрддред рдЗрд╕ рдЬрдЧрд╣ рдореЗрдВ рдХреБрдЫ рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЬреЛ рдХреЛрдИ рднреА рд╕рдм рдХреБрдЫ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣рд╛рдВ рд╕реНрд░реЛрдд рдФрд░ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рдВ, рдХреЗрд╡рд▓ 3 рдХреЗрдмреА)ред рдпрджрд┐ рдЖрдк рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ 32-рдмрд┐рдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓реЗрдиреЗ рдФрд░ рд╕рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рд╕рдорд╛рди рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AdMuncher (рд╣реИрд▓реЛ рдорд░реЗ рдФрд░ рд╢реИрдиреЙрд╡реЗ!), рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рд╕рд╣реА рд╕рд╣рд╡рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХреА рд╣реИ (рдпрд╣) рд╕реБрдзрд╛рд░-)ред % TEMP% рдореЗрдВ .log рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред

рдмрд╛рдХреА рд╕рднреА рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдХреБрдЫ рд╕рдордЭрд╛рдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЯреНрд░реИрдк рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдбреАрдПрд▓рдПрд▓ рдХрд╛ рдкрд░рд┐рдЪрдп рдПрдХ рд╕реБрдВрджрд░ рд╣реИрдХрд┐рдВрдЧ рд╡рд┐рд╖рдп рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдкрдиреЗ DLL рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

рдЫрд╡рд┐

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

  1. DLL рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ?
  2. рдкреИрдХреЗрдЯ рдХреИрд╕реЗ рдкрдХрдбрд╝реЗ?

рдЖрдЗрдП рдиреАрдЪреЗ рдЙрдирдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ ...

рдХрд┐рд╕реА рдФрд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ DLL рдЗрдВрдЬреЗрдХреНрд╖рди


рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рджреЛ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдбреАрдПрд▓рдПрд▓ред рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдЧрд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░ DLL рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛, рд╣рдо Vistual Studio рд▓реЙрдиреНрдЪ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреБрд░рдВрдд рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди (Injector.cpp) рд▓рд┐рдЦреЗрдВрдЧреЗ:

#pragma comment(linker, "/entry:WinMain /nodefaultlib") void APIENTRY winMain() { HMODULE interceptor = LoadLibrary(TEXT("Interceptor.dll")); if (interceptor != NULL) { HOOKPROC cbtHook = (HOOKPROC) GetProcAddress(interceptor, (LPCSTR) 1); HHOOK hHook = (HHOOK) SetWindowsHookEx(WH_CBT, cbtHook, interceptor, 0); if (hHook != NULL) { MessageBox(NULL, TEXT("Press OK to terminate."), TEXT("Interceptor is working."), MB_OK); UnhookWindowsHookEx(hHook); } FreeLibrary(interceptor); } } 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдХреЛрдб рдХреА рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реАрдзреЗ WinMain () рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рд░реАрдкреНрд▓реЗ рдХреЗред рд╕реНрд░реЛрдд рдореЗрдВ, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ MSVCRT рдХрд╛рдЯ рджреЗрддрд╛ рд╣реВрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлрдВрдХреНрд╢рди рдирдВрдмрд░ 1 (рдСрд░реНрдбрд┐рдирд▓ рджреНрд╡рд╛рд░рд╛ рдЗрдореНрдкреЛрд░реНрдЯ) рдкрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдмрдирд╛рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдмреАрдЯреА рдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдЧреНрд▓реЛрдмрд▓ рдЯреНрд░реИрдк рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рддрдм рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдореЛрдбрд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, "рдУрдХреЗ" рдмрдЯрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рд╕реВрдХреНрд╖реНрдо рд╡рд┐рдорд╛рди рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрдмрд╛рдПрдБред рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣ рдЙрди рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ DLL рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП User32 WinAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред
рд╕реАрдмреАрдЯреА, рдХрдВрдкреНрдпреВрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ред WH_CBT рдЯреНрд░реИрдк рдЖрдо рддреМрд░ рдкрд░ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "... рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдВрдбреЛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ, рдмрдирд╛рдиреЗ, рдирд╖реНрдЯ рдХрд░рдиреЗ, рдХрдо рдХрд░рдиреЗ, рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ, рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдЬрд╛рд▓ рдХреЛ рдХрд╣рддрд╛ рд╣реИред рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХрдорд╛рдВрдб рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рд╕реЗ рдХреАрдмреЛрд░реНрдб рдпрд╛ рдорд╛рдЙрд╕ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрдирдкреБрдЯ рдлрд╝реЛрдХрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ ... тАЭMSDN рдХрд╛ рдРрд╕рд╛ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рджред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЙрди 99% рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬреЛ рдорд╛рдирдХ рдЦрд┐рдбрд╝рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рд╕реБрдВрджрд░рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдЯреНрд░реИрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо DLL рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ, рдпрд╣ рдЙрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:
  1. рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ DLL рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛
  2. DLL рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдкрддрд╛ рд╕реНрдерд╛рди рдкрд░ рд░рд╣реЗрдЧрд╛
  3. рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдпрд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ DLL рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рджреЗрддрд╛ рд╣реИ

рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдорд┐рд▓рд╛рди рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ 64-рдмрд┐рдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ 64-рдмрд┐рдЯ DLL рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╡рд╣реА 32-рдмрд┐рдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ 32-рдмрд┐рдЯ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ 64-рдмрд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдЖрдЗрдП рднрд╡рд┐рд╖реНрдп рдХреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ (Interceptor.cpp) рдХреЗ рдХрдВрдХрд╛рд▓ рд▓рд┐рдЦреЗрдВ:

 HINSTANCE g_hDllInstance; //  ,     LRESULT CALLBACK CBT_Hook(int nCode, WPARAM wParam, LPARAM lParam) { return 0; } //        BOOL onLoad() { return TRUE; } //        BOOL onUnload() { return TRUE; } BOOL WINAPI DllMain(HINSTANCE hDllInstance, DWORD dwReason, LPVOID lpRsrv) { switch(dwReason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hDllInstance); g_hDllInstance = hDllInstance; return onDllLoad(); break; case DLL_PROCESS_DETACH: return onDllUnload(); break; default: break; } return TRUE; } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рдирдВрдмрд░ 1 рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирдХ DEF рдлрд╝рд╛рдЗрд▓ (Interceptor.def) рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ / DEF рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХрд░ рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:

 LIBRARY Intercept EXPORTS CBT_Hook @1 

рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм DLL рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЪрд┐рдкрдХрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЙрдирдореЗрдВ рдмреИрдарддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдШреБрд╕рдкреИрда рди рдХрд░рдиреЗ рдФрд░ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреАрдПрд▓рдПрд▓ рдХреЛ рд▓реЛрдб рдФрд░ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ), рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ:

 const char *appsToIntercept[] = { "chrome.exe", "iexplore.exe", "opera.exe", "firefox.exe", "safari.exe", 0}; char thisProcessPath[MAX_PATH], *thisProcessName; char thisDllPath[MAX_PATH], *thisDllName; BOOL onLoad() { BOOL rv = FALSE; //       thisProcessPath     thisProcessName GetModuleFileName(NULL, thisProcessPath, sizeof(thisProcessPath) - 1); GetFullPathName(thisProcessPath, sizeof(thisProcessPath), thisProcessPath, &thisProcessName); *(TCHAR*) ((TCHAR*) (thisProcessName - sizeof(TCHAR))) = 0; //     DLL  thisDllPath   DLL  thisDllName GetModuleFileName(g_hDllInstance, thisDllPath, sizeof(thisDllPath) - 1); GetFullPathName(thisDllPath, sizeof(thisDllPath), thisDllPath, &thisDllName); *(TCHAR*) ((TCHAR*) (thisDllName - sizeof(TCHAR))) = 0; //      ,       if (!lstrcmpi(thisProcessPath, thisDllPath)) return TRUE; //        for (int i = 0; appsToIntercept[i] != 0; i++) { if (!lstrcmpi(thisProcessName, appsToIntercept[i])) { rv = TRUE; break; } } //          ,   if (!rv) return FALSE; //     WinSock2 return installHooks(); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрд╡реЗрджрди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЕрдм рд╣рдо рд╕реАрдзреЗ WinSock рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд╡рд░реЛрдзрди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рд╕рдорд╛рд░реЛрд╣ рдЕрд╡рд░реЛрдзрди рддрдВрддреНрд░


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд░реЗрдЦрд╛ рддрдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдкрдврд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдореИрдВ рдЗрдВрдбреЗрдВрдЯ рдХрд░реВрдВрдЧрд╛ред рдЕрдкрдиреЗ рд╡рд┐рд╕реНрдордп рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░, рдмрд╣реБрдд рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рдЙрдиреНрдирдд, рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк Habr├й рдкрд░ рдПрдХ рдФрд░ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ - "рд╕реНрдЯреЗрдк-рдмрд╛рдп-рд╕реНрдЯреЗрдк рдЧрд╛рдЗрдб рдЯреВ рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓реНрд╕ (EXE)" ред

рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:

рдЫрд╡рд┐

рд╕рднреА DLL, рдЬрд┐рдирдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдЖрдпрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ PE рд╣реЗрдбрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ, рд╕реАрдзреЗ рдЙрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддрд╛рд░реНрдХрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЕрдиреНрдп DLL рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдЕрд▓рдЧ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреИрдХреЗрдЯ рдХреЛ рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛ рдЬреЛ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд▓реЗрдХрд┐рди рдмрд╛рдХреА рд╕рднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред
рдЕрд╡рд░реЛрдзрди рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: WinHTTP, WinINet, WinSockред рдореЗрд░реЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ WS2_32.DLL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ WinSock рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрд╡рд░реЛрдзрди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдПрдЪрдЯреАрдЯреАрдкреАрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЬрд╣рд╛рдВ рдкреИрдХреЗрдЯ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред HTTPS рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди WinHTTP рдлрд╝рдВрдХреНрд╢рди рдФрд░ / рдпрд╛ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреЛ рд╣реБрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рд╣рдо рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
  2. рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ, рддрд╛рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдП
  3. рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ
  4. рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
  5. рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗрдВ
  6. рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ
  7. рдХреЙрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВ

рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреА рдкреНрд░рд╛рдЪреАрди рдкрд░рдВрдкрд░рд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рд╕рднреА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, WS2_32 рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд░реЛрдХрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдВрддрд┐рдо рддреАрдиреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, HTTP рдЕрдиреБрд░реЛрдз - HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣реБрдХрд┐рдВрдЧ рдХрдиреЗрдХреНрдЯ () рдФрд░ WSAConnect () рд╕рдЦреНрддреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдирдП рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдбреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ, WinSock рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ DLL рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ:

 //      typedef struct _APIHOOK { BOOL isInstalled; //    ? const TCHAR *moduleName; //   () const TCHAR *functionName; //    LPVOID newAddr; //    LPVOID oldAddr; //    DWORD oldCodeSize; //      char newCode[HOOK_CODE_SIZE]; //   char oldCode[HOOK_CODE_SIZE]; //   } APIHOOK, *PAPIHOOK; 

HOOK_CODE_SIZE рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдХреНрдпрд╛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВред

рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрд╕реЗрдВрдмрд▓рд░


рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддреЛ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдпрд╣ рд╣реЛрдЧрд╛:
  1. рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
    рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЙрд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ cdecl рдпрд╛ stdcall, рд╕рд╛рде рд╣реА рд╕рднреА рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╣рдо рд╕реНрдЯреИрдХ рдХреЛ рджреВрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
  2. рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
    рдЗрд╕рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ 32.dll рд╕реЗ GetProcAddress () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  3. рдлрдВрдХреНрд╢рди рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рд╕реЗ рдХреЛрдб рд╕реЗрд╡ рдХрд░реЗрдВ
    рдпрд╣рд╛рдБ рднреА, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдПрдХрд╛рдВрдд рд╕реНрдерд╛рди рдкрд░ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐
  4. рдкреИрдЪ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ
    рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╣рд▓рд╡рд╛рди рдХреЛ рд╕рдВрдХреНрд░рдордг рд╣реЛ

рдЫрд╡рд┐

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

 MyFuncHandler: <blablablablabla> OriginalFunction: JMP MyFunHandler 

рдпрд╣ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рдПрдХ 32-рдмрд┐рдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ 5 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдПрдХ JMP рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдЕрдиреБрджреЗрд╢ рдХреЛрдб рдФрд░ рдЪрд╛рд░ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдкрддреЗ рдХреЗ рд▓рд┐рдПред рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдХреНрдпреЛрдВ, рдмрд╛рдж рдореЗрдВред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╡рдзрд╛рд░рдгрд╛ рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╣реИ:

 MyFuncHandler: <blablablablabla> OriginalFunction: PUSH MyFuncHandler RETN 

рдЗрд╕рдХреЗ рд▓рд┐рдП 6 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб PUSH <32-рдмрд┐рдЯ DWORD> рдФрд░ RETN рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдПрдХ рдирд┐рд░рдкреЗрдХреНрд╖ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ред рд╣рд╛рдБ, рд╣рд╛рдБред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрддрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рд╡рд░реНрддрдорд╛рди рдкрддреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдореЗрдВ, рдпрд╣ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдкрддреЗ рдХреА рдЬрдЧрд╣ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдЬрд╛рдКрдВрдЧрд╛ред
рд╣рдо рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 //    #define HOOK_CODE_SIZE 5 // JMP XX XX XX XX //    BOOL hookInstall(PAPIHOOK thisHook) { UCHAR asmJMP = 0xE9; if (!thisHook || thisHook->isInstalled == TRUE) { SetLastError(ERROR_ALREADY_EXISTS); return FALSE; //   ,      } //      if (thisHook->moduleName && thisHook->functionName && !(thisHook->oldAddr = GetProcAddress( GetModuleHandle(thisHook->moduleName), thisHook->functionName) ) ) { SetLastError(ERROR_NOT_FOUND); return FALSE; //   ,      } //      if (IsBadReadPtr(thisHook->oldAddr, HOOK_CODE_SIZE)) { SetLastError(ERROR_INVALID_ADDRESS); return FALSE; //   } //            if ( *(DWORD*)((PBYTE) thisHook->oldAddr + 1) == ((DWORD) thisHook->newAddr - (DWORD) thisHook->oldAddr - HOOK_CODE_SIZE) && *(BYTE*) thisHook->oldAddr == asmJMP) { return TRUE; //       ,     } //           DWORD oldFlags; if (!VirtualProtect(thisHook->oldAddr, HOOK_CODE_SIZE, PAGE_EXECUTE_READWRITE, &oldFlags) || IsBadWritePtr(thisHook->oldAddr, HOOK_CODE_SIZE)) { SetLastError(ERROR_WRITE_PROTECT); return FALSE; //     } //       memcpy(thisHook->oldCode, thisHook->oldAddr, HOOK_CODE_SIZE); //  JMP thisHook->newCode[0] = asmJMP; //    *(DWORD *) &thisHook->newCode[1] = ((DWORD) thisHook->newAddr - HOOK_CODE_SIZE - (DWORD) thisHook->oldAddr); //     thisHook->isInstalled = TRUE; //      #define hookEnable(p) memcpy(p->oldAddr, p->newCode, HOOK_CODE_SIZE); //      #define hookDisable(p) memcpy(p->oldAddr, p->oldCode, HOOK_CODE_SIZE); //   hookEnable(thisHook); return TRUE; } 

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

 //     BOOL hookRemove(PAPIHOOK thisHook) { //   ,     if (!thisHook->isInstalled) return FALSE; //    hookDisable(thisHook); //      thisHook->isInstalled = FALSE; //        thisHook->newAddr = (LPVOID) NULL; thisHook->oldAddr = (LPVOID) NULL; return TRUE; } 

рдЕрдм рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдШреБрд╕рдкреИрда рдХреИрд╕реЗ рдХрд░реЗрдВ, рд╕реЗрдЯ рдХрд░реЗрдВ, рдирд┐рдХрд╛рд▓реЗрдВ, рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рдЬрд╛рд▓ рдмрдВрдж рдХрд░реЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рд╡рд┐рдирд╕реЙрдХ рдиреЗрдЯрд┐рд╡ рдлрдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░


рддреЛ, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:

 //      #define DECLARE_HOOK(module, name) {0, module, #name, my_##name} //       APIHOOK hookList[] = { DECLARE_HOOK(winSockDll, send), DECLARE_HOOK(winSockDll, WSASend), DECLARE_HOOK(winSockDll, recv), DECLARE_HOOK(winSockDll, WSARecv), DECLARE_HOOK(winSockDll, WSAGetOverlappedResult), DECLARE_HOOK(winSockDll, closesocket), 0}; 

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

 int WSAAPI my_send(SOCKET s, char *buf, int len, int flags) { PAPIHOOK thisHook = hookFind(my_send); if (NULL == thisHook) return (int) 0; hookDisable(thisHook); int rv; rv = send(s, buf, len, flags); hookEnable(thisHook); return rv; } 

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

 //        #define DEFINE_HOOK(RTYPE, CTYPE, NAME, ARGS)\ RTYPE CTYPE my_##NAME ##ARGS \ { \ PAPIHOOK thisHook = hookFind(my_##NAME); \ if (NULL == thisHook) \ return (RTYPE) 0; \ hookDisable(thisHook); \ RTYPE rv; 

рдФрд░ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА:

 //        #define LEAVE_HOOK() } \ hookEnable(thisHook); \ return rv; 

рдЕрдЧрд▓рд╛, рд╣рдо рд╕рд░рдгреА рд╕реЗ рд╢реЗрд╖ рдЬрд╛рд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╛рд▓ рдХреА рд╕реНрдерд╛рдкрдирд╛


рд╣рдорд╛рд░реЗ рдУрдирд▓реЙрдб рдореЗрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ () рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореИрдЬрд┐рдХ рдлрдВрдХреНрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓рд╣реВрдХ () рдХрд╣рддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рднреА рдШрдЯрдХ рд╣реИрдВ, рд╣рдо рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЬрд╛рд▓ рдХреА рдПрдХ рдмреИрдЪ рд╕реНрдерд╛рдкрдирд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ:

 //      BOOL installHooks() { BOOL rv = FALSE; for (int i = 0; hookList[i].moduleName; i++) { if (hookInstall(&hookList[i])) rv = TRUE; } return rv; } 

рддреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВред рдФрд░ рдмреИрдЪ рдЯреНрд░реИрдк рд╣рдЯрд╛рдиреЗ рдХреЛрдИ рдХрдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╣реАрдВ рд╣реИ:

 //      BOOL removeHooks() { BOOL rv = FALSE; for (int i = 0; hookList[i].moduleName; i++) { if (hookRemove(&hookList[i])) rv = TRUE; } return rv; } 


HTTP рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░


рдЦреИрд░, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдПред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрдХреЗрдЯ рд╣реИрдВ - HTTP рдЕрдиреБрд░реЛрдз рдФрд░ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВред рддрджрдиреБрд╕рд╛рд░, рдкреВрд░реНрд╡ рдХреЛ рдкреНрд░рдХрд╛рд░ рднреЗрдЬрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ (), рдмрд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ()ред рднреЗрдЬреЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореВрд▓ рдХреЛрдб рдХрд╣рддреЗ рд╣реБрдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рднреЗрдЬреЗрдВ рдмрдлрд░ рдЕрднреА рднреА рдкреНрд░рд╛рдЪреАрди рд╣реИред рд░рд┐рд╕реЗрдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕, рдХреНрд░рдорд╢рдГ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рднреА рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИред WSASend () рдпрд╛ WSARecv () рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, WSAOVERLAPPED рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдИрд╡реЗрдВрдЯ рдкрдВрдЬреАрдХреГрдд рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рддреБрд░рдиреНрдд рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ SOCKET_ERROR рдХреЛ GetLastError () рдХреЗ рд╕рд╛рде WSA_IO_PENDING рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдЧрд▓рд╛, рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП WaitForSingleObject (), рдФрд░ рдЬреИрд╕реЗ рд╣реА рдИрд╡реЗрдВрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рд╣реЛрддреА рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди WSAGetOverlappedResult () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдлрд░ рдкрдврд╝рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдереЛрдбрд╝реА рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдиреА рд╣реЛрдЧреАред рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреНрдпреЛрдВ рд╣реИрдВред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗред WSAGetOverlappedResult () рдХреЙрд▓ рднреЗрдЬрдиреЗ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдлрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд▓реЗрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдмрдлрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп, рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдЕрд╡рд░реЛрдзрди рдХреЗ рд▓рд┐рдП HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдорд╛рдзрд╛рди рдЬреЛрдбрд╝реЗ рдореЗрдВ рднреЗрдЬрдиреЗ (), recv () рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реИред рддреЛ, рдЖрдЗрдП рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ, рдЬреЛ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧреА
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп:

 struct REQUEST { SOCKET socket; char *request; LPWSABUF wsaBuf; PREQUEST next; } 

рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╕реЙрдХреЗрдЯ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛, рд╣рдо рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗред рдпрд╣реА рд╣реИ, рдореБрдЦреНрдп рдЖрд╡реЗрджрди рдЙрд╕реА рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдЕрдиреБрд░реЛрдз рд╕реВрдЪрдХ HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред LPWSABUF рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рдЬрдм WSASend () / WSARecv () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реВрдЪрдХ рдХреЛ рдмрдлрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рдФрд░ WSAGetOverlappedResult () рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред рдлрд┐рд░ рд╕реЗ, рд╕реЙрдХреЗрдЯ рдирдВрдмрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд┐рд▓рд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ WSASend () рдХреЗ рд▓рд┐рдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдХрд┐рд╕реА рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓реЗрдЦрди рдФрд░ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд░рд┐рдХреНрдд рдХреЗ рджреМрд░рд╛рди рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реВрдВред
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рдПрдХ рдЬреБрдбрд╝реЗ рд▓рд┐рдВрдХ рд╕реВрдЪреА рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдХрд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реЗ рдЦреЛ рди рдЬрд╛рдПрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдПрд╕рдЯреАрдПрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдХреВрд▓ рдУрд▓рдВрдкрд┐рдпрд╛рдб рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдФрд░ рдмрд╕ рдХрдиреЗрдХреНрдЯреЗрдб рд╕реВрдЪреА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдерд╛ред рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред
рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ):

 //      PREQUEST findRequest(SOCKET s); //    -     PREQUEST addRequest(SOCKET s, char *request); //     void delRequest(SOCKET s); 

рдЕрдЧрд▓рд╛, рд╣рдо рд╕рднреА рднреЗрдЬрдиреЗ () рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 //      BOOL commonSendHandler(PAPIHOOK thisHook, SOCKET s, char *buf, int len, BOOL isWsa) { //      'GET '    if тАж //  HTTP  char *request = getHttpHeaders((const char *) buf, len); if (request != NULL) addRequest(s, request); return TRUE; } 

рдФрд░ рд╕рднреА рд░рд┐рдХрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд░ ():

 //           BOOL commonRecvHandler(PAPIHOOK thisHook, SOCKET s, char *buf, int len, BOOL isWsa) { //      'HTTP'    if тАж //  ,    PREQUEST req = findRequest(s); if (NULL == req) return FALSE; //  HTTP  char *response = getHttpHeaders((const char *) buf, len); if (response != NULL) { //       ... delRequest(s); } return TRUE; } 

рдЯреЗрд▓реАрдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧред рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдЬреЛ рдЕрднреА рднреА рдкрдХрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдкреИрдХреЗрдЯ рднреЗрдЬрддреЗ рд╕рдордп, рд╢реБрд░реБрдЖрдд рдореЗрдВ 'GET' рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред HTTP GET HTTP . 'HTTP' , GET . . %TEMP%\< .exe>-< >.log
. , WSARecv():

 // WSARecv() DEFINE_HOOK(int, WSAAPI, WSARecv, (SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)) { rv = WSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine); //   if (!rv && NULL != lpNumberOfBytesRecvd) { commonRecvHandler(thisHook, s, lpBuffers->buf, *lpNumberOfBytesRecvd, TRUE); } else //   if (rv == SOCKET_ERROR && WSAGetLastError() == WSA_IO_PENDING) { //  WSARecv ,   WSA ,     PREQUEST req = findRequest(s); if (req != NULL) req->wsaBuf = lpBuffers; } LEAVE_HOOK(); } 

, . read():

 // WSAGetOverlappedResult() DEFINE_HOOK(BOOL, WSAAPI, WSAGetOverlappedResult, (SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer, BOOL fWait, LPDWORD lpdwFlags)) { rv = WSAGetOverlappedResult(s, lpOverlapped, lpcbTransfer, fWait, lpdwFlags); if (rv && NULL != lpcbTransfer && *lpcbTransfer > MIN_HTTP_HEADER_SIZE) { // ,    ? PREQUEST req = findRequest(s); if (req != NULL && req->wsaBuf != NULL) commonRecvHandler(thisHook, s, req->wsaBuf->buf, *lpcbTransfer, TRUE); } LEAVE_HOOK(); } 

closesocket() , . , , , , YouTubeтАж

Google Chrome www.youtube.com/watch?v=o78nFVB1tJA ( ):

 [22:28:48] [SOCKET = 0EB0, REQUEST = 1327 bytes, RESPONSE = 329 bytes] ->GET /videoplayback?algorithm=throttle-factor&burst=40&cp=U0hTS1RRU19OTUNOM19MS1dBOlR1eGNSd1JHRkdy&expire=1346465093&factor=1.25&fexp=926900%2C910103%2C922401%2C920704%2C912806%2C924412%2C913558%2C912706&gcr=fi&id=a3bf27155075b490&ip=91.155.190.10&ipbits=8&itag=34&keepalive=yes&key=yt1&ms=au&mt=1346441292&mv=m&range=13-1781759&signature=7415093589702691B2E46681B2EF24EC370C2F1F.D6D55168E2211687994A3F47D8919AC5470C567D&source=youtube&sparams=algorithm%2Cburst%2Ccp%2Cfactor%2Cgcr%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2Cexpire&sver=3&upn=GlJDbjcQ-2w HTTP/1.1 Host: oo---preferred---elia-hel1---v11---lscache1.c.youtube.com Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.26 Safari/537.4 Accept: */* Referer: http://www.youtube.com/watch?v=o78nFVB1tJA Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: VISITOR_INFO1_LIVE=UxycPwPFJBs; __utma=27069237.1349026492.1343302158.1343302158.1343302158.1; __utmz=27069237.1343302158.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); use_hitbox=d5c5516c3379125f43aa0d495d100d6ddAEAAAAw; recently_watched_video_id_list=697d12b6b10771c1d93bb1bb4cf53148WwEAAABzCwAAAG83OG5GVkIxdEpB; PREF=fv=11.3.31; ACTIVITY=1346441327664 <-HTTP/1.1 200 OK Last-Modified: Wed, 09 May 2012 00:20:14 GMT Content-Type: video/x-flv Date: Fri, 31 Aug 2012 19:28:48 GMT Expires: Fri, 31 Aug 2012 19:28:48 GMT Cache-Control: private, max-age=23465 Accept-Ranges: bytes Content-Length: 1781747 Connection: keep-alive X-Content-Type-Options: nosniff Server: gvs 1.0 

HTTP .

- , ? , .

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


. IPC -. :
  1. URL .
  2. . IPC, , .
  3. .

. YouTube / Flash Video. . 90% тАЭContent-typeтАЭ.
:

рдФрд░ рдХреНрдпрд╛? рджреЛ рдкрд╣рд▓реВ:

  1. рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдереНрд░реЗрдб рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдпрд╛ рд╕реНрдирд┐рдлрд░-рдЬреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдПрдЪрдЯреАрдЯреАрдкреА рдЯреНрд░реИрдлрд╝рд┐рдХ, рдлрд╝рд╕рд▓ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рдореМрд▓рд┐рдХ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рд╕реНрддрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  2. рдпрд╣ рддрдХрдиреАрдХ рди рдХреЗрд╡рд▓ WinSock рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣реА рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдХрд╣реАрдВ рднреА рдЧреЛрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдФрд░ рдЙрдбрд╝рд╛рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧреБрдВрдЬрд╛рдЗрд╢ рджреЗрддрд╛ рд╣реИред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧреАред

UPD: рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдЯреНрд░реИрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдирд┐рд╖реНрдард╛ рд╕реЗ,
// рд╕реНрдЯ

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


All Articles