рд╣рдо рдбрд┐рдмрдЧрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ [рднрд╛рдЧ 2]



рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдЕрд╡рд╢реНрдп рдкрдврд╝реЗрдВред рдЕрдиреНрдпрдерд╛, рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

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


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

рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА:




рдЪрд▓реЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!


рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рдЦреИрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП F5 рджрдмрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдбреАрдмрдЧрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рд░реЛрдХ рджреЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рд╕рд╢рд░реНрдд рд╡рд╛рд▓реЗ рд╕рд╣рд┐рдд)ред рдбреАрдмрдЧ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдлрд▓ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдореЗрдВ рд░рд┐рдкреАрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдЦреБрд▓рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред DebugBreak рдпрд╛ _asm int 3 рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдпрд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ "рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ" рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рд╢рд╛рдпрдж рд╣реА рдХрднреА рдпрд╛ рд╕рдордп-рд╕рдордп рдкрд░, рд╣рдо F11 (рд╕реНрдЯреЗрдк-рдЗрди) рдХреЛ рджрдмрд╛рдХрд░ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ VS рдореБрдЦреНрдп / wmain рдпрд╛ WinMain / wWinMain рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдпрд╛ _ _ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рдбреАрдмрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЦреИрд░, рдпрд╣ рдбреАрдмрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ "рддрд╛рд░реНрдХрд┐рдХ" рдХрд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реБрд░реБрдЖрдд рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ mainCRTStartup рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рддрдм рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ Visual Studio рдбреАрдмрдЧрд░ рдореБрдЦреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред Dll рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рдФрд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ / ENTRY рдзреНрд╡рдЬ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝реЗрдВред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рдВ, рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ "рдирд┐рд▓рдВрдмрд┐рдд" рдХрд╣рд╛ - рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣реА рд╣реИ рдФрд░ рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдирд┐рд▓рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕реЗ рд╣реА рдЖрдк F11 рджрдмрд╛рддреЗ рд╣реИрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ (рдиреАрдЪреЗ рдХреА рдЫрд╡рд┐) рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

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

рдХреЗрд╡рд▓ рдкрд╛рдБрдЪ рдЕрдВрдХ! рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдп рдПрдХ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ * рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ (рдореБрдЦреНрдп / WinMain рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рд╢реБрд░реБрдЖрддреА рдкрддрд╛ рдПрдХ рдРрд╕рд╛ рдЬрдВрдЧрд▓ рд╣реИ! рдЖрдкрдХреЛ рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗ рджреВрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдЖрдкрдХреЛ рд╕рдордЭрдиреА рдЪрд╛рд╣рд┐рдП: рдЗрд╕ рдкрддреЗ рдкрд░ рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рд╡рд╣ рдмрд┐рдВрджреБ рд╣реИ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдбреАрдмрдЧрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдкрддреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
* [рдпрд╣ рд╢рдмреНрдж рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЧрдврд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ!]
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ WinMain рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ (рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде) рдореЗрдВ рдЕрд╕рдВрддреБрд╖реНрдЯ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЖрдк рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдХреЗ, рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдФрд░ "рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб" рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдПрдХ рд╣реА рджреГрд╢реНрдп рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдмрд╛рдЗрдЯреНрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ (рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП) рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдзреИрд░реНрдп рд░рдЦреЗрдВ! рдЖрдкрдХреЛ рдорд╢реАрди рдХреА рднрд╛рд╖рд╛ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рдХреЛрдВ рдХреА рдХрд┐рд╕реА рднреА рдмреЛрд▓реА рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдпрд╣ рд╕рд┐рд░реНрдл рджреГрд╖реНрдЯрд╛рдВрдд рдХреЗ рд▓рд┐рдП рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, 0x00978F10 рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рд╣реИ, рдФрд░ 8B FF рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИред рд╣рдореЗрдВ рдмрд╕ рдЗрд╕реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреАрдмрдЧрдмреНрд░реЗрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрддрдиреЗ рдХрдо рд╕реНрддрд░ рдкрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред X86 рдХреЗ рд▓рд┐рдП, рдмреНрд░реЗрдХрдкрд╛рдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ _asm int 3 рд╣реИред рдЗрд╕рдореЗрдВ 0xCC (204) рдХрд╛ рдирд╛рдордХрд░рдг рдХреЛрдб рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯ 8 рдмреА рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ! рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ EXCEPTION_BREAKPOINT рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдПрдХ EXCEPTION_DEBUG_EVENT рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдпрд╣ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрд╕реЗ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдкреВрдЫрддрд╛ рд╣реВрдВ, рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкрдврд╝реЗрдВ [http://habrahabr.ru/post/154847/]ред
X86 рдирд┐рд░реНрджреЗрд╢ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ? рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ (1, 2, N) рд▓реЗрддрд╛ рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рдмрджрд▓рддреЗ рд╣реИрдВред рдЕрдиреБрджреЗрд╢ рдХрд╛ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рдХреЗрд╡рд▓ 8 рдмреА рдирд╣реАрдВ, рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬреИрд╕реЗ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖрдПрдЧрд╛, рд╣рдо рдореВрд▓ рдмрд╛рдЗрдЯ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдЯрд┐рдкреНрдкрдгреА рдЬреЛ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдкрддреЗ рдкрд░ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдПрдХ рдмрд╛рд░ рдХрд╛ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реЗ, рд╕реАрд╕реА рдирд┐рд░реНрджреЗрд╢ рдХреЗрд╡рд▓ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЖрд░рдВрднрд┐рдХ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреА рд░реБрдЪрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C ++ рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реВрдБред CREATE_PROCESS_DEBUG_INFO рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ lpStartAddress рд╕рджрд╕реНрдп рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:

// This is inside Debugger-loop controlled by WaitForDebugEvent, ContinueDebugEvent switch(debug_event.dwDebugEventCode) { case CREATE_PROCESS_DEBUG_EVENT: { LPVOID pStartAddress = (LPVOID)debug_event.u.CreateProcessInfo.lpStartAddress; // Do something with pStartAddress to set BREAKPOINT. ... ... 


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

 dumpbin /headers DebugMe.exe ... OPTIONAL HEADER VALUES 10B magic # (PE32) 8.00 linker version A000 size of code F000 size of initialized data 0 size of uninitialized data 11767 entry point (00411767) @ILT+1890(_wWinMainCRTStartup) 1000 base of code 


рдпрд╣ рдкрддрд╛ (00411767) рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди lpStartAddress рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рддрд╣рдд рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХреА, рддреЛ wWinMainCRTStartup рдХрд╛ рдкрддрд╛ рдЗрд╕рд╕реЗ рдЕрд▓рдЧ рдерд╛ (@ILT рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореБрдЭреЗ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рджреЗрдВ рдФрд░ рдмрд╕ рдЧреЗрдЯрд╕реНрдЯрд╛рд░реНрдЯрдбреНрд░реЗрд╕ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рдЯреАрдХ рдкрддрд╛ рд▓реМрдЯрд╛ рджреЗрдЧрд╛ рдЬрд╣рд╛рдВ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдкрддреЗ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рдмрджрд▓реЗрдВ


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

рдЕрдм рдЖрдкрдХреЛ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рд╣реИрдВ:
  1. рдирд┐рд░реНрджреЗрд╢ рдХреИрд╕реЗ рдкрдврд╝реЗрдВ, рд▓рд┐рдЦреЗрдВ рдФрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ?
  2. рд╣рдо рдРрд╕рд╛ рдХрдм рдХрд░рддреЗ рд╣реИрдВ?

рдкрд╣рд▓реЗ рджреВрд╕рд░реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреВрдВред рд╣рдо CREATE_PROCESS_DEBUG_EVENT рдИрд╡реЗрдВрдЯ (рдпрд╛, рдЖрдкрдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░, EXCEPTION_BREAKPOINT рдХреЗ рд╕рдордп) рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджреЗрд╢ рдкрдврд╝реЗрдВрдЧреЗ, рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЛрдб рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ (рдореЗрд░рд╛ рдорддрд▓рдм CRT-Main рдкрддрд╛) рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕ рдкрддреЗ рдкрд░ рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рдкрдврд╝реЗрдВ, рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ 0xCC рдмрд╛рдЗрдЯ рд▓рд┐рдЦреЗрдВред рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рдбрд┐рдмрдЧрд░ рдкрд░ ContinueDebugEvent () рдХрд╣рддреЗ рд╣реИрдВред
рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ:

 DWORD dwStartAddress = GetStartAddress(m_cProcessInfo.hProcess, m_cProcessInfo.hThread); BYTE cInstruction; DWORD dwReadBytes; // Read the first instruction ReadProcessMemory(m_cProcessInfo.hProcess, (void*)dwStartAddress, &cInstruction, 1, &dwReadBytes); // Save it! m_OriginalInstruction = cInstruction; // Replace it with Breakpoint cInstruction = 0xCC; WriteProcessMemory(m_cProcessInfo.hProcess, (void*)dwStartAddress,&cInstruction, 1, &dwReadBytes); FlushInstructionCache(m_cProcessInfo.hProcess,(void*)dwStartAddress,1); 


рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛:
тАв M_cProcessInfo рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╕рджрд╕реНрдп рд╣реИ, рдЬреЛ CreateProcess рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреЙрдкреБрд▓реЗрдЯ рдХреА рдЧрдИ PROCESS_INFORMATION рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
тАв GetStartAddress () рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рджреЗрддрд╛ рд╣реИред UIC рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдпрд╣ wWinMainCRTStartup () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╣реИ;
тАв рдлрд┐рд░ рд╣рдо рдкреНрд░рд╛рд░рдВрдн рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рдмрд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП ReadProcessMemory рдХрд╣рддреЗ рд╣реИрдВ
тАв рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо WriteProcessMemory рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкрддреЗ рдкрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ (0xCC) рд▓рд┐рдЦрддреЗ рд╣реИрдВ
тАв рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдо FlushInstructionCache рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реАрдкреАрдпреВ рдирдП рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкрдврд╝реЗ, рди рдХрд┐ рдХрд┐рд╕реА рдкреБрд░рд╛рдиреЗ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕реАрдкреАрдпреВ, рдмреЗрд╢рдХ, рдЕрдиреБрджреЗрд╢ рдХреЛ рдХреИрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдлреНрд▓рд╢рдЗрдиреНрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреИрд╢реЗ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ReadProcessMemory рдХреЗ рд▓рд┐рдП PROCESS_VM_READ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, WriteProcessMemory рдХреЗ рд▓рд┐рдП PROCESS_VM_READ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ PROCESS_VM_OPERATION - рдЗрди рд╕рднреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдбреАрдмрдЧрд░ рдХреЛ рдЬреИрд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдбрд┐рдмрдЧ рдлрд╝реНрд▓реИрдЧ CreateProcess рдХреЛ рдкрд╛рд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрдврд╝рдирд╛ / рд▓рд┐рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдлрд▓ рд╣реЛрдЧрд╛ (рдорд╛рдиреНрдп рдореЗрдореЛрд░реА рдкрддреЗ рдХреЗ рд╕рд╛рде, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ!)ред

рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ (EXCEPTION_BREAKPOINT) рдЕрдкрд╡рд╛рдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ EXCEPTION_DEBUG_EVENT рдбрд┐рдмрдЧрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рд╣рдо EXCEPTION_DEBUG_INFO рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:

 // Inside debugger-loop switch(debug_event.dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: { EXCEPTION_DEBUG_INFO & Exception = debug_event.u.Exception; // Out of union // Exception.ExceptionCode would be the actual exception code. ... 


рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдмрдЧрд░ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣реА рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЗ рдкрд╣рд▓реЗ рдЕрдкрд╡рд╛рдж рдкрд░ "рд╢реБрд░реВ рдХреЗ рдкрддреЗ рдкрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдХреЗ рдмрд╛рдж рдХреЗ рд╕рднреА рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдЖрдкрдХреЗ рд╣реИрдВред
рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХреЗ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╣рд╛рдВ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбрд┐рдмрдЧрд░реНрд╕, рдЬреИрд╕реЗ рдХрд┐ WinDbg, рдЖрдкрдХреЛ рдпрд╣ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рджрд┐рдЦрд╛рдПрдЧрд╛, Visual Studio рдбреАрдмрдЧрд░ рдЗрд╕ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рддрд╛рд░реНрдХрд┐рдХ рд╢реБрд░реБрдЖрдд (рдореБрдЦреНрдп / WinMain рдирд╣реАрдВ CRT-Main) рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 // 'Exception' is the same variable declared above switch(Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_BREAKPOINT: if(m_bBreakpointOnceHit) // Would be set to false, before debugging starts { // Handle the actual breakpoint event } else { // This is first breakpoint event sent by kernel, just ignore it. // Optionally display to the user that first BP was ignored. m_bBreakpointOnceHit = true; } break; ... 


рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдХрд╛ рдореБрдЦреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЖрдИ-рдкрд╛рд░реНрдЯ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рдореЗрдВ рдЙрд╕ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреНрд░рд╛рд░рдВрдн рдкрддреЗ рдкрд░ рд░рдЦрд╛ рдерд╛ред
рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдкреЗрдЪреАрджрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ, рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗрдВ, рдЖрд░рд╛рдо рд╕реЗ рдмреИрдареЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рдмреНрд░реЗрдХ рдирд╣реАрдВ рдерд╛, рддреЛ рдЗрд╕реЗ рдХрд░реЗрдВ!
рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдШрдЯрдирд╛ рд╣реБрдИ рдЬрд╣рд╛рдВ рд╣рдордиреЗ рдЗрд╕реЗ рд░рдЦрд╛ред рдЕрдм рд╣рдо рд╕рд┐рд░реНрдл рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдХреЙрд▓ рд╕реНрдЯреИрдХ (рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА) рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдХреЛрдбрд╛рдВрддрд░рдХ рдпрд╛ рдорд╢реАрди рдХреЛрдб рд╕реНрддрд░ рдкрд░, рдЬрдм рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рдерд╛ рдФрд░ рдбреАрдмрдЧрд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рдерд╛, рддреЛ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЖрдХрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рдЗрдЯ рдерд╛ред рдЕрдиреБрджреЗрд╢ рд╕реВрдЪрдХ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реА рдмрд╛рдЗрдЯ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрддреЗ рдкрд░ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рднреА рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо GetThreadContext рдФрд░ SetThreadContext рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдХрд╛рд░реНрдп рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рджрд╕реНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рдпрд╣ рд▓реЗрдЦ x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд╣рдо рдЙрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ winnt.h рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рд╡рд╛рд╣ рд╕рдВрджрд░реНрдн рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 CONTEXT lcContext; lcContext.ContextFlags = CONTEXT_ALL; GetThreadContext(m_cProcessInfo.hThread, &lcContext); ,   .  ?   EIP      .    Eip  CONTEXT.     , EIP        .    ,          ,          .      : lcContext.Eip --; // Move back one byte SetThreadContext(m_cProcessInfo.hThread, &lcContext); 


рдИрдЖрдИрдкреА рд╡рд╣ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП THREAD_GET_CONTEXT рдФрд░ THREAD_SET_CONTEXT рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдВред
рдореБрдЭреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреВрд╕рд░реЗ рд╡рд┐рд╖рдп рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рджреЗрдВ: рдореВрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛! рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ WriteProcessMemory рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рдж FlushInstructionCacheред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:

 DWORD dwWriteSize; WriteProcessMemory(m_cProcessInfo.hProcess, StartAddress, &m_cOriginalInstruction, 1,&dwWriteSize); FlushInstructionCache(m_cProcessInfo.hProcess,StartAddress, 1); 


рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рдмрд╣рд╛рд▓ред рд╣рдо ContinueDebugEvent рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ:
  1. GetThreadContext, EIP рдХреЛ рдПрдХ, SetThreadContext рд╕реЗ рдХрдо рдХрд░реЗрдВред
  2. рдореВрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  3. рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВ

рдЕрдЪреНрдЫрд╛, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╣рд╛рдБ рд╣реИ? рд░рдЬрд┐рд╕реНрдЯрд░? рд╕реНрд░реЛрдд рдХреЛрдб? рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрдм рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛? рдпрд╣ рд╕рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд┐рдирд╛ рд╣реЛрдЧрд╛!

рдирд┐рд╖реНрдкрд╛рджрди рд░реЛрдХреЗрдВ, рдХреЙрд▓ рд╕реНрдЯреИрдХ, рдорд╛рди рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ


рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ * .PDB рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбрд┐рдмрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред DbgHelp.dll рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрд╣ рд╕рдм рдмрд╛рдж рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕реАрдкреАрдпреВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ CONTEXT рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдбреАрдмрдЧрд░ (рдбрд┐рдмрдЧ -> рд╡рд┐рдВрдбреЛрдЬ -> рд░рдЬрд┐рд╕реНрдЯрд░ рдпрд╛ Alt + F5) рдХреЗ рд░реВрдк рдореЗрдВ 10 рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 CString strRegisters; strRegisters.Format( L"EAX = %08X\nEBX = %08X\nECX = %08X\n" L"EDX = %08X\nESI = %08X\nEDI = %08X\n" L"EIP = %08X\nESP = %08X\nEBP = %08X\n" L"EFL = %08X", lcContext.Eax, lcContext.Ebx, lcContext.Ecx, lcContext.Edx, lcContext.Esi, lcContext.Edi, lcContext.Eip, lcContext.Esp, lcContext.Ebp, lcContext.EFlags ); 


рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИ! рдЗрд╕ рдкрд╛рда рдХреЛ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрдкрдпреБрдХреНрдд рдХрдорд╛рдВрдб (рдЬрд╛рд░реА, рд╕реНрдЯреЗрдк-рдЗрди, рд╕реНрдЯреЙрдк рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдЕрдиреНрдп) рджреЗрдиреЗ рддрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдВрдЯреАрдиреНрдпреВрдмреНрдпреВрд╡реЗрдВрдЯ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдбрд┐рдмрдЧ рд╕реНрдЯреНрд░реАрдо рдФрд░ GUI рд╕реНрдЯреНрд░реАрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рд╣рдо рдмрд╕ GUI рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╡рд░реНрддрдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдбрд┐рдмрдЧ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдИрд╡реЗрдВрдЯ" рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗред
рдЙрд▓рдЭрди рдореЗрдВ? рд╢рдмреНрдж "рдИрд╡реЗрдВрдЯ" рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ CreateEvent рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдПрдХ рдИрд╡реЗрдВрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо WaitForSingleObject (рдбрд┐рдмрдЧрд░ рдереНрд░реЗрдб рдореЗрдВ) рдХрд╣рддреЗ рд╣реИрдВред рдбреАрдмрдЧрд░ рдереНрд░реЗрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ GUI рдереНрд░реЗрдб рд╕реЗ SetEvent рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдзрд╛рд░рд╛рдУрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдЗрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ "рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░реЗрдВ - рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦреЗрдВ"ред
рдЕрдм, рдЗрд╕ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛрдб рддрд░реНрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
  1. GetThreadContext, EIP рдХреЛ рдПрдХ, SetThreadContext рд╕реЗ рдХрдо рдХрд░реЗрдВ
  2. WriteProcessMemory, FlushInstructionCache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рд▓реМрдЯрд╛рдПрдВ
  3. рд╡рд░реНрддрдорд╛рди рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
  4. рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд╕реВрдЪрдирд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ * .PDB рдлрд╛рдЗрд▓реЗрдВ, рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
  5. рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдкреНрд░рддреАрдХ рд╕реВрдЪрдирд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
  6. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ
  7. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХреА рдЧрдИ рдШрдЯрдирд╛ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди (рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдЪрд░рдг, рд░реЛрдХреЗрдВ, ...)
  8. рдХреЙрд▓ рдЬрд╛рд░реА рдХрд░реЗрдВ

рдЖрд╢реНрдЪрд░реНрдп? рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВрдЧреЗ!
рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдереНрд░реЗрдб рдХреЛ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдкреНрд░рд╛рдердорд┐рдХ рдереНрд░реЗрдб рдбреАрдмрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдм рддрдХ, рд╣рдо рдЕрднреА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдЖрда рдХрджрдо рд╕рднреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ (рдХрд┐рд╕реА рднреА рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдереНрд░реЗрдб рд╕реЗ) рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред
рдИрдЖрдИрдкреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рдЫреЛрдЯреА рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрди рдкрддреЗ рдкрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕реАрд╕реА рдХреЗ рд╕рд╛рде рднреА рдмрджрд▓рддреЗ рд╣реИрдВ (рдмреЗрд╢рдХ, рдореВрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП)ред рдЬреИрд╕реЗ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдЧрд▓реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рд╣рдо рдмрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди 8 рдЪрд░рдгреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ? рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдирд┐рд▓рдВрдмрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрджрд┐ рд╣рдо рдореВрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреВрд░реНрдг рднреНрд░рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ!

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдЬрд╛рд░реА рд░рдЦрдиреЗ рджреЛ!
рдЕрд░реЗ рд╣рд╛рдБ! рд╕реНрд░реЛрдд рдХреЛрдб! рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ!
рдХрд┐рд╕реА рднреА * .EXE рдФрд░ * .DLL рдЗрдореЗрдЬ рдореЗрдВ рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ * .PDB рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛:

рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ DbgHelp.Dll рдХреЗ рдЕрдВрджрд░ Sym * рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрд░реЛрдд-рд╕реНрддрд░реАрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдХ рд╣реИред рдЗрд╕рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЫрд╡рд┐ / exe / dll рдЫрд╡рд┐ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Dbghelp.h рдФрд░ DbgHelp.lib рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЪрд░рд┐рддреНрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбрд┐рдмрдЧреНрдпреВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдбрд┐рдмрдЧреНрдпреВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред рдЪрд░рд┐рддреНрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ SymInitialize рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 BOOL bSuccess = SymInitialize(m_cProcessInfo.hProcess, NULL, false); 


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

 'Debugger.exe': Loaded 'C:\Windows\SysWOW64\msvcrt.dll', Cannot find or open the PDB file 'Debugger.exe': Loaded 'C:\Windows\SysWOW64\mfc100ud.dll', Symbols loaded. 


Visual Studio 2010 msvcrt.dll рдХреЗ рд▓рд┐рдП рд╡рд░реНрдг рдирд╣реАрдВ рдвреВрдБрдв рд╕рдХрд╛ред рдФрд░ mfc100ud.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдкрдиреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдордПрдлрд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА, рд╕реНрд░реЛрдд рдХреЛрдб, рд╡рд░реНрдЧ / рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрджрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕рдВрдмрдВрдзрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ / exe рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо SymLoadModule64 / SymLoadModuleEx рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╣рд╛рдВ рдФрд░ рдХрдм рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрдХреНрд░ рд╕реЗ рдкрд╣рд▓реЗ (рдпрд╛рдиреА рдХрд┐рд╕реА рднреА рдбреАрдмрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдХрд┐рди CreateProcess рдХреЗ рдмрд╛рдж) рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рдЧрдпрд╛ред рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЬрдм CREATE_PROCESS_DEBUG_EVENT рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдБрдХрд┐ рд╣рдо рдирд┐рд░реНрднрд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирдП рд▓реЛрдб рдХрд┐рдП рдЧрдП EXE рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП SymLoadModule64 / Ex рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП LOAD_DLL_DEBUG_EVENT, рд╣рдореЗрдВ рднреА рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╛ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдиреАрдЪреЗ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдбрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред GetFileNameFromHandle рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд▓реЗрдЦ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 case LOAD_DLL_DEBUG_EVENT: { CStringA sDLLName; sDLLName = GetFileNameFromHandle(debug_event.u.LoadDll.hFile); DWORD64 dwBase = SymLoadModule64 (m_cProcessInfo.hProcess, NULL, sDLLName, 0, (DWORD64)debug_event.u.LoadDll.lpBaseOfDll, 0); strEventMessage.Format(L"Loaded DLL '%s' at address %x.", sDLLName, debug_event.u.LoadDll.lpBaseOfDll); ... 


рдмреЗрд╢рдХ, рд╕рдорд╛рди рдХреЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЛрдбрд┐рдВрдЧ рдкрд░ рднреА рд╣реЛрдЧрд╛ред рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЪреЗрддрд╛рд╡рдиреА: рдбрд┐рдмрдЧ рд╕реВрдЪрдирд╛ рдХреЗ рд╕рдлрд▓ рдЖрд░рдВрдн рдФрд░ рдЗрд╕рдХреЗ рд╕рдлрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛! рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛ рддреЛ рд╣рдореЗрдВ * .PDB рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SymGetModuleInfo64 рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:

 // Code continues from above IMAGEHLP_MODULE64 module_info; module_info.SizeOfStruct = sizeof(module_info); BOOL bSuccess = SymGetModuleInfo64(m_cProcessInfo.hProcess,dwBase, &module_info); // Check and notify if (bSuccess && module_info.SymType == SymPdb) { strEventMessage += ", Symbols Loaded"; } else { strEventMessage +=", No debugging symbols found."; } 


рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдкрд░ рдЙрдирдХреЗ рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬреЛрдЪреЗрди рдХрд▓рдВрдмрд╛рдЪ рдХрд╛ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд╣реВрдВ, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХреАред
рдЬрдм рдкреНрд░рддреАрдХ рдкреНрд░рдХрд╛рд░ SymPdb рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред * .PDB рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрд╡рдпрдВ (* .h рдФрд░ * .cpp рдлрд╝рд╛рдЗрд▓реЗрдВ) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП! * .PDB рдореЗрдВ рдЪрд░рд┐рддреНрд░ рдирд╛рдо, рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рд▓рд╛рдЗрди рдирдВрдмрд░ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд╣реИрдВ, рддреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕рд┐рдВрдЧ (рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдШрдЯрдирд╛ рдХреЗ рдЖрдЧрдорди рдкрд░, рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ StackWalk64 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рдЖрдк рдПрдХ рдкрдЯреНрдЯреА-рдиреАрдЪреЗ рдХреЛрдб рдирдореВрдирд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛрдЪреЗрди рдХрд▓рдореНрдмрдЪ рдХрд╛ рд▓реЗрдЦ рдкрдврд╝рд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдереАред

 void RetrieveCallstack(HANDLE hThread) { STACKFRAME64 stack={0}; // Initialize 'stack' with some required stuff. StackWalk64(IMAGE_FILE_MACHINE_I386, m_cProcessInfo.hProcess, hThread, &stack, &context, _ProcessMemoryReader, SymFunctionTableAccess64, SymGetModuleBase64, 0); ... 


STACKFRAME64 рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрддреЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЬреЛрдЪреЗрди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, x86 рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ StackWalk64 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 CONTEXT context; context.ContextFlags = CONTEXT_FULL; GetThreadContext(hThread, &context); // Must be like this stack.AddrPC.Offset = context.Eip; // EIP - Instruction Pointer stack.AddrPC.Mode = AddrModeFlat; stack.AddrFrame.Offset = context.Ebp; // EBP stack.AddrFrame.Mode = AddrModeFlat; stack.AddrStack.Offset = context.Esp; // ESP - Stack Pointer stack.AddrStack.Mode = AddrModeFlat; 


StackWalk64 рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдкрд╣рд▓рд╛ рд╕реНрдерд┐рд░ рдорд╢реАрди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ x86 рд╣реИред рдЕрдЧрд▓рд╛ рддрд░реНрдХ рдбрд┐рдмрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИред рддреАрд╕рд░рд╛ рдзрд╛рдЧрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ (рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛)ред рдЪреМрдерд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдкрд╛рдВрдЪрд╡реАрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрддреЗ рд╣реИрдВред _ProcessMemoryReader рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ ReadProcessMemory рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдЕрдиреНрдп рджреЛ Sym * рдлрд╝рдВрдХреНрд╢рди DbgHelp.dll рд╕реЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреНрд░реЗрд╕ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди: рдЕрдорд╛рдиреНрдп рдХреЙрд▓ рд╕реНрдЯреИрдХ, рдЕрдВрддрд╣реАрди рдХреЙрд▓ рд╕реНрдЯреИрдХ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЦреБрд▓реЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛: рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рдкрд╕реА рдкрддрд╛ NULL рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рдпрд╛ рдЬрдм рддрдХ StackWalk64 рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ (рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдереЛрдбрд╝реЗ рд╕рдордп рдмрд╛рдж рд╣реЛрдВрдЧреЗ):

 BOOL bSuccess; do { bSuccess = StackWalk64(IMAGE_FILE_MACHINE_I386, ... ,0); if(!bTempBool) break; // Symbol retrieval code goes here. // The contents of 'stack' would help determining symbols. // Which would put information in a vector. }while ( stack.AddrReturn.Offset != 0 ); 


рдбреАрдмрдЧ рдкреНрд░рддреАрдХ рдореЗрдВ рдХрдИ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ:

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ: рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓, рд▓рд╛рдЗрди рдирдВрдмрд░, рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдкрд╣рд▓рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ред

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

 IMAGEHLP_MODULE64 module={0}; module.SizeOfStruct = sizeof(module); SymGetModuleInfo64(m_cProcessInfo.hProcess, (DWORD64)stack.AddrPC.Offset, &module);  module.ModuleName      ,    .  module.MoadedImageModule       . Module.LineNumbers  ,        (1 тАУ ).        .         ,   SymGetSymFromAddr64  SymFromAddr.       PIMAGEHLP_SYMBOL64,     6 ,     ( ,  )  SYMBOL_INFO.    ,    ,    тАУ   .     : IMAGEHLP_SYMBOL64 *pSymbol; DWORD dwDisplacement; pSymbol = (IMAGEHLP_SYMBOL64*)new BYTE[sizeof(IMAGEHLP_SYMBOL64)+MAX_SYM_NAME]; memset(pSymbol, 0, sizeof(IMAGEHLP_SYMBOL64) + MAX_SYM_NAME); pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); // Required pSymbol->MaxNameLength = MAX_SYM_NAME; // Required SymGetSymFromAddr64(m_cProcessInfo.hProcess, stack.AddrPC.Offset, &dwDisplacement, pSymbol); // Retruns true on success 


рдЗрд╕ рдЕрдЬреАрдм рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛:

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

 IMAGEHLP_LINE64 line; line.SizeOfStruct = sizeof(line); bSuccess = SymGetLineFromAddr64(m_cProcessInfo.hProcess, (DWORD)stack.AddrPC.Offset, &dwDisplacement, &line); if(bSuccess) { // Use line.FileName, and line.LineNumber } 


DbgHlp.dll рд╕реЗ рдкреНрд░рддреАрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд▓рд╛рдЗрди рдЬрд╛рдирдХрд╛рд░реА рдпрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рджрд┐рдЦрд╛ рдкрд╛рдПрдВрдЧреЗред
рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди x86 рдирд┐рд░реНрджреЗрд╢ рдЖрдХрд╛рд░ рдореЗрдВ рддрдп рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдХреНрд░рдо рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "55 04 рдПрдлрдПрдл 76 78 рдПрдИ ...")ред рдпрд╛ рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ x86 рдХреЛрдб рдХреЛ рдбрд┐рд╕рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИред
рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо рджрд┐рдЦрд╛рдП рд╣реИрдВред рдЗрдирдореЗрдВ рдЖрдзрд╛рд░ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдЙрд╕ рдкрддреЗ рдкрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдирд╛, рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдкрд░ рдПрдХ рд╡реНрдпрд╡рдзрд╛рди рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛, рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛, рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдХреЙрд▓ рд╕реНрдЯреИрдХ, рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдпреВрдЖрдИ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд▓рдВрдмрд┐рдд рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдХрдВрдЯреАрдиреНрдпреВрдмреНрдпреВрд╡реЗрдВрдЯ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдбреАрдмрдЧрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдереНрд░реЗрдб рднреА рдирд┐рд▓рдВрдмрд┐рдд рд╣реИрдВред
рдпрд╣рд╛рдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ (UT рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдереНрд░реЗрдб рд╣реИ, DT рдбреАрдмрдЧрд░ рдереНрд░реЗрдб рд╣реИ):
[UT] рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреАрдмрдЧ рдереНрд░реЗрдб рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдСрдкрд░реЗрд╢рди UI рдХреЛ рдЖрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
[DT] CreateEvent рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рдмрдЧ рдИрд╡реЗрдВрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддрд╛ рд╣реИред
[DT] рдбреАрдмрдЧрд░ рдиреЗ CreateProcess рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдЪрдХреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИред
[DT] рдбрд┐рдмрдЧрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред
[рдбреАрдЯреА] рдбрд┐рдмрдЧрд░ WaitForSingleObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдбреАрдЯреА рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
[рдХреЗрдиреНрджреНрд░ рд╢рд╛рд╕рд┐рдд рдкреНрд░рджреЗрд╢реЛрдВ] рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рджрд░реНрд╢рди рдбрд┐рдмрдЧрд┐рдВрдЧ (рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдмрдВрдж рдХрд░реЛ рдФрд░ рд╕рдорд╛рд░реЛрд╣ рджрд░реНрдЬ) рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ
[рдХреЗрдиреНрджреНрд░ рд╢рд╛рд╕рд┐рдд рдкреНрд░рджреЗрд╢реЛрдВ] рдбрд┐рдмрдЧрд░ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ SetEvent-рдЕрдк рдбреАрдЯреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЙрд▓
[ рдбреАрдЯреА] рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрдХреНрд░ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдпрд╛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред
рдЬрдм рдореИрдВ рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╡рд░реНрдЧ) рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рддреЛ рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫреА рд╕реНрдореГрддрд┐ рд╣реИ рдФрд░ / рдпрд╛ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рджреЛ рдмрд╛рддреЗрдВ рдирд╣реАрдВ рдХрд╣реА рд╣реИрдВ:
рдЖрдзрд╛рд░ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб (GetStartAddress! рдлрд╝рдВрдХреНрд╢рди)ред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ, CREATE_PROCESS_DEBUG_INFO :: lpStartAddress рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЕрдм рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рдПрдХ рдмрд╛рд░ рдЖрдЧ рд▓рдЧрд╛ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкрддреЗ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВрдиреЗ DbgHelp.dll рдФрд░ Sym * рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо SymFromName рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рддреАрдХ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ, рдФрд░ SYMBOL_INFO рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдкрд┐рдЫрд▓рд╛ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди SymGetSymFromName64, рдЬреЛ PIMAGEHLP_SYMBOL64 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо SymWromName рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ wWinMainCRTStartup рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 DWORD GetStartAddress( HANDLE hProcess, HANDLE hThread ) { SYMBOL_INFO *pSymbol; pSymbol = (SYMBOL_INFO *)new BYTE[sizeof(SYMBOL_INFO )+MAX_SYM_NAME]; pSymbol->SizeOfStruct= sizeof(SYMBOL_INFO ); pSymbol->MaxNameLen = MAX_SYM_NAME; SymFromName(hProcess,"wWinMainCRTStartup",pSymbol); // Store address, before deleting pointer DWORD dwAddress = pSymbol->Address; delete [](BYTE*)pSymbol; // Valid syntax! return dwAddress; } 


рдмреЗрд╢рдХ, рдпрд╣ рдХреЗрд╡рд▓ wWinmainCRTStartup рдкрддреЗ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ EXE рдлрд╝рд╛рдЗрд▓ рдкреАрдЯреА рдЧрдИ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ 32-рдмрд┐рдЯ рд╣реЛ, рдорд╛рдирд╡рд░рд╣рд┐рдд рдХреЛрдб, рдпреВрдирд┐рдХреЛрдб рдпрд╛ рдПрдПрдирдПрд╕рдЖрдИ рдмрд┐рд▓реНрдб, рдпрд╛ рдЬреИрд╕реА рд╣реЛред
рдХрд╕реНрдЯрдо рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред

CDebuggerCore - рдбрд┐рдмрдЧрд┐рдВрдЧ-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд░реНрдЧ


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

 class CDebuggerCore { HANDLE m_hDebuggerThread; // Handle to debugger thread HANDLE m_heResumeDebugging; // Set by ResumeDebugging PROCESS_INFORMATION m_cProcessInfo; // Other member not shown for now. public: // Asynchronous call to start debugging // Spawns a thread, that has the debugging-loop, which // calls following virtual functions to notify debugging events. int StartDebugging(const CString& strExeFullPath); // How the user responded to continue debugging, // it may also include stop-debugging. // To be called from UI-thread int ResumeDebugging(EResumeMode); // Don't want to listen anything! Terminate! void StopDebugging(); protected: // Abstract methods virtual void OnDebugOutput(const TDebugOutput&) = 0; virtual void OnDllLoad(const TDllLoadEvent&) = 0; virtual void OnUpdateRegisters(const TRegisters&) = 0; virtual void OnUpdateCallStack(const TCallStack&) = 0; virtual void OnHaltDebugging(EHaltReason) = 0; }; 


рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЛ рдпрд╣ рд╡рд░реНрдЧ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧрд░ рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреЛрдб рдЦреБрдж рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛!
рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рд╕рд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рднреА рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ (рдСрди *) рдХреЛ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЗрди рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдкрдиреЗ CDebuggerCore рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА CDebugger рдХреНрд▓рд╛рд╕ рдмрдирд╛рдИ рдФрд░ рд╕рднреА рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рддрдм рдЖрдк рдЗрд╕ рдХреЛрдб рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 // In header, or at some persist-able location CDebugger theDebugger; // The point in code where you ask it to start debugging: theDebugger.StartDebugging("Path to executable"); 


рдЬреЛ рдмрд╕ рдбрд┐рдмрдЧ рд░рд╛рдЬреНрдп рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдбреАрдмрдЧ рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡рд┐рдзрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ StartDebugging рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреАрдмрдЧрд┐рдВрдЧ рд▓реВрдк рдбреАрдмрдЧрд░ рдереНрд░реЗрдб рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ (рдпрд╣ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ CreateProcess рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрдХреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ WaitForDebugEvent рдФрд░ ContinueDebugEvent рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рднреА рдбреАрдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдСрди * рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ OUTPUT_DEBUG_STRING_EVENT рдИрд╡реЗрдВрдЯ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде OnDebugOutput рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдиреНрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЗ рдХрд╣рддрд╛ рд╣реИред рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ, рдЬреИрд╕реЗ рдХрд┐ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдбреАрдмрдЧрд┐рдВрдЧ рд▓реВрдк рдкрд╣рд▓реЗ рдЙрдкрдпреБрдХреНрдд рдСрди * рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реЙрд▓реНрдЯрдмрдЧрд┐рдВрдЧ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди CDebuggerCore рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 // Enum enum EHaltReason { // Reason codes, like Breakpoint }; // In CDebuggerCore private: void HaltDebugging(EHaltReason); 


рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 void CDebuggerCore::HaltDebugging(EHaltReason eHaltReason) { // Halt the debugging OnHaltDebugging(eHaltReason); // And wait for it, until ResumeDebugging is called, which would set the event WaitForSingleObject(m_heResumeDebugging,INFINITE); } 


рдЪреВрдВрдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рд▓реВрдк рд╕реНрдЯреЙрдк рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдХрд╛рд░рдг рдЬрд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣реЙрд▓реНрдЯрдбреЗрдмрдЧрд┐рдВрдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдСрдирд╣реЙрд▓рдбрдмрдЧрд┐рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдУрд╡рд░рд╣рд╛рд▓реНрдЯрдбрдмрдЧрд┐рдВрдЧ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рд╛рде рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рдФрд░ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдпрд╛ рдЙрд╕ рдШрдЯрдирд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдбреАрдЯреА рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╣реА UI рдХреЗ рд╕рд╛рде, рдЬреИрд╕реЗ: рдореЗрдиреВ, рд╣реЙрдЯ рдХреА рдЖрджрд┐ред UI рдереНрд░реЗрдб ResumeDebugging рдХреЛ рдЙрдкрдпреБрдХреНрдд рд░реЗрдЬрд╝реНрдпреВрдореЗ рдореЛрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ (рдЬрд╛рд░реА рд░рдЦреЗрдВ)", "рдлрд╝рдВрдХреНрд╢рди (StepIp) рджрд░реНрдЬ рдХрд░реЗрдВ" рдпрд╛ "рд╕реНрдЯреЙрдк рдбреАрдмрдЧрд┐рдВрдЧ (рд░реЛрдХреЗрдВ)") рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред ResumeDebugging рд╡рд┐рдзрд┐, рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ EresumeMode рдзреНрд╡рдЬ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЪрд░ рд╕рджрд╕реНрдп рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдШрдЯрдирд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SetEvent рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдмрдЧ рдереНрд░реЗрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред
рдЕрдм рдЬрдм HaltDebugging рдиреЗ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рд╣реИ, рдбреАрдмрдЧ рд▓реВрдк рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХреНрдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, m_eResumeMode рдЪрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдЬреЛ рдХрд┐ ResumeDebugging рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ; рдпрд╛ рдЙрдкрдпреБрдХреНрдд рдбрд┐рдмрдЧрд┐рдВрдЧ рдЖрдиреЗ рдкрд░ рдкреВрд░реНрдг рдбрд┐рдмрдЧрд┐рдВрдЧред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, EResumeMode рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 // What action was initiated by user to resume enum EResumeMode { Continue, // F5 Stop, // Shift+F5 StepOver, // F10 // More .. }; 


рдЕрдВрддрд┐рдо рднрд╛рдЧ рдореЗрдВ рд╣реЛрдЧрд╛:

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


All Articles