рдПрдкреАрдЖрдИ рдХреЙрд▓ рдЕрд╡рд░реЛрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

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

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

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

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

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

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

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реА рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рд▓реЗрдЦ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдореИрдВ "рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрднрд╡ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред


1. рдореЙрдиреАрдЯрд░ рдХрд╛ рд╕рд╛рд░


рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдХреА рдорджрдж рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг "рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рд╣реИрдВрдбрд▓рд░" (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ "рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░", рдЬрд┐рд╕реЗ рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

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

2. рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВрдбрд▓рд░ рдХреА рд╕рд╣реА рдШреЛрд╖рдгрд╛


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

function InterceptedMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; begin // TODO... end; 

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

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

 procedure InterceptedFunc; begin // TODO... end; 

рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЙрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдХреЙрд▓ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛, рд╕рдордЭреМрддреЛрдВ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред

рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо TApplication.MessageBox рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдореВрд▓ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 function TTestClas.InterceptedApplicationMessageBox( const Text, Caption: PChar; Flags: Longint): Integer; begin // TODO... end; 

рдпрджрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦреЗрдЧрд╛:

 function InterceptedApplicationMessageBox( Self: TObject; const Text, Caption: PChar; Flags: Longint): Integer; begin // TODO... end; 

рд╣реИрдВрдбрд▓рд░ рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдВрддрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдЪрд░ рд╕реНрд╡ рдирд╣реАрдВ рд╣реИред

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

 function TTestClas.InterceptedApplicationMessageBox( const Text, Caption: PChar; Flags: Longint): Integer; begin ShowMessage(Self.ClassName); end; 

... рддрдм рдкрд╛рда TApplication рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ TTestClass, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рди рдХрд┐ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

3. рдПрдХ рдЦрд┐рдбрд╝рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрдкрд╡рд░реНрдЧ


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

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

рддрдХрдиреАрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдбреЗрд▓реНрдлреА рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╡реИрд╢реНрд╡рд┐рдХ TWinControl.MainWndProc рд╣реИрдВрдбрд▓рд░ рдкрд░ рдЕрдкрдиреА рд╕рднреА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреА рд╡рд┐рдВрдбреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднреБрдЧрддрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕рдВрджреЗрд╢ + рд╕рдВрджреЗрд╢ рдирд┐рд░рдВрддрд░, рд╡рд░реНрдЪреБрдЕрд▓ WndProc рдФрд░ DefaultHandler рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдХреЗ рдФрд░ рдХреБрдЫ рдФрд░ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ...

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдЦрд┐рдбрд╝рдХреА рдХреЛ рдЙрдк-рд╡рд░реНрдЧ рдХрд░рдирд╛

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдкрд╛рдВрдЪ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  1. рдореВрд▓ рд╡рд┐рдВрдбреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
  2. рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬрдирд╛
  3. рдПрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХрд╛рдо
  4. рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЙрд▓ (рд▓реЙрдЧрд┐рдВрдЧ / рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓рдирд╛, рдЗрддреНрдпрд╛рджрд┐) рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛
  5. рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреБрд░рд╛рдиреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред

рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИред

 unit uSubClass; interface uses Windows, Messages, Classes, Controls, Forms, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} function MainFormSubclassProc(hwnd: THandle; uMsg: UINT; wParam: WPARAM; lParam: WPARAM): LRESULT; stdcall; var OldWndProc: Pointer; begin if uMsg = WM_WINDOWPOSCHANGING then PWindowPos(lParam)^.flags := PWindowPos(lParam)^.flags or SWP_NOSIZE or SWP_NOMOVE; OldWndProc := Pointer(GetWindowLong(hwnd, GWL_USERDATA)); Result := CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam); end; procedure TForm1.Button1Click(Sender: TObject); var OldWndProc: THandle; begin OldWndProc := GetWindowLong(Handle, GWL_WNDPROC); SetWindowLong(Handle, GWL_USERDATA, OldWndProc); SetWindowLong(Handle, GWL_WNDPROC, Integer(@MainFormSubclassProc)); MessageBox(Handle, '      ', PChar(Application.Title), MB_ICONINFORMATION); end; end. 

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

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

рдЕрдиреБрдкреНрд░рдпреЛрдЧ : рдпрд╣ рдЕрд╡рд░реЛрдзрди рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рд░рдВрддрд░ DWL_DLGPROC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

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

рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЙрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ ...

4. VMT рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЕрд╡рд░реЛрдзрдиред


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдЕрд╡рд░реЛрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рджреБрд░реНрд▓рдн рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдк рд╢рд╛рдпрдж рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЖ рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рд╕рдорд╕реНрдпрд╛ рд╡рд░реНрдЧ рдХреЗ рд╡рд╛рд░рд┐рд╕ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИ рддреЛ рд╡рд╛рд░рд┐рд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдмрд╛рд╣рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдХреЗред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк TForm.CanResize рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдлреЙрд░реНрдо рдХреЗ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХрд╛ рдХрд╛рд░реНрдп рдлреЙрд░реНрдо рдХреЛ 500 рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдЕрдзрд┐рдХ рдЪреМрдбрд╝рд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рд╣реИред

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

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

рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 unit uVMT; interface uses Windows, Classes, Controls, Forms, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} function NewCanResizeHandler(Self: TObject; var NewWidth, NewHeight: Integer): Boolean; begin Result := True; if NewWidth > 500 then NewWidth := 500; end; procedure TForm1.Button1Click(Sender: TObject); var VMTAddr: PPointer; OldProtect: Cardinal; begin asm mov eax, Self mov eax, [eax] //    VMT  add eax, VMTOFFSET TForm.CanResize //     TForm.CanResize mov VMTAddr, eax end; //     VirtualProtect(VMTAddr, 4, PAGE_EXECUTE_READWRITE, OldProtect); try //    VMTAddr^ := @NewCanResizeHandler; finally //    VirtualProtect(Pointer(VMTAddr), 4, OldProtect, OldProtect); FlushInstructionCache(GetCurrentProcess, VMTAddr, 4); end; if Width > 500 then Width := 500; MessageBox(Handle, '     500 ', PChar(Application.Title), MB_ICONINFORMATION); end; end. 

рдЕрдм рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ:

1. рдЕрд╡рд░реЛрдзрди рд╣реИрдВрдбрд▓рд░ рдХреА рдШреЛрд╖рдгрд╛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рдЦрдВрдб (рд╕реНрд╡ рдкреИрд░рд╛рдореАрдЯрд░) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХреА рдЧрдИ рдереАред

2. рдбреЗрд▓реНрдлреА рдорджрдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬ VMTOFFSET рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдЙрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:
рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рдХреЛ рдЧрддрд┐рд╢реАрд▓ рдФрд░ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ: VMTOFFSET рдФрд░ DMTINDEXред
VMTOFFSET рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ (VMT) рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рддрд░реНрдХ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рд╕реВрдЪрдХ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдзрд┐ рдирд╛рдо рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TExample.VirtualMethodред

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

 VMT := Pointer(Self)^; 

3. рдХреЛрдбрд╛рдВрддрд░рдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдзрд┐ рдХреЗ рдкрддреЗ рдкрд░ рдПрдХ рд╕рдВрдХреЗрддрдХ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХреЗ рдирдП рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрддреЗ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

4. рдЪреВрдВрдХрд┐ рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдореЗрдореЛрд░реА рдкреЗрдЬ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдпреЗ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ), рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирдП рд╣реИрдВрдбрд▓рд░ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

рдЦреИрд░ рдЕрдм, рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

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

рдпрджрд┐ рдЖрдкрдХреЛ VMT рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рдореИрдВ рд╣реЙрд▓рд╡рд╛рд░реНрдб рд╡рд╛рд╕рдмреЛрдЯрди рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ : рд╡рд┐рдзрд┐ рдХреЙрд▓ рдмреЙрдпрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рдпрд╛ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж, рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдЕрд▓реЗрдХреНрд╕реЗрд╡ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛: рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ред

рдореИрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрд╡рд░реЛрдзрди рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред

5. рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЕрд╡рд░реЛрдзрди


рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреНрдпрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 {$EXTERNALSYM MessageBox} function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall; ... function MessageBox; external user32 name 'MessageBoxA'; 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ MessageBox рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХреА рдкреВрд░реНрдг рдШреЛрд╖рдгрд╛ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭреМрддреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЙрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдирд╛рдо рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдирд╛рдо рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХрд┐рд╕реА рднреА рдкрддреЗ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рд╕рдЪ рд╣реИ, рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИ, user32.dll, kernel32.dll рдФрд░ ntdll.dll рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрддреЗ (рдХрдо рд╕реЗ рдХрдо 32-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо) рдкрд░ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдереИрддрд┐рдХ рдкрддреЗ рдкрд░ рд╡реИрд╕реЗ рднреА рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдореИрдЯ рдкрд┐рдЯреНрд░реЗрдХ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг: рдкреАрдпрд░рд┐рдВрдЧ рдЗрдирд╕рд╛рдЗрдб рдж рдкреАрдИ: рдП рдЯреВрд░ рдСрдл рдж рд╡рд┐рди 32 рдкреЛрд░реНрдЯреЗрдмрд▓ рдПрдЧреНрдЬрд┐рдХреНрдпреВрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓ рдлреЙрд░реНрдореЗрдЯ ред
RSDN рдкрд░ рдПрдХ рдЕрдиреБрд╡рд╛рдж рдЙрдкрд▓рдмреНрдз рд╣реИ: рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ RE рдФрд░ COFF рдкреНрд░рд╛рд░реВрдк ред
рдпрджрд┐ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкреАрдИред рдкрд╛рда 6. рдЗрдЬрд╝реЗрд▓рд┐рдпрди рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ ред

рдЕрдм рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдПрдХ рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВрдбрд▓рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдкрддреЗ рдХреЛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрддреЗ рдкрд░ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЕрд╡рд░реЛрдзрди рдХреЛ рд╡реИрдз рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрд╡реЗрджрди : рдпрд╣ рдЕрд╡рд░реЛрдзрди рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдкрддреЗ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ:

 function ReplaceIATEntry(const OldProc, NewProc: FARPROC): Boolean; var ImportEntry: PImageImportDescriptor; Thunk: PImageThunkData; Protect: DWORD; ImageBase: Cardinal; DOSHeader: PImageDosHeader; NTHeader: PImageNtHeaders; begin Result := False; if OldProc = nil then Exit; if NewProc = nil then Exit; ImageBase := GetModuleHandle(nil); //     DOSHeader := PImageDosHeader(ImageBase); NTHeader := PImageNtHeaders(DWORD(DOSHeader) + DWORD(DOSHeader^._lfanew)); ImportEntry := PImageImportDescriptor(DWORD(ImageBase) + DWORD(NTHeader^.OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); //     ... while ImportEntry^.Name <> 0 do begin Thunk := PImageThunkData(DWORD(ImageBase) + DWORD(ImportEntry^.FirstThunk)); // ...     ... while Pointer(Thunk^._function) <> nil do begin // ...      . if Pointer(Thunk^._function) = OldProc then begin //   if VirtualProtect(@Thunk^._function, SizeOf(DWORD), PAGE_EXECUTE_READWRITE, Protect) then try //   ... //Thunk^._function := DWORD(NewProc); // ...   . InterlockedExchange(Integer(Thunk^._function), Integer(NewProc)); Result := True; finally VirtualProtect(@Thunk^._function, SizeOf(DWORD), Protect, Protect); FlushInstructionCache(GetCurrentProcess, @Thunk^._function, SizeOf(DWORD)); end; end else Inc(PAnsiChar(Thunk), SizeOf(TImageThunkData32)); end; ImportEntry := Pointer(Integer(ImportEntry) + SizeOf(TImageImportDescriptor)); end; end; 

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

рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

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

 var OrigAddr: Pointer = nil; function InterceptedMessageBoxA(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; type TOrigMessageBoxA = function(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; var S: AnsiString; begin S := AnsiString('Function interepted. Original message: ' + lpText); Result := TOrigMessageBoxA(OrigAddr)(Wnd, PAnsiChar(S), lpCaption, uType); end; procedure TForm1.FormCreate(Sender: TObject); begin OrigAddr := GetProcAddress(GetModuleHandle(user32), 'MessageBoxA'); ReplaceIATEntry(OrigAddr, @InterceptedMessageBoxA); end; procedure TForm1.Button1Click(Sender: TObject); begin MessageBoxA(0, 'Test Message', nil, 0); end; 

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

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

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

  function DelayedMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; external user32 name 'MessageBoxA' delayed; procedure TForm1.Button1Click(Sender: TObject); begin DelayedMessageBoxA(0, 'Test Message', nil, 0); end; 

DelayedMessageBoxA рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА MessageBoxA рд╣реИред
рд▓реЗрдХрд┐рди " рджреЗрд░реА " рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрдпрд╛рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред

Nuance : " рд╡рд┐рд▓рдВрдмрд┐рдд " рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрд▓реНрдлреА рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдбреЗрдореЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ рдКрдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗрд╡рд▓ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ IMAGE DIRECTORY_ENTRY DELAYED IMPORT рдХреЛ рд╕рдВрдкрд╛рджрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд▓реЗрдЦ рдЖрд╕реНрдердЧрд┐рдд рдЖрдпрд╛рдд рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде рд╣реА рд╣реИ, рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрдкрдХреЗ рд╣реЛрдорд╡рд░реНрдХ :) рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВрдЧреЗред

6. рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЕрд╡рд░реЛрдзрдиред


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

рдпрджрд┐ рд╕рд╛рджреЗ рднрд╛рд╖рд╛ рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдФрд░ рдмрдЯрди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦреЗрдВ:

 procedure TForm1.Button2Click(Sender: TObject); type TOrigMessageBoxA = function(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; var OrigMessageBoxA: TOrigMessageBoxA; begin @OrigMessageBoxA := GetProcAddress(GetModuleHandle(user32), 'MessageBoxA'); OrigMessageBoxA(0, 'Test Message', nil, 0); end; 

рдмрдЯрди рджрдмрд╛рдПрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ GetProcAddress рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ, рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдЯреЗрдмрд▓ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

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

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

рдЖрдк рдореИрдЯ рдкрд┐рдЯреНрд░реЗрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╣реА рд▓реЗрдЦ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХрд╛рдо рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдкреАрдИред рдкрд╛рда 7. рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддреАрдХ рдЗрдЬрд╝реНрдЬрд╝реЗрд▓рд┐рдпрди рд╕реЗ рд╣реИред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ : рдпрд╣ рдЕрд╡рд░реЛрдзрди рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ API рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдкрддрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рд╣реА:

 unit uEAT; interface uses Windows, Classes, Controls, Forms, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses DeclaredTypes; function ReplaceEATEntry(const DllName: string; OldProc, NewProc: FARPROC): Boolean; var ImageBase: Cardinal; DOSHeader: PImageDosHeader; NTHeader: PImageNtHeaders; ExportDirectory: PImageExportDirectory; pFuntionAddr: PDWORD; OrdinalCursor: PWORD; Ordinal, Protect: DWORD; FuntionAddr: FARPROC; I: Integer; begin Result := False; if OldProc = nil then Exit; if NewProc = nil then Exit; ImageBase := GetModuleHandle(PChar(DllName)); //     DOSHeader := PImageDosHeader(ImageBase); NTHeader := PImageNtHeaders(DWORD(DOSHeader) + DWORD(DOSHeader^._lfanew)); ExportDirectory := PImageExportDirectory(DWORD(ImageBase) + DWORD(NTHeader^.OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)); I := 1; //     OrdinalCursor := Pointer(ImageBase + DWORD(ExportDirectory^.AddressOfNameOrdinals)); while I < Integer(ExportDirectory^.NumberOfNames) do begin //       Ordinal := OrdinalCursor^; //       FuntionAddr := Pointer(ImageBase + DWORD(ExportDirectory^.AddressOfFunctions)); FuntionAddr := Pointer(ImageBase + PDWORD(DWORD(FuntionAddr) + Ordinal * 4)^); // ,    ? if FuntionAddr = OldProc then begin //  ,  ,      pFuntionAddr := PDWORD(ImageBase + DWORD(ExportDirectory^.AddressOfFunctions) + Ordinal * 4); //        hInstance  NewProc := Pointer(DWORD(NewProc) - ImageBase); //    if VirtualProtect(pFuntionAddr, SizeOf(DWORD), PAGE_EXECUTE_READWRITE, Protect) then try //   ... //pFuntionAddr^ := Integer(NewProc); // ...   . InterlockedExchange(Integer(PImageThunkData(pFuntionAddr)^._function), Integer(NewProc)); Result := True; finally VirtualProtect(pFuntionAddr, SizeOf(DWORD), Protect, Protect); FlushInstructionCache(GetCurrentProcess, pFuntionAddr, SizeOf(DWORD)); end; Break; end; Inc(I); Inc(OrdinalCursor); end; end; var OrigAddr: Pointer = nil; function InterceptedMessageBoxA(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; type TOrigMessageBoxA = function(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; var S: AnsiString; begin S := AnsiString('Function interepted. Original message: ' + lpText); Result := TOrigMessageBoxA(OrigAddr)(Wnd, PAnsiChar(S), lpCaption, uType); end; procedure TForm1.FormCreate(Sender: TObject); begin OrigAddr := GetProcAddress(GetModuleHandle(user32), 'MessageBoxA'); ReplaceEATEntry(user32, OrigAddr, @InterceptedMessageBoxA); end; procedure TForm1.Button1Click(Sender: TObject); type TOrigMessageBoxA = function(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; var OrigMessageBoxA: TOrigMessageBoxA; begin @OrigMessageBoxA := GetProcAddress(GetModuleHandle(user32), 'MessageBoxA'); OrigMessageBoxA(0, 'Test Message', nil, 0); end; end. 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореВрд▓ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреБрд░рд╛рдиреЗ рдкрддреЗ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

7. рдлрдВрдХреНрд╢рди рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдХрд╛ рд╕реНрдкреНрд▓рд┐рдЯрд┐рдВрдЧ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рдиред


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

рдЬрдм splicing рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реЗрдЯ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЛрдб рдЗрд╕рдХреА рдХреЙрд▓ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ред

рд╕рдЪ рд╣реИ, рдпреЗ рд╕рднреА рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ, рдлрд┐рд░ рдорд┐рдирд╕ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬрд╛рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди asm рдХреЛрдб рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд▓реМрдЯрд╛ рджреЗрдВред

рджреВрд╕рд░реЗ, рдЙрд╕ рд╕рдордп рдЬрдм рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХреЛрдб рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдХреЙрд▓ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдпрджрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдЗрдП рдХреБрдЫ рд╕рдмрд╕реЗ рдЖрдо рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

1. JMP NEAR OFFSET
рдлрд╛рдЗрд╡-рдмрд╛рдЗрдЯ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди, рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ $ E9 рд╣реИ, рдЬреЛ JMP NEAR rel32 рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХрд╛ рдСрдкрдХреЛрдб рд╣реИ, рдмрд╛рдХреА 4 OFFSET рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рд╣реИрдВред
OFFSET рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ: OFFSET = DestinationAddr - CurrentAddr - рдирд┐рд░реНрджреЗрд╢ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░
рдЬрд╣рд╛рдВ DestinationAddr рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВрдбрд▓рд░
рдХрд╛ рдкрддрд╛ рд╣реИ CurrentAddr рд╡рд╣ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ JMP NEAR OFFSET рдирд┐рд░реНрджреЗрд╢ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ

рдЬреЛ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 procedure SliceNearJmp(OldProc, NewProc: FARPROC); var SpliceRec: packed record JmpOpcode: Byte; Offset: DWORD; end; Tmp: DWORD; begin SpliceRec.JmpOpcode := $E9; SpliceRec.Offset := DWORD(NewProc) - DWORD(OldProc) - SizeOf(SpliceRec); VirtualProtect(OldProc, SizeOf(SpliceRec), PAGE_EXECUTE_READWRITE, OldProtect); Move(SpliceRec, OldProc^, SizeOf(SpliceRec)); VirtualProtect(OldProc, SizeOf(SpliceRec), OldProtect, OldProtect); end; 

2. PUSH ADDR + RET рдПрдХ
рдЫрд╣-рдмрд╛рдЗрдЯ рдЕрдиреБрджреЗрд╢, рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ $ 68 рд╣реИ, рдЬреЛ PUSH Imm32 рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдСрдкрдХреЛрдб рд╣реИ, рдЕрдЧрд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ ADDR рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрддрд╛ рдЬрдореНрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ $ C3 рдХрд╛ рдЕрдВрддрд┐рдо рдЫрдард╛ рдмрд╛рдЗрдЯ, рдЬреЛ RET рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдУрдкреЛрдб рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдпрд╣ рд╕рдореВрд╣ рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ PUSH рдирд┐рд░реНрджреЗрд╢ рдвреЗрд░ рдкрд░ ADDR рдХреВрдж рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ RET рдирд┐рд░реНрджреЗрд╢ рдвреЗрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдХреВрджрддрд╛ рд╣реИред

рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 procedure SlicePushRet(OldProc, NewProc: FARPROC); var SpliceRec: packed record PushOpcode: Byte; Offset: FARPROC; RetOpcode: Byte; end; begin SpliceRec.PushOpcode := $68; SpliceRec.Offset := NewProc; SpliceRec.RetOpcode := $C3; VirtualProtect(OldProc, SizeOf(SpliceRec), PAGE_EXECUTE_READWRITE, OldProtect); Move(SpliceRec, OldProc^, SizeOf(SpliceRec)); VirtualProtect(OldProc, SizeOf(SpliceRec), OldProtect, OldProtect); end; 

рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред

рдРрд╕реЗ рджреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╡реЗрд░рд┐рдПрдВрдЯ рднреА рд╣реИ: MOV EAX, ADDR + JMP EAXред рдпрд╣ рд╕рд╛рдд-рдмрд╛рдЗрдЯ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ FASTCALL рд╕рдореНрдореЗрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордЭреМрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрд▓реНрдлреА рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ EAX, ECX рдФрд░ EDX рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ EAX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдУрд╡рд░рд░рд╛рдЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

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

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

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдХ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рдореЗрдВ рдПрдордПрд╕ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░ рдкрд╛рдВрдЪ рдПрдирдУрдкреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рдПрдордУрд╡реА рдИрдбреАрдЖрдИ, рдИрдбреАрдЖрдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╛ рддреЛ рдбрдмрд▓ рдмрд╛рдЗрдЯ PUSH xxx)

рдЫрд╡рд┐

рдкрд╣рд▓реЗ рдкрд╛рдБрдЪ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп JMP NEAR OFFSET рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд╕рдордп, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо JMP SHORT -7 рдирд┐рд░реНрджреЗрд╢ рдХреЗ рджреЛ-рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдПрдЯреЛрдорд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╛рдЗрдЯреНрд╕ $ EB рдФрд░ $ F9 рд╣реИред

HotPach рдХрд╛ рдирдореВрдирд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 procedure SliceHotPath(OldProc, NewProc: FARPROC); var SpliceRec: packed record JmpOpcode: Byte; Offset: DWORD; end; NopAddr: Pointer; OldProtect: DWORD; begin SpliceRec.JmpOpcode := $E9; NopAddr := PAnsiChar(OldProc) - SizeOf(SpliceRec); SpliceRec.Offset := DWORD(NewProc) - DWORD(NopAddr) - SizeOf(SpliceRec); VirtualProtect(NopAddr, 7, PAGE_EXECUTE_READWRITE, OldProtect); Move(SpliceRec, NopAddr^, SizeOf(SpliceRec)); asm mov ax, $F9EB mov ecx, OldProc lock xchg word ptr [ecx], ax end; VirtualProtect(NopAddr, 7, OldProtect, OldProtect); end; 

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣реЙрдЯрдкреИрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╡рд░реЛрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред рдЙрдирдХреЗ рд▓рд┐рдП, рдкреИрдЪ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред

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

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

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

 unit uNearJmpSplice; interface uses Windows, Classes, Controls, Forms, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} type //      JMP NEAR OFFSET TNearJmpSpliceRec = packed record JmpOpcode: Byte; Offset: DWORD; end; //         JMP NEAR OFFSET TNearJmpSpliceData = packed record FuncAddr: FARPROC; OldData: TNearJmpSpliceRec; NewData: TNearJmpSpliceRec; end; var NearJmpSpliceRec: TNearJmpSpliceData; //         procedure SpliceNearJmp(FuncAddr: Pointer; NewData: TNearJmpSpliceRec); var OldProtect: DWORD; begin VirtualProtect(FuncAddr, SizeOf(TNearJmpSpliceRec), PAGE_EXECUTE_READWRITE, OldProtect); try //   !!! Move(NewData, FuncAddr^, SizeOf(TNearJmpSpliceRec)); finally VirtualProtect(FuncAddr, SizeOf(TNearJmpSpliceRec), OldProtect, OldProtect); FlushInstructionCache(GetCurrentProcess, FuncAddr, SizeOf(TNearJmpSpliceRec)); end; end; //    MessageBoxA function InterceptedMessageBoxA(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; var S: AnsiString; begin //   SpliceNearJmp(NearJmpSpliceRec.FuncAddr, NearJmpSpliceRec.OldData); try //    S := AnsiString('Function interepted. Original message: ' + lpText); Result := MessageBoxA(Wnd, PAnsiChar(S), lpCaption, uType); finally //   SpliceNearJmp(NearJmpSpliceRec.FuncAddr, NearJmpSpliceRec.NewData); end; end; procedure InitNearJmpSpliceRec; begin //      NearJmpSpliceRec.FuncAddr := GetProcAddress(GetModuleHandle(user32), 'MessageBoxA'); //      ,     Move(NearJmpSpliceRec.FuncAddr^, NearJmpSpliceRec.OldData, SizeOf(TNearJmpSpliceRec)); //   JMP NEAR NearJmpSpliceRec.NewData.JmpOpcode := $E9; //    NearJmpSpliceRec.NewData.Offset := PAnsiChar(@InterceptedMessageBoxA) - PAnsiChar(NearJmpSpliceRec.FuncAddr) - SizeOf(TNearJmpSpliceRec); end; procedure TForm1.FormCreate(Sender: TObject); begin //     InitNearJmpSpliceRec; //  MessageBoxA SpliceNearJmp(NearJmpSpliceRec.FuncAddr, NearJmpSpliceRec.NewData); end; procedure TForm1.Button1Click(Sender: TObject); begin MessageBoxA(0, 'Test MessageBoxA Message', nil, 0); end; end. 

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

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, InitNearJmpSpliceRec рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЛрдб SpliceNearJmp рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрд╡рд░реЛрдзрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ PUSH ADDR + RET рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ TNearJmpSpliceRec рд╕рдВрд░рдЪрдирд╛ рдФрд░ InitNearJmpSpliceiceec рд╕рдВрд░рдЪрдирд╛ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд░рд╣реЗрдЧрд╛ред

рдЦреИрд░, рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЛрдб рддреАрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (HotPatch рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред
рдореИрдВ рдЕрдЧрд▓реЗ рджреЛ рдЕрдзреНрдпрд╛рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдбрд╛рд▓реВрдВрдЧрд╛ред

 unit CommonHotPatch; interface uses Windows; const LOCK_JMP_OPKODE: Word = $F9EB; type //      JMP NEAR OFFSET TNearJmpSpliceRec = packed record JmpOpcode: Byte; Offset: DWORD; end; THotPachSpliceData = packed record FuncAddr: FARPROC; SpliceRec: TNearJmpSpliceRec; LockJmp: Word; end; var HotPathSpliceRec: THotPachSpliceData; procedure InitHotPatchSpliceRec; procedure SpliceNearJmp(FuncAddr: Pointer; NewData: TNearJmpSpliceRec); procedure SpliceLockJmp(FuncAddr: Pointer; NewData: Word); implementation //         procedure SpliceNearJmp(FuncAddr: Pointer; NewData: TNearJmpSpliceRec); var OldProtect: DWORD; begin VirtualProtect(FuncAddr, SizeOf(TNearJmpSpliceRec), PAGE_EXECUTE_READWRITE, OldProtect); try Move(NewData, FuncAddr^, SizeOf(TNearJmpSpliceRec)); finally VirtualProtect(FuncAddr, SizeOf(TNearJmpSpliceRec), OldProtect, OldProtect); FlushInstructionCache(GetCurrentProcess, FuncAddr, SizeOf(TNearJmpSpliceRec)); end; end; //         procedure SpliceLockJmp(FuncAddr: Pointer; NewData: Word); var OldProtect: DWORD; begin VirtualProtect(FuncAddr, 2, PAGE_EXECUTE_READWRITE, OldProtect); try asm mov ax, NewData mov ecx, FuncAddr lock xchg word ptr [ecx], ax end; finally VirtualProtect(FuncAddr, 2, OldProtect, OldProtect); FlushInstructionCache(GetCurrentProcess, FuncAddr, 2); end; end; function InterceptedMessageBoxA(Wnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; var S: AnsiString; begin //   SpliceLockJmp(HotPathSpliceRec.FuncAddr, HotPathSpliceRec.LockJmp); try //    S := AnsiString('Function interepted. Original message: ' + lpText); Result := MessageBoxA(Wnd, PAnsiChar(S), lpCaption, uType); finally //   SpliceLockJmp(HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODE); end; end; procedure InitHotPatchSpliceRec; begin //      HotPathSpliceRec.FuncAddr := GetProcAddress(GetModuleHandle(user32), 'MessageBoxA'); //      ,     Move(HotPathSpliceRec.FuncAddr^, HotPathSpliceRec.LockJmp, 2); //   JMP NEAR HotPathSpliceRec.SpliceRec.JmpOpcode := $E9; //    HotPathSpliceRec.SpliceRec.Offset := PAnsiChar(@InterceptedMessageBoxA) + 5 - PAnsiChar(HotPathSpliceRec.FuncAddr) - SizeOf(TNearJmpSpliceRec); end; end. 

рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рд╣реИ:

 unit uHotPachSplice; interface uses Windows, Classes, Controls, Forms, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation uses CommonHotPatch; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //     InitHotPatchSpliceRec; //     NOP- SpliceNearJmp(PAnsiChar(HotPathSpliceRec.FuncAddr) - 5, HotPathSpliceRec.SpliceRec); //  MessageBoxW SpliceLockJmp(HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODE); end; procedure TForm1.Button1Click(Sender: TObject); const TestStr: AnsiString = 'Test MessageBoxA Message'; begin MessageBoxA(0, PAnsiChar(TestStr), nil, 0); end; end. 

рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рджреВрд╕рд░рд╛ рдХреЛрдб рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд░рд╡рд┐рд░реЛрдз рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЕрдВрддрд░ рдиреНрдпреВрдирддрдо рд╣реИрдВред

8. рдЬрд╛рд▓ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред


рд╕реНрдерд╛рдиреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЕрд╡рд░реЛрдзрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрд┐рд╕реА рдФрд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреА рдХрд┐рддрдиреА рд╕рд╣реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рдПрдХ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЬрд╛рд▓ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рджреЗрд╢реА рдкрддреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рднрд░реА рд╣реБрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛрдб рдбрд╛рд▓рдирд╛ рд╣реИред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдбрд░ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 program hook_loader; {$APPTYPE CONSOLE} uses Windows; var hLib: THandle; HookProcAddr: Pointer; HookHandle: HHOOK; begin hLib := LoadLibrary('hook_splice_lib.dll'); try HookProcAddr := GetProcAddress(hLib, 'HookProc'); Writeln('MessageBoxA intercepted, press ENTER to resume...'); HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookProcAddr, hLib, 0); Readln; UnhookWindowsHookEx(HookHandle); finally FreeLibrary(hLib); end; end. 

рдЬреИрд╕реЗ рд╣реА SetWindowsHookEx рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЬрд╛рд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣реИрдВрдбрд▓рд░ hook_splice_lib.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ GetMessage рдпрд╛ PeekMessage рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдЧреАред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ:

 library hook_splice_lib; uses Windows, CommonHotPatch in '..\common\CommonHotPatch.pas'; {$R *.res} procedure DLLEntryPoint(dwReason: DWORD); begin case dwReason of DLL_PROCESS_ATTACH: begin //     InitHotPatchSpliceRec; //     NOP- SpliceNearJmp(PAnsiChar(HotPathSpliceRec.FuncAddr) - 5, HotPathSpliceRec.SpliceRec); //  MessageBoxW SpliceLockJmp(HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODE); end; DLL_PROCESS_DETACH: begin //      SpliceLockJmp(HotPathSpliceRec.FuncAddr, HotPathSpliceRec.LockJmp); end; end; end; function HookProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(0, Code, WParam, LParam); end; exports HookProc; begin DLLProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. 

рдЕрдВрддрд░ рдиреНрдпреВрдирддрдо рд╣реИрдВред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмреЙрдбреА рдореЗрдВ, рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реБрдХ рд╣реБрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реБрдХрдкреНрд░реЛрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрддрд╛рд░ рдореЗрдВ рдЕрдЧрд▓реЗ рд╣реБрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ WH_GETMESSAGE рдЬрд╛рд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ DLLEntryPoint рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рдпрд╣ DLL_PROCESS_ATTACH рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдпрд╣ DLL_PROCESS_DETACH рдЙрддрд╛рд░рдиреЗ рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ DLLProc рдУрд╡рд░рд▓реИрдк рдХреЛрдб рдкрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдУрд╡рд░рд▓реИрдк рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реИ, DLL_PROCESS_DETACH рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдорд╛рд░рд╛ рдХреЛрдб рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ DLL_PROCESS_ATTACH рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИ рдФрд░ DLLProc рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИред DLLEntryPoint рдХреЙрд▓ (DLL_PROCESS_ATTACH) рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреЙрд▓ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ DLLProc рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ DLLEntryPoint рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрддрд░рд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЗрд╕рдореЗрдВ рдЖ рдЬрд╛рдПрдЧреА, рдЬрд╣рд╛рдВ рд╣рдо рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдбреА-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

9. рдПрдХ рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдзрд╛рдЧрд╛ рдмрдирд╛рдХрд░ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддреИрдирд╛рддреАред


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

 program test_console8; {$APPTYPE CONSOLE} uses Windows; begin Writeln('Press enter to show message...'); Readln; MessageBoxA(0, 'First message', '', 0); Writeln('Press enter to show message...'); Readln; MessageBoxA(0, 'Second message', '', 0); end. 

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

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

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

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

 procedure SelfUnload(lpParametr: Pointer); stdcall; begin FreeLibraryAndExitThread(HInstance, 0); end; exports SelfUnload; 

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 const DllName = 'thread_splice_lib.dll'; function InjectLib(ProcessID: Integer): Boolean; var Process: HWND; ThreadRtn: FARPROC; DllPath: AnsiString; RemoteDll: Pointer; BytesWriten: DWORD; Thread: DWORD; ThreadId: DWORD; begin Result := False; //   Process := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, True, ProcessID); if Process = 0 then Exit; try //       DllPath := AnsiString(ExtractFilePath(ParamStr(0)) + DLLName) + #0; RemoteDll := VirtualAllocEx(Process, nil, Length(DllPath), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if RemoteDll = nil then Exit; try //         if not WriteProcessMemory(Process, RemoteDll, PChar(DllPath), Length(DllPath), BytesWriten) then Exit; if BytesWriten <> DWORD(Length(DllPath)) then Exit; //     Kernel32.dll ThreadRtn := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA'); if ThreadRtn = nil then Exit; //    Thread := CreateRemoteThread(Process, nil, 0, ThreadRtn, RemoteDll, 0, ThreadId); if Thread = 0 then Exit; try //     ... Result := WaitForSingleObject(Thread, INFINITE) = WAIT_OBJECT_0; finally CloseHandle(Thread); end; finally VirtualFreeEx(Process, RemoteDll, 0, MEM_RELEASE); end; finally CloseHandle(Process); end; end; 

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

 function ResumeLib(ProcessID: Integer): Boolean; var hLibHandle: THandle; hModuleSnap: THandle; ModuleEntry: TModuleEntry32; OpCodeData: Word; Process: HWND; BytesWriten: DWORD; Thread: DWORD; ThreadId: DWORD; ExitCode: DWORD; PLibHandle: PDWORD; OpCode: PWORD; CurrUnloadAddrOffset: DWORD; UnloadAddrOffset: DWORD; begin Result := False; //          hLibHandle := LoadLibrary(PChar(DLLName)); try UnloadAddrOffset := DWORD(GetProcAddress(hLibHandle, 'SelfUnload')) - hLibHandle; if UnloadAddrOffset = -hLibHandle then Exit; finally FreeLibrary(hLibHandle); end; //        hModuleSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID); if hModuleSnap <> INVALID_HANDLE_VALUE then try FillChar(ModuleEntry, SizeOf(TModuleEntry32), #0); ModuleEntry.dwSize := SizeOf(TModuleEntry32); if not Module32First(hModuleSnap, ModuleEntry) then Exit; repeat if AnsiUpperCase(ModuleEntry.szModule) = AnsiUpperCase(DLLName) then begin //     CurrUnloadAddrOffset := ModuleEntry.hModule + UnloadAddrOffset; Break; end; until not Module32Next(hModuleSnap, ModuleEntry); finally CloseHandle(hModuleSnap); end; //   Process := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, True, ProcessID); if Process = 0 then Exit; try //   jmp [ebx] OpCode := VirtualAllocEx(Process, nil, 2, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if OpCode = nil then Exit; try OpCodeData := $23FF; if not WriteProcessMemory(Process, OpCode, @OpCodeData, 2, BytesWriten) then Exit; //     (    EBX   ) PLibHandle := VirtualAllocEx(Process, nil, 4, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if PLibHandle = nil then Exit; try if not WriteProcessMemory(Process, PLibHandle, @CurrUnloadAddrOffset, 4, BytesWriten) then Exit; //   Thread := CreateRemoteThread(Process, nil, 0, OpCode, PLibHandle, 0, ThreadId); if Thread = 0 then Exit; try //     ... if (WaitForSingleObject(Thread, INFINITE) = WAIT_OBJECT_0) then if GetExitCodeThread(Thread, ExitCode) then Result := ExitCode = 0; finally CloseHandle(Thread); end; finally VirtualFreeEx(Process, PLibHandle, 0, MEM_RELEASE); end; finally VirtualFreeEx(Process, OpCode, 0, MEM_RELEASE); end; finally CloseHandle(Process); end; end; 

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЕрдирдХрдореНрдбреЗрдбреЗрдб рдореЗрдХреЗрдирд┐рдЬреНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ 2000 рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ 7 рддрдХ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрда рдкрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рд╡рд╣реАрдВ рд╣реЛрдЧрд╛)ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ CreateRemoteThread рдлрд╝рдВрдХреНрд╢рди рдХреЗ lpParameter рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛ EBX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдереНрд░реЗрдб рджреВрд░рд╕реНрде рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХрд╛ рдХрд╛рд░реНрдп JMP [EBX] рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд░рдЦрдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдзрд╛рдЧрд╛ рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ SelfUnload рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ EBX рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЙрддрд╛рд░рдиреЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ SelfUnload рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕реАрдзреЗ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд▓ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбрд╛рдВрдЯреЗ рдирд╣реАрдВ :)

10. рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореВрд╣реЛрдВ рдореЗрдВ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ "рдЫрд╛рддреНрд░реЛрдВ" рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкрд╣рд▓реВ рдкрд░ рдПрдХ рдкрдХрдбрд╝ рдереА, рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рдЧрд╛рддрд╛рд░ рд░реАрдбрд┐рдВрдЧ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдбреЗрдЯрд╛ рдмрдлрд░ рдХреА рдХрдореА рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдереЗред

рдареАрдХ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ - рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рд▓реЙрдЧрд┐рдВрдЧ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдПрдХ рджрд┐рди рдЖрдк рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ WriteFile рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдмрдлрд░ рдЙрд╕ рдХреЙрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдЖрдПрдЧрд╛ред

11. рд╕рдВрдХреНрд╖реЗрдк рдХрд░рдирд╛


рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЕрд╡рд░реЛрдзрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рд╕рд╛рде рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рд╣рд╛рдВ, рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд░рд╣реЗред рдореИрдВ рдХреЛрд░ рдореЗрдВ рдЕрд╡рд░реЛрдзрди рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрд▓реНрдлреА рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА рдореИрдВ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЕрд╡рд░реЛрдзрди рдХреЗ рд╕рд╛рде рдЪрд╛рд▓ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмрд╛ рдХреНрдпреЛрдВ рдФрд░ рдХреИрд╕реЗ "рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред"

HotPatch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН: рдпрд╣ рд╣рдореЗрд╢рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкреВрд░реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдФрд░ рдореИрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ ред

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

рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рдлрд▓ рдирд┐рдЧрд░рд╛рдиреАред

рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ (Rouse_) рдмрд╛рдЧреЗрд▓
рдЬрдирд╡рд░реА, 2013

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


All Articles