рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВ

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

рдкреВрдЫреЛ рдХреНрдпреЛрдВ?
рдЦреИрд░, 32-рдмрд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, 2-3 рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдЖрдкрдХреА рд╕реАрдорд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд╣рд░ рдЖрдк AWE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднреА, рдмрд╕ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП ...

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдбрд┐рдмрдЧрд░ рдХреЗ рдХрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рдбреАрдмрдЧрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдбреАрдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдмрд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реИ ...

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдм рдХрд┐рд╕реА рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╣реБрдП, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд░рд┐рд╡реАрдЬрди рдХрд░рддреЗ рд╕рдордп):

1. рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдЪрд╛рд▓рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рд╣реИ рдФрд░, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдбреЗрд▓реНрдлреА рдбрд┐рдмрдЧрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдордПрд╕ рд╡реАрд╕реА ++ рдореЗрдВ)ред
2. рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╕рдВрд╢реЛрдзрди (PEB / TEB / SEHChain / Unwind / PE рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЖрджрд┐ ...) рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдЙрди рдкрддреЛрдВ рдкрд░ рдЕрдирдореИрдк рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкрдардиреАрдп рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
3. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди (рд▓рдЧрднрдЧ рдХреЛрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЧрдИ, рд▓реЛрдХрдкреНрд░рд┐рдп рдбреАрдмрдЧрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпреЛрдВ рдПрдХ рдиреАрд▓реЗ рд░рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреА рджреЛ рддрд╕реНрд╡реАрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣рд╛рдВ рд╣реЛ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред

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

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


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


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


рдЦреИрд░, рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЗрддрдиреЗ рд╕рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдП рдкреНрд░реЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреА рдЖрджрдд рдирд╣реАрдВ рд╣реИ (рдореИрдВ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реВрдВ :)

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

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

1. рдЙрдкрд▓рдмреНрдз рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


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

рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреНрдпрд╛ рд╣реИ?
рдореЛрдЯреЗ рддреМрд░ рдкрд░ ( MSDN рдкрд░ рдЖрдзрд╛рд░рд┐рдд ) рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ VirtualQuery рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдкрддреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред

рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

program Project1; {$APPTYPE CONSOLE} {$R *.res} uses Windows, SysUtils; var MBI: TMemoryBasicInformation; dwLength: NativeUInt; Address: PByte; begin Address := nil; dwLength := SizeOf(TMemoryBasicInformation); while VirtualQuery(Address, MBI, dwLength) <> 0 do begin Writeln( 'AllocationBase: ', IntToHex(NativeUInt(MBI.AllocationBase), 8), ', BaseAddress: ', IntToHex(NativeUInt(MBI.BaseAddress), 8), ', RegionSize: ', MBI.RegionSize); Inc(Address, MBI.RegionSize); end; Readln; end. 

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


рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ $ 10,000 (64 kb) рд╣реИ, рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ 16 рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдкрддрд╛ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд░рд╛рдЬреНрдп (рд░рд╛рдЬреНрдп) MEM_FREE ($ 10,000) рд╣реИ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ PAGE_NO_ACCESS (1) рд╕реБрд░рдХреНрд╖рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реЗрдЯ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 function ExtractAccessString(const Value: DWORD): string; const PAGE_WRITECOMBINE = $400; begin Result := 'Unknown access'; if (Value and PAGE_EXECUTE) = PAGE_EXECUTE then Result := 'E'; if (Value and PAGE_EXECUTE_READ) = PAGE_EXECUTE_READ then Result := 'RE'; if (Value and PAGE_EXECUTE_READWRITE) = PAGE_EXECUTE_READWRITE then Result := 'RWE'; if (Value and PAGE_EXECUTE_WRITECOPY) = PAGE_EXECUTE_WRITECOPY then Result := 'RE, Write copy'; if (Value and PAGE_NOACCESS) = PAGE_NOACCESS then Result := 'No access'; if (Value and PAGE_READONLY) = PAGE_READONLY then Result := 'R'; if (Value and PAGE_READWRITE) = PAGE_READWRITE then Result := 'RW'; if (Value and PAGE_WRITECOPY) = PAGE_WRITECOPY then Result := 'Write copy'; if (Value and PAGE_GUARD) = PAGE_GUARD then Result := Result + ', Guarded'; if (Value and PAGE_NOCACHE) = PAGE_NOCACHE then Result := Result + ', No cache'; if (Value and PAGE_WRITECOMBINE) = PAGE_WRITECOMBINE then Result := Result + ', Write Combine'; end; function ExtractRegionTypeString(Value: TMemoryBasicInformation): string; begin Result := ''; case Value.State of MEM_FREE: Result := 'Free'; MEM_RESERVE: Result := 'Reserved'; MEM_COMMIT: case Value.Type_9 of MEM_IMAGE: Result := 'Image'; MEM_MAPPED: Result := 'Mapped'; MEM_PRIVATE: Result := 'Private'; end; end; Result := Result + ', ' + ExtractAccessString(Value.Protect); end; var MBI: TMemoryBasicInformation; dwLength: NativeUInt; Address: PByte; begin Address := nil; dwLength := SizeOf(TMemoryBasicInformation); while VirtualQuery(Address, MBI, dwLength) <> 0 do begin Writeln( 'AllocationBase: ', IntToHex(NativeUInt(MBI.AllocationBase), 8), ', BaseAddress: ', IntToHex(NativeUInt(MBI.BaseAddress), 8), ' - ', ExtractRegionTypeString(MBI)); Inc(Address, MBI.RegionSize); end; 

... рддреЛ рдЖрдк VirtualAlloc рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░реАрдпрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


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

2. рд╣рдо рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ


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

рдереНрд░реЗрдб рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕рд░рд▓ рд╣реИ - CreateToolhelp32Snapshot рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

 const THREAD_GET_CONTEXT = 8; THREAD_SUSPEND_RESUME = 2; THREAD_QUERY_INFORMATION = $40; ThreadBasicInformation = 0; ThreadQuerySetWin32StartAddress = 9; STATUS_SUCCESS = 0; var hSnap, hThread: THandle; ThreadEntry: TThreadEntry32; TBI: TThreadBasicInformation; TIB: NT_TIB; lpNumberOfBytesRead: NativeUInt; ThreadStartAddress: Pointer; begin //      hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, GetCurrentProcessId); if hSnap <> INVALID_HANDLE_VALUE then try ThreadEntry.dwSize := SizeOf(TThreadEntry32); if Thread32First(hSnap, ThreadEntry) then repeat if ThreadEntry.th32OwnerProcessID <> GetCurrentProcessId then Continue; Writeln('ThreadID: ', ThreadEntry.th32ThreadID); //   hThread := OpenThread(THREAD_GET_CONTEXT or THREAD_SUSPEND_RESUME or THREAD_QUERY_INFORMATION, False, ThreadEntry.th32ThreadID); if hThread <> 0 then try //   ThreadProc() if NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, @ThreadStartAddress, SizeOf(ThreadStartAddress), nil) = STATUS_SUCCESS then Writeln('ThreadProcAddr: ', IntToHex(NativeUInt(ThreadStartAddress), 1)); //     if NtQueryInformationThread(hThread, ThreadBasicInformation, @TBI, SizeOf(TThreadBasicInformation), nil) = STATUS_SUCCESS then begin Writeln('Thread Environment Block (TEB) Addr: ', IntToHex(NativeUInt(TBI.TebBaseAddress), 1)); //      // TIB (Thread Information Block)   if ReadProcessMemory(GetCurrentProcess, TBI.TebBaseAddress, @TIB, SizeOf(NT_TIB), lpNumberOfBytesRead) then begin Writeln('Thread StackBase Addr: ', IntToHex(NativeUInt(TIB.StackBase), 1)); Writeln('Thread StackLimit Addr: ', IntToHex(NativeUInt(TIB.StackLimit), 1)); end; end; finally CloseHandle(hThread); end; until not Thread32Next(hSnap, ThreadEntry); finally CloseHandle(hSnap); end; Readln; end. 

рдХрджрдо:

  1. CreateToolhelp32Snapshot / Thread32First / Thread32Next рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╕рдХреНрд░рд┐рдп рдереНрд░реЗрдб рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред
  2. рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдереНрд░реЗрдб рдХреЛ рд╣реИрдВрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдУрдкрдирдереНрд░реЗрдб рдХрд╣рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. NtQueryInformationTread рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╣рдореЗрдВ рдереНрд░реЗрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрд╕рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ TThreadBasicInformation рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдереНрд░реЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реАред
  4. рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реЗ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - TebBaseAddress, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдкрд░реНрдпрд╛рд╡рд░рдг рдмреНрд▓реЙрдХ рдХрд╛ рдкрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддрдерд╛рдХрдерд┐рдд TEB (рдереНрд░реЗрдб рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмреНрд▓реЙрдХ)ред
  5. ReadProcessMemory (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдмреЗрдорд╛рдиреА рд╣реИ) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рд╣рдо TEB рдкрддреЗ рдкрд░ рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░, рдЬреЛ рдПрдХ NT_TIB рд╕рдВрд░рдЪрдирд╛ рд╣реИред

NT_TIB рдШреЛрд╖рдгрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

  PNT_TIB = ^_NT_TIB; _NT_TIB = record ExceptionList: Pointer; StackBase, StackLimit, SubSystemTib: Pointer; case Integer of 0: ( FiberData: Pointer ); 1: ( Version: ULONG; ArbitraryUserPointer: Pointer; Self: PNT_TIB; ) end; NT_TIB = _NT_TIB; PPNT_TIB = ^PNT_TIB; 

рдареАрдХ рд╣реИ, рдпрд╛ рдЗрд╕ рддрд░рд╣, рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:


рд╢реЗрд╖ рдЦреЗрддреЛрдВ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

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

рдпрд╣ рдХреЛрдб рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:


рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ VMMap рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЪрд┐рддреНрд░ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ VMMap TEB рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред

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

рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рд╕реНрдЯреНрд░реАрдо рдХреЗ TEB рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ ToolHelp32.dll рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ FS рдЦрдВрдб рд░рдЬрд┐рд╕реНрдЯрд░ (x64 рдХреЗ рд▓рд┐рдП GS) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдЕрдХреНрд╕рд░ TEB рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 function GetCurrentTEB: NativeUInt; asm {$IFDEF WIN64} // mov RAX, qword ptr GS:[30h] //   ,      64-  DB $65, $48, $8B, $04, $25, $30, 0, 0, 0 //    ,    mov RAX, qword ptr GS:[abs $30] {$ELSE} mov EAX, FS:[18h] {$ENDIF} end; 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, TEB рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ NtTIB.Self рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ 0x18 (рдпрд╛ 64-рдмрд┐рдЯ TEB рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0x30) рдкрд░ рд╕реНрдерд┐рдд рд╣реИред

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

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

рдпрд╣рд╛рдВ рд╣рдо рдРрд╕реА рд╕рд░рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде SEH рдлреНрд░реЗрдо рдХреЗ рдкреНрд░рдЪрд╛рд░ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ:

 procedure GetThreadSEHFrames(InitialAddr: Pointer); type EXCEPTION_REGISTRATION = record prev, handler: Pointer; end; var ER: EXCEPTION_REGISTRATION; lpNumberOfBytesRead: NativeUInt; begin while ReadProcessMemory(GetCurrentProcess, InitialAddr, @ER, SizeOf(EXCEPTION_REGISTRATION), lpNumberOfBytesRead) do begin Writeln('SEH Frame at Addr: ', IntToHex(NativeUInt(InitialAddr), 1), ', handler at addr: ', IntToHex(NativeUInt(ER.handler), 1)); InitialAddr := ER.prev; if DWORD(InitialAddr) <= 0 then Break; end; end; 

TEB.TIB.ExceptionList рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реА EXCEPTION_REGISTRATION рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ EXCEPTION_REGISTRATION рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╣реИрдВрдбрд▓рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЕрдЪрд╛рдирдХ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЦреИрд░, рдХреЙрд▓рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА:

 procedure GetThreadCallStack(hThread: THandle); var StackFrame: TStackFrame; ThreadContext: PContext; MachineType: DWORD; begin // ThreadContext   ,   VirtualAlloc //         //     ERROR_NOACCESS (998) ThreadContext := VirtualAlloc(nil, SizeOf(TContext), MEM_COMMIT, PAGE_READWRITE); try ThreadContext^.ContextFlags := CONTEXT_FULL; if not GetThreadContext(hThread, ThreadContext^) then Exit; ZeroMemory(@StackFrame, SizeOf(TStackFrame)); StackFrame.AddrPC.Mode := AddrModeFlat; StackFrame.AddrStack.Mode := AddrModeFlat; StackFrame.AddrFrame.Mode := AddrModeFlat; StackFrame.AddrPC.Offset := ThreadContext.Eip; StackFrame.AddrStack.Offset := ThreadContext.Esp; StackFrame.AddrFrame.Offset := ThreadContext.Ebp; MachineType := IMAGE_FILE_MACHINE_I386; while True do begin if not StackWalk(MachineType, GetCurrentProcess, hThread, @StackFrame, ThreadContext, nil, nil, nil, nil) then Break; if StackFrame.AddrPC.Offset <= 0 then Break; Writeln('CallStack Frame Addr: ', IntToHex(NativeUInt(StackFrame.AddrFrame.Offset), 1)); Writeln('CallStack Handler: ', IntToHex(NativeUInt(StackFrame.AddrPC.Offset), 1)); Writeln('CallStack Stack: ', IntToHex(NativeUInt(StackFrame.AddrStack.Offset), 1)); Writeln('CallStack Return: ', IntToHex(NativeUInt(StackFrame.AddrReturn.Offset), 1)); end; finally VirtualFree(ThreadContext, SizeOf(TContext), MEM_FREE); end; end; 

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

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

рдпрд╣ рдирд┐рдореНрди рдХрд╛рд░рдг рд╕реЗ рд╣реЛрдЧрд╛: StackWalk рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо (EB64 рдФрд░ ESP / RBP рдФрд░ RS64 рдХреЗ рд▓рд┐рдП RSP) рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ) рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдкрддрд╛ (X64 рдХреЗ рд▓рд┐рдП EIP рдпрд╛ RIP рд░рдЬрд┐рд╕реНрдЯрд░)ред рдпрджрд┐ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рд╕рдордп рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо GetThreadContext рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдЯреИрдХ рдХреЛ рд╕реНрдкрд┐рди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╕рднреА рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдиреНрдп рдирд╣реАрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ ...

рдореИрдВ 64-рдмрд┐рдЯ OS рдХреЗ рддрд╣рдд 32-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ 32 рдФрд░ 64-рдмрд┐рдЯ рд╡реЗрд░рд┐рдПрдВрдЯ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм ...

3. рд╣рдо рдвреЗрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ


рдбреЗрд▓реНрдлреА рдЖрд╡реЗрджрди рд╣реА, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣реАрдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реА ++ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЕрдзрд┐рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╣реАрдкреНрд╕ рдпрд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╣реАрдк рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдвреЗрд░ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣реАрдкреЗрдВрдЯреНрд░реА рддрддреНрд╡ рдХрдИ рд╣рдЬрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдпрд╣ рд╣реИ рдХрд┐ рд╣реАрд╡реЗрдЯ 2 рдиреЗрдХреНрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рдХрд╛рдлреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рджреЗрд░реА (рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рджрд╕рд┐рдпреЛрдВ рд╕реЗрдХрдВрдб)ред

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

 const RTL_HEAP_BUSY = 1; RTL_HEAP_SEGMENT = 2; RTL_HEAP_SETTABLE_VALUE = $10; RTL_HEAP_SETTABLE_FLAG1 = $20; RTL_HEAP_SETTABLE_FLAG2 = $40; RTL_HEAP_SETTABLE_FLAG3 = $80; RTL_HEAP_SETTABLE_FLAGS = $E0; RTL_HEAP_UNCOMMITTED_RANGE = $100; RTL_HEAP_PROTECTED_ENTRY = $200; RTL_HEAP_FIXED = (RTL_HEAP_BUSY or RTL_HEAP_SETTABLE_VALUE or RTL_HEAP_SETTABLE_FLAG2 or RTL_HEAP_SETTABLE_FLAG3 or RTL_HEAP_SETTABLE_FLAGS or RTL_HEAP_PROTECTED_ENTRY); STATUS_SUCCESS = 0; function CheckSmallBuff(Value: DWORD): Boolean; const STATUS_NO_MEMORY = $C0000017; STATUS_BUFFER_TOO_SMALL = $C0000023; begin Result := (Value = STATUS_NO_MEMORY) or (Value = STATUS_BUFFER_TOO_SMALL); end; function FlagToStr(Value: DWORD): string; begin case Value of LF32_FIXED: Result := 'LF32_FIXED'; LF32_FREE: Result := 'LF32_FREE'; LF32_MOVEABLE: Result := 'LF32_MOVEABLE'; else Result := ''; end; end; var I, A: Integer; pDbgBuffer: PRtlDebugInformation; pHeapInformation: PRtlHeapInformation; pHeapEntry: PRtrHeapEntry; dwAddr, dwLastSize: ULONG_PTR; hit_seg_count: Integer; BuffSize: NativeUInt; begin // ..  Heap32ListFirst, Heap32ListNext, Heap32First, Heap32Next //   , -   // RtlQueryProcessDebugInformation   ,     //      //    BuffSize := $400000; pDbgBuffer := RtlCreateQueryDebugBuffer(BuffSize, False); //       while CheckSmallBuff(RtlQueryProcessDebugInformation(GetCurrentProcessId, RTL_QUERY_PROCESS_HEAP_SUMMARY or RTL_QUERY_PROCESS_HEAP_ENTRIES, pDbgBuffer)) do begin //     , ... RtlDestroyQueryDebugBuffer(pDbgBuffer); BuffSize := BuffSize shl 1; pDbgBuffer := RtlCreateQueryDebugBuffer(BuffSize, False); end; if pDbgBuffer <> nil then try //       if RtlQueryProcessDebugInformation(GetCurrentProcessId, RTL_QUERY_PROCESS_HEAP_SUMMARY or RTL_QUERY_PROCESS_HEAP_ENTRIES, pDbgBuffer) = STATUS_SUCCESS then begin //       pHeapInformation := @pDbgBuffer^.Heaps^.Heaps[0]; //    ... for I := 0 to pDbgBuffer^.Heaps^.NumberOfHeaps - 1 do begin //     pHeapEntry := pHeapInformation^.Entries; dwAddr := DWORD(pHeapEntry^.u.s2.FirstBlock) + pHeapInformation^.EntryOverhead; dwLastSize := 0; A := 0; while A < Integer(pHeapInformation^.NumberOfEntries) do try hit_seg_count := 0; while (pHeapEntry^.Flags and RTL_HEAP_SEGMENT) = RTL_HEAP_SEGMENT do begin //     RTL_HEAP_SEGMENT, //       EntryOverhead dwAddr := DWORD(pHeapEntry^.u.s2.FirstBlock) + pHeapInformation^.EntryOverhead; Inc(pHeapEntry); Inc(A); Inc(hit_seg_count); //      if A + hit_seg_count >= Integer(pHeapInformation^.NumberOfEntries - 1) then Continue; end; //       ,     , //    +    if hit_seg_count = 0 then Inc(dwAddr, dwLastSize); //   if pHeapEntry^.Flags and RTL_HEAP_FIXED <> 0 then pHeapEntry^.Flags := LF32_FIXED else if pHeapEntry^.Flags and RTL_HEAP_SETTABLE_FLAG1 <> 0 then pHeapEntry^.Flags := LF32_MOVEABLE else if pHeapEntry^.Flags and RTL_HEAP_UNCOMMITTED_RANGE <> 0 then pHeapEntry^.Flags := LF32_FREE; if pHeapEntry^.Flags = 0 then pHeapEntry^.Flags := LF32_FIXED; //   Writeln('HeapID: ', I, ', entry addr: ', IntToHex(dwAddr, 8), ', size: ', IntToHex(pHeapEntry^.Size, 8), ' ', FlagToStr(pHeapEntry^.Flags)); //     dwLastSize := pHeapEntry^.Size; //     Inc(pHeapEntry); finally Inc(A); end; //     Inc(pHeapInformation); end; end; finally RtlDestroyQueryDebugBuffer(pDbgBuffer); end; Readln; end. 

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, RtlQueryProcessDebugInformation, RtlCreateQueryDebugBuffer, рдФрд░ RtlQueryProcessDebugInformation рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдПрдХ рдмрдлрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ рдвреЗрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдлрд┐рд░, рдЗрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд▓реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
pDbgBuffer ^ .Heaps - рд╣реАрдк рд╕реВрдЪрд┐рдпреЛрдВ (THeapList32 рдХрд╛ рдПрдирд╛рд▓реЙрдЧ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдЦреБрдж pDbgBuffer ^ .Heaps ^ .Heaps [N] .Entries (THeapEntry32 рдХрд╛ рдПрдирд╛рд▓реЙрдЧ) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛:


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

4. рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдкреАрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ


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

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

рдирд┐рдореНрди рдХреЛрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдПрдХ рдорд╛рдиреНрдп рдкреАрдИ рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ:

 function CheckPEImage(hProcess: THandle; ImageBase: Pointer; var IsPEImage64: Boolean): Boolean; var ReturnLength: NativeUInt; IDH: TImageDosHeader; NT: TImageNtHeaders; begin Result := False; IsPEImage64 := False; if not ReadProcessMemory(hProcess, ImageBase, @IDH, SizeOf(TImageDosHeader), ReturnLength) then Exit; if IDH.e_magic <> IMAGE_DOS_SIGNATURE then Exit; ImageBase := Pointer(NativeInt(ImageBase) + IDH._lfanew); if not ReadProcessMemory(hProcess, ImageBase, @NT, SizeOf(TImageNtHeaders), ReturnLength) then Exit; Result := NT.Signature = IMAGE_NT_SIGNATURE; IsPEImage64 := (NT.FileHeader.Machine = IMAGE_FILE_MACHINE_IA64) or (NT.FileHeader.Machine = IMAGE_FILE_MACHINE_ALPHA64) or (NT.FileHeader.Machine = IMAGE_FILE_MACHINE_AMD64); end; 

рдареАрдХ рд╣реИ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡рд╣ рдмрд╕ рдЕрдкрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП ImageDosHeader рдФрд░ ImageNTHeader рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, 99% рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд┐рд░реНрдл рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реИ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдкреАрдИ рдлрд╝рд╛рдЗрд▓ 64-рдмрд┐рдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЖрдк GetMappedFileName рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 function GetFileAtAddr(hProcess: THandle; ImageBase: Pointer): string; begin SetLength(Result, MAX_PATH); SetLength(Result, GetMappedFileName(hProcess, ImageBase, @Result[1], MAX_PATH)); end; 

рдФрд░ рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рдХреНрдпрд╛ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

 var MBI: TMemoryBasicInformation; dwLength: NativeUInt; Address: PByte; IsPEImage64: Boolean; begin Address := nil; dwLength := SizeOf(TMemoryBasicInformation); while VirtualQuery(Address, MBI, dwLength) <> 0 do begin if CheckPEImage(GetCurrentProcess, MBI.BaseAddress, IsPEImage64) then begin Write(IntToHex(NativeUInt(MBI.BaseAddress), 8), ': ', GetFileAtAddr(GetCurrentProcess, MBI.BaseAddress)); if IsPEImage64 then Writeln(' (x64)') else Writeln(' (x32)'); end; Inc(Address, MBI.RegionSize); end; Readln; end. 

рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдорд┐рд▓рддрд╛ рд╣реИ:


32-рдмрд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ 64-рдмрд┐рдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА? рд╣рд╛рдБ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИ :)

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ 32-рдмрд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдВрдбреЛрдЬ 7 x64 рд╣реИред рдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдЪрд╛рд░ 64-рдмрд┐рдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдорд╛рд░реА 32-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪреБрдкрдЪрд╛рдк рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ - рдпрд╣ рддрдерд╛рдХрдерд┐рдд Wow64 ( 64-рдмрд┐рдЯ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ Win32 рдЕрдиреБрдХрд░рдг ) рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ 32-рдмрд┐рдЯ рдзрд╛рд░рд╛рдУрдВ рдФрд░ рдвреЗрд░ рдХреЗ 64-рдмрд┐рдЯ рдПрдирд╛рд▓реЙрдЧ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВред

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

рдЖрдЗрдП рдЗрд╕реЗ рдРрд╕реЗ рдХрд░реЗрдВ:

 procedure GetInfoFromImage(const FileName: string; ImageBase: Pointer); var ImageInfo: TLoadedImage; ImageSectionHeader: PImageSectionHeader; I: Integer; begin if MapAndLoad(PAnsiChar(AnsiString(FileName)), nil, @ImageInfo, True, True) then try ImageSectionHeader := ImageInfo.Sections; for I := 0 to Integer(ImageInfo.NumberOfSections) - 1 do begin Write( IntToHex((NativeUInt(ImageBase) + ImageSectionHeader^.VirtualAddress), 8), ': ', string(PAnsiChar(@ImageSectionHeader^.Name[0]))); if IsExecute(ImageSectionHeader^.Characteristics) then Write(' Execute'); if IsWrite(ImageSectionHeader^.Characteristics) then Write(' Writable'); Writeln; Inc(ImageSectionHeader); end; finally UnMapAndLoad(@ImageInfo); end; Writeln; end; 

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

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

MapAndLoad рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 64-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ 32-рдмрд┐рдЯ PE рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ 32-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧреАред

рдХреЛрдб рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ: MapAndLoad рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рд╛рде рдкрд░ рдПрдХ TLoadedImage рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ TImageSectionHeader рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ VirtualAddress рдлрд╝реАрд▓реНрдб рд╣реИ, рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдб рдкрддреЗ рд╕реЗ рдСрдлрд╕реЗрдЯ рд╣реИред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ hInstance рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдХрд░, рд╣рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИред

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

 function IsExecute(const Value: DWORD): Boolean; begin Result := False; if (Value and IMAGE_SCN_CNT_CODE) = IMAGE_SCN_CNT_CODE then Result := True; if (Value and IMAGE_SCN_MEM_EXECUTE) = IMAGE_SCN_MEM_EXECUTE then Result := True; end; function IsWrite(const Value: DWORD): Boolean; begin Result := False; if (Value and IMAGE_SCN_CNT_UNINITIALIZED_DATA) = IMAGE_SCN_CNT_UNINITIALIZED_DATA then Result := True; if (Value and IMAGE_SCN_MEM_WRITE) = IMAGE_SCN_MEM_WRITE then Result := True; end; 

рдЗрд╕ рдХреЛрдб рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:


рд╕рдЪ рд╣реИ, рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЫреЛрдЯреА рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, GetMappedFileName рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рджреЗрддрд╛ рд╣реИ: "\ Device \ HarddiskVolume2 \ Windows \ System32 \ wow64cpu.dll", рдФрд░ MapAndLoad рдлрд╝рдВрдХреНрд╢рди рдХреЛ "C: \ Windows \ System32 \ wow64cpu рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдбреАрдПрд▓ред "

рдирд┐рдореНрди рдХреЛрдб рдкрд░рд┐рдЪрд┐рдд рд░реВрдк рдореЗрдВ рд░рд╛рд╕реНрддрд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

 function NormalizePath(const Value: string): string; const OBJ_CASE_INSENSITIVE = $00000040; STATUS_SUCCESS = 0; FILE_SYNCHRONOUS_IO_NONALERT = $00000020; FILE_READ_DATA = 1; ObjectNameInformation = 1; DriveNameSize = 4; VolumeCount = 26; DriveTotalSize = DriveNameSize * VolumeCount; var US: UNICODE_STRING; OA: OBJECT_ATTRIBUTES; IO: IO_STATUS_BLOCK; hFile: THandle; NTSTAT, dwReturn: DWORD; ObjectNameInfo: TOBJECT_NAME_INFORMATION; Buff, Volume: string; I, Count, dwQueryLength: Integer; lpQuery: array [0..MAX_PATH - 1] of Char; AnsiResult: AnsiString; begin Result := Value; //     ZwOpenFile RtlInitUnicodeString(@US, StringToOleStr(Value)); //   InitializeObjectAttributes FillChar(OA, SizeOf(OBJECT_ATTRIBUTES), #0); OA.Length := SizeOf(OBJECT_ATTRIBUTES); OA.ObjectName := @US; OA.Attributes := OBJ_CASE_INSENSITIVE; //  ZwOpenFile   ,     //    , : // \SystemRoot\System32\ntdll.dll // \??\C:\Windows\System32\ntdll.dll // \Device\HarddiskVolume1\WINDOWS\system32\ntdll.dll //        NTSTAT := ZwOpenFile(@hFile, FILE_READ_DATA or SYNCHRONIZE, @OA, @IO, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT); if NTSTAT = STATUS_SUCCESS then try //  ,      NTSTAT := NtQueryObject(hFile, ObjectNameInformation, @ObjectNameInfo, MAX_PATH * 2, @dwReturn); if NTSTAT = STATUS_SUCCESS then begin SetLength(AnsiResult, MAX_PATH); WideCharToMultiByte(CP_ACP, 0, @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength - ObjectNameInfo.Name.Length {$IFDEF WIN64} + 4{$ENDIF}], ObjectNameInfo.Name.Length, @AnsiResult[1], MAX_PATH, nil, nil); Result := string(PAnsiChar(AnsiResult)); //     ZwOpenFile  //    \Device\HarddiskVolume\- //        SetLength(Buff, DriveTotalSize); Count := GetLogicalDriveStrings(DriveTotalSize, @Buff[1]) div DriveNameSize; for I := 0 to Count - 1 do begin Volume := PChar(@Buff[(I * DriveNameSize) + 1]); Volume[3] := #0; //         //     QueryDosDevice(PChar(Volume), @lpQuery[0], MAX_PATH); dwQueryLength := Length(string(lpQuery)); if Copy(Result, 1, dwQueryLength) = string(lpQuery) then begin Volume[3] := '\'; if lpQuery[dwQueryLength - 1] <> '\' then Inc(dwQueryLength); Delete(Result, 1, dwQueryLength); Result := Volume + Result; Break; end; end; end; finally ZwClose(hFile); end; end; 

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдкреБрд░рд╛рдирд╛ рдХреЛрдб рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдкрде рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╛рд╕реНрддреЛрдВ рд╕реЗ рд╣реИ:


тАж "\Device\HarddiskVolume1\WINDOWS\system32\ntdll.dll".
ZwOpenFile + NtQueryObject, QueryDosDevice, . ( ) .

.
, PE , , , , , UNWIND ..

:

 procedure EnumDirectoryes(ImageBase: Pointer; ImageInfo: TLoadedImage; AddrStart, AddrEnd: NativeUInt); const DirectoryStr: array [0..14] of string = ('export', 'import', 'resource', 'exception', 'security', 'basereloc', 'debug', 'copyright', 'globalptr', 'tls', 'load_config', 'bound_import', 'iat', 'delay_import', 'com'); var I: Integer; dwDirSize: DWORD; DirAddr: Pointer; ReadlDirAddr: NativeUInt; begin for I := 0 to 14 do begin DirAddr := ImageDirectoryEntryToData(ImageInfo.MappedAddress, True, I, dwDirSize); if DirAddr = nil then Continue; ReadlDirAddr := NativeUint(ImageBase) + NativeUint(DirAddr) - NativeUint(ImageInfo.MappedAddress); if (ReadlDirAddr >= AddrStart) and (ReadlDirAddr < AddrEnd) then Writeln( IntToHex(ReadlDirAddr, 8), ': directory "', DirectoryStr[I], '"'); end; end; 

TLoadedImage, ImageDirectoryEntryToData , , , PE . , , , , ImageBase .

:


рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, msctf.dll рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ ".text" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрдпрд╛рдд / рдирд┐рд░реНрдпрд╛рдд / рд▓рдВрдмрд┐рдд рдЖрдпрд╛рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдЖрджрд┐ рд╣реИрдВред
рд╕рдВрд╕рд╛рдзрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ ".rsrc" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмреИрдарддреА рд╣реИ, рдФрд░ рд░рд┐рд▓реЗрдХреНрд╕ рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, "рдмрд╛рдЙрдВрдб_рдордкреЛрд░реНрдЯ" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдпреЛрдЬрдирд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

, , , .
, , , .

5. (PEB) + KUSER_SHARED_DATA


, , , , ?

, .

NtQueryInformationProcess ProcessBasicInformation ( ). PROCESS_BASIC_INFORMATION, PebBaseAddress PEB.

, ( ) . 64- 32-, 64- PEB, 32-.

Wow64PEB рдХреЛ 64-рдмрд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ) рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ NtWInformationProcess рдлрд╝рдВрдХреНрд╢рди рдХреЛ ProcessWow64Information рдкреИрд░рд╛рдореАрдЯрд░ (26 рдХреЗ рдмрд░рд╛рдмрд░ рдирд┐рд░рдВрддрд░) рдФрд░ Sizeff (ULONG_PTR) рдХреЗ рдмрд░рд╛рдмрд░ рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, PROCESS_BASIC_INFORMATION рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрдЬрд╛рдп, рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ 32-рдмрд┐рдЯ PEB рдореЗрдВ рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо ReadProcessMemory рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝реЗрдВрдЧреЗред

PEB рдХреНрдпрд╛ рд╣реИ?
, , , . , . , : BeingDebugged, ; PEB_LDR_DATA, ; , , :)

( Windows7 x86/64):

  PPEB = ^TPEB; TPEB = record InheritedAddressSpace: BOOLEAN; ReadImageFileExecOptions: BOOLEAN; BeingDebugged: BOOLEAN; BitField: BOOLEAN; { BOOLEAN ImageUsesLargePages : 1; BOOLEAN IsProtectedProcess : 1; BOOLEAN IsLegacyProcess : 1; BOOLEAN IsImageDynamicallyRelocated : 1; BOOLEAN SkipPatchingUser32Forwarders : 1; BOOLEAN IsPackagedProcess : 1; BOOLEAN IsAppContainer : 1; BOOLEAN SpareBits : 1; } Mutant: HANDLE; ImageBaseAddress: PVOID; LoaderData: PVOID; ProcessParameters: PRTL_USER_PROCESS_PARAMETERS; SubSystemData: PVOID; ProcessHeap: PVOID; FastPebLock: PRTLCriticalSection; AtlThunkSListPtr: PVOID; IFEOKey: PVOID; EnvironmentUpdateCount: ULONG; UserSharedInfoPtr: PVOID; SystemReserved: ULONG; AtlThunkSListPtr32: ULONG; ApiSetMap: PVOID; TlsExpansionCounter: ULONG; TlsBitmap: PVOID; TlsBitmapBits: array[0..1] of ULONG; ReadOnlySharedMemoryBase: PVOID; HotpatchInformation: PVOID; ReadOnlyStaticServerData: PPVOID; AnsiCodePageData: PVOID; OemCodePageData: PVOID; UnicodeCaseTableData: PVOID; KeNumberOfProcessors: ULONG; NtGlobalFlag: ULONG; CriticalSectionTimeout: LARGE_INTEGER; HeapSegmentReserve: SIZE_T; HeapSegmentCommit: SIZE_T; HeapDeCommitTotalFreeThreshold: SIZE_T; HeapDeCommitFreeBlockThreshold: SIZE_T; NumberOfHeaps: ULONG; MaximumNumberOfHeaps: ULONG; ProcessHeaps: PPVOID; GdiSharedHandleTable: PVOID; ProcessStarterHelper: PVOID; GdiDCAttributeList: ULONG; LoaderLock: PRTLCriticalSection; NtMajorVersion: ULONG; NtMinorVersion: ULONG; NtBuildNumber: USHORT; NtCSDVersion: USHORT; PlatformId: ULONG; Subsystem: ULONG; MajorSubsystemVersion: ULONG; MinorSubsystemVersion: ULONG; AffinityMask: ULONG_PTR; {$IFDEF WIN32} GdiHandleBuffer: array [0..33] of ULONG; {$ELSE} GdiHandleBuffer: array [0..59] of ULONG; {$ENDIF} PostProcessInitRoutine: PVOID; TlsExpansionBitmap: PVOID; TlsExpansionBitmapBits: array [0..31] of ULONG; SessionId: ULONG; AppCompatFlags: ULARGE_INTEGER; AppCompatFlagsUser: ULARGE_INTEGER; pShimData: PVOID; AppCompatInfo: PVOID; CSDVersion: UNICODE_STRING; ActivationContextData: PVOID; ProcessAssemblyStorageMap: PVOID; SystemDefaultActivationContextData: PVOID; SystemAssemblyStorageMap: PVOID; MinimumStackCommit: SIZE_T; FlsCallback: PPVOID; FlsListHead: LIST_ENTRY; FlsBitmap: PVOID; FlsBitmapBits: array [1..FLS_MAXIMUM_AVAILABLE div SizeOf(ULONG) * 8] of ULONG; FlsHighIndex: ULONG; WerRegistrationData: PVOID; WerShipAssertPtr: PVOID; pContextData: PVOID; pImageHeaderHash: PVOID; TracingFlags: ULONG; { ULONG HeapTracingEnabled : 1; ULONG CritSecTracingEnabled : 1; ULONG LibLoaderTracingEnabled : 1; ULONG SpareTracingBits : 29; } CsrServerReadOnlySharedMemoryBase: ULONGLONG; end; 

, , MSDN .

Window 2000/XP/2003 , .
, PEB ? , .

рддреЛ:


рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЗрддрдиреЗ рдкрд░ - рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЕрдкрдиреЗ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ProcessParameters рдЖрдорддреМрд░ рдкрд░ рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдвреЗрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмреИрдарддрд╛ рд╣реИ, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рднреА рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд╣реАрдВ рд╕реНрдерд┐рдд рд╣реИрдВред

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

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


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



рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╢рд╛рдпрдж, рд╣рдо рдпрд╣рд╛рдБ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ ...

6. рдЯреНрд░реЗрдЬрд┐рдпрдирдбреЙрдЯрд╛


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

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

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


рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА TRegionData рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕реЗ "MemoryMap.RegionData.pas" рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рд▓рдЧрднрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ (рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдХрдХреНрд╖рд╛ рдХреА рдШреЛрд╖рдгрд╛ рдмрджрд▓ рд╕рдХрддреА рд╣реИ)ред

  TRegionData = class private FParent: TRegionData; FRegionType: TRegionType; FMBI: TMemoryBasicInformation; FDetails: string; FRegionVisible: Boolean; FHiddenRegionCount: Integer; FTotalRegionSize: NativeUInt; FHeap: THeapData; FThread: TThreadData; FPEBData: TSystemData; FSection: TSection; FContains: TList; FDirectories: TList; FShared: Boolean; FSharedCount: Integer; FFiltered: Boolean; protected ... public constructor Create; destructor Destroy; override; property RegionType: TRegionType read FRegionType; property MBI: TMemoryBasicInformation read FMBI; property Details: string read FDetails; property RegionVisible: Boolean read FRegionVisible; property HiddenRegionCount: Integer read FHiddenRegionCount; property Parent: TRegionData read FParent; property TotalRegionSize: NativeUInt read FTotalRegionSize; property Heap: THeapData read FHeap; property Thread: TThreadData read FThread; property SystemData: TSystemData read FPEBData; property Section: TSection read FSection; property Directory: TList read FDirectories; property Contains: TList read FContains; end; 

рдХреНрд░рдо рдореЗрдВ:

рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдпрд╛рдиреАрдвреЗрд░ рдХреЗ рд▓рд┐рдП, рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдвреЗрд░, рдкреАрдИ рдлрд╛рдЗрд▓реЗрдВ, рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдХреНрд╖реЗрддреНрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрд╖реЗрддреНрд░ рдкреНрд░рдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдЬрдирд▓ рдЯрд╛рдЗрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдПрдХ рдПрдиреБрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  //   TRegionType = ( rtDefault, rtHeap, //     rtThread, //      TEB rtSystem, //     (PEB/KUSER_SHARED_DATA  ..) rtExecutableImage //     PE  ); 

, VirtualQueryEx MBI.

Details. , PE , , ID .тАж

.
(), .
RegionVisible , .
HiddenRegionCount (AllocationBase BaseAddress ).
Parent .
, , , , - :)

TotalRegionSize , .

, , Heap, :

  THeapEntry = record Address: ULONG_PTR; Size: SIZE_T; Flags: ULONG; end; THeapData = record ID: DWORD; Wow64: Boolean; Entry: THeapEntry; end; 

, , Contains.

Contains .

  TContainItemType = (itHeapBlock, itThreadData, itStackFrame, itSEHFrame, itSystem); TContainItem = record ItemType: TContainItemType; function Hash: string; case Integer of 0: (Heap: THeapData); 1: (ThreadData: TThreadData); 2: (StackFrame: TThreadStackEntry); 3: (SEH: TSEHEntry); 4: (System: TSystemData); end; 

Thread, , .

 type TThreadInfo = (tiNoData, tiExceptionList, tiStackBase, tiStackLimit, tiTEB, tiThreadProc); type TThreadData = record Flag: TThreadInfo; ThreadID: Integer; Address: Pointer; Wow64: Boolean; end; 

рдпрджрд┐ рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╡рд╛рд╣ рдбреЗрдЯрд╛ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SEH рдлрд╝реНрд░реЗрдо рдпрд╛ рдХреЙрд▓рд╕реНрдЯреИрдХ рдкреНрд░рд╡рд╛рд╣ рдХреА рдПрдХ рд╕реВрдЪреА), рддреЛ рдЙрдиреНрд╣реЗрдВ рднреА Contains рдлрд╝реАрд▓реНрдб рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

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

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

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

TMemoryMap рд╡рд░реНрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ ...

7. TMemoryMap


рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ "MemoryMap.Core.pas" рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рд╡рд╕реНрддреБрддрдГ рддреАрди рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдореЗрдВ рдШрдЯрд╛ рд╣реИ:

  1. рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрд╡реЗрджрди рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рднреА рдЪрдпрдирд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдереНрд░реЗрдбреНрд╕ / рд╣реАрдкреНрд╕ / рд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ, рдЖрджрд┐ рдкрд░ рдбреЗрдЯрд╛ред
  2. TRegionData рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднрд░рдирд╛ред
  3. рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ / рд▓реЛрдб рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ред

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

 function TMemoryMap.InitFromProcess(PID: Cardinal; const ProcessName: string): Boolean; var ProcessLock: TProcessLockHandleList; begin Result := False; FRegions.Clear; FModules.Clear; FFilter := fiNone; ProcessLock := nil; //     FProcess := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID); if FProcess = 0 then RaiseLastOSError; try FPID := PID; FProcessName := ProcessName; //    FProcess64 := False; {$IFDEF WIN64} if not IsWow64(FProcess) then FProcess64 := True; {$ELSE} //    32 ,    64- //   if Is64OS and not IsWow64(FProcess) then raise Exception.Create('Can''t scan process.'); {$ENDIF} //     if SuspendProcessBeforeScan then ProcessLock := SuspendProcess(PID); try FSymbols := TSymbols.Create(FProcess); try FPEImage := TPEImage.Create; try FWorkset := TWorkset.Create(FProcess);; try //        GetAllRegions; finally FWorkset.Free; end; {$IFDEF WIN64} //       32   AddWow64HeapsData; {$ENDIF} //     AddThreadsData; //     AddHeapsData; //    Process Environment Block AddPEBData; //     PE  AddImagesData; finally FPEImage.Free; end; finally FSymbols.Free; end; finally if SuspendProcessBeforeScan then ResumeProcess(ProcessLock); end; //  SortAllContainsBlocks; //      CalcTotal; //    UpdateRegionFilters; finally CloseHandle(FProcess); end; end; 

GetAllRegions/AddThreadsData/AddHeapsData AddImagesData , .

.
, , ( ), , .

:
  1. 32- 32- 32- .
  2. 64- 64- .
  3. 32- 64-.
  4. 32- 32- 64- , .
  5. 64- 32-, .

, .

32- 64- : , ReadProcessMemory ERROR_PARTIAL_COPY.

32- 64- .
, 32- 64- , /.

32- , 32 , 64- .

64-рдмрд┐рдЯ рд╡рд╛рд▓реЗ рд╕реЗ 32-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА, рдХреЗрд╡рд▓ 64 рдмрд┐рдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ 32-рдмрд┐рдЯ PEB рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдИ рдЧрдИ рд╣реИ:

 const ProcessWow64Information = 26; ... NtQueryInformationProcess(FProcess, ProcessWow64Information, @FPebWow64BaseAddress, SizeOf(ULONG_PTR), @ReturnLength) 

32-рдмрд┐рдЯ рдЯреАрдИрдмреА рддрдХ рдкрд╣реБрдВрдЪ 64-рдмрд┐рдЯ рдЯреАрдИрдмреА рд╕реЗ рдкрддреЗ рдХреЛ рдкрдврд╝рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ NtTIB.ExceptionList рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред

  //  64  TEB  TIB.ExceptionList    Wow64TEB if not ReadProcessMemory(hProcess, TIB.ExceptionList, @WOW64_NT_TIB, SizeOf(TWOW64_NT_TIB), lpNumberOfBytesRead) then Exit; 

рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЙрд▓рд╕реНрдЯреИрдХ рдкреНрд░рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП 32-рдмрд┐рдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 const ThreadWow64Context = 29; ... ThreadContext^.ContextFlags := CONTEXT_FULL; if NtQueryInformationThread(hThread, ThreadWow64Context, ThreadContext, SizeOf(TWow64Context), nil) <> STATUS_SUCCESS then Exit; 

рдпрд╛ Wow64GetThreadContext рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗред

рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХрд╛рдиреВрдиреА рддрд░реАрдХреЗ рд╕реЗ 64-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ 32-рдмрд┐рдЯ рд╣реАрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдЕрдм рдореИрдВ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ 32-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬ рд░рд╣рд╛ рд╣реИ, рдЬреЛ 32-рдмрд┐рдЯ рд╣реАрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 64-рдмрд┐рдЯ рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИ (рдпрд╣ AddWow64HeapsData рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХрд░рддрд╛ рд╣реИ)ред

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

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

рдПрдХ рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдардВрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рддреАрди рд╕рд╣рд╛рдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред

  1. TSymbols - рдореИрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред
  2. TPEImage - рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЪреМрдереЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреАрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
  3. TWorkset рдПрдХ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, TWorkset рдлреЙрд░реНрдо рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:

  TShareInfo = record Shared: Boolean; SharedCount: Byte; end; 

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


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

 procedure TWorkset.InitWorksetData(hProcess: THandle); const {$IFDEF WIN64} AddrMask = $FFFFFFFFFFFFF000; {$ELSE} AddrMask = $FFFFF000; {$ENDIF} SharedBitMask = $100; SharedCountMask = $E0; function GetSharedCount(Value: ULONG_PTR): Byte; inline; begin Result := (Value and SharedCountMask) shr 5; end; var WorksetBuff: array of ULONG_PTR; I: Integer; ShareInfo: TShareInfo; begin SetLength(WorksetBuff, $400000); while not QueryWorkingSet(hProcess, @WorksetBuff[0], Length(WorksetBuff) * SizeOf(ULONG_PTR)) do SetLength(WorksetBuff, WorksetBuff[0] * 2); for I := 0 to WorksetBuff[0] - 1 do begin ShareInfo.Shared := WorksetBuff[I] and SharedBitMask <> 0; ShareInfo.SharedCount := GetSharedCount(WorksetBuff[I]); try FData.Add(Pointer(WorksetBuff[I] and AddrMask), ShareInfo); except on E: EListError do ; else raise; end; end; end; 

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕реВрдЪрдирд╛ рд╡рд░реНрдЧ рд╣реИ, рдЕрдзрд┐рдХ рдирд╣реАрдВ, рдХрдо рдирд╣реАрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред
рдЕрдЧрд▓реЗ рдЪрд░рдг рд╣реИрдВ:

  1. GetAllRegions рдкрд╣рд▓реЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
  2. AddThreadsData рджреВрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рдХреЗ рдХреЛрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
  3. AddHeapsData рддреАрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
  4. AddPEBData - рдкрд╛рдВрдЪрд╡реЗрдВ рдЕрдзреНрдпрд╛рдп рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрдиред
  5. AddImagesData рдЪреМрдереЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк (рд▓рдЧрднрдЧ) рдмрддрд╛рдпрд╛ рдерд╛ :)

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдХреЗ рдХреЛрдб рд╕реЗ рд╣реА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:

 var AMemoryMap: TMemoryMap; M: TMemoryStream; I: Integer; begin try M := TMemoryStream.Create; try //   AMemoryMap := TMemoryMap.Create; try //     AMemoryMap.InitFromProcess(GetCurrentProcessId, ''); //  , AMemoryMap.SaveToStream(M); //           finally AMemoryMap.Free; end; //     -,      M.Position := 0; //   AMemoryMap := TMemoryMap.Create; try //   AMemoryMap.LoadFromStream(M); //     AMemoryMap.Filter := fiNone; //   //       AMemoryMap.ShowEmpty := True; //    for I := 0 to AMemoryMap.Count - 1 do Writeln(NativeUInt(AMemoryMap[I].MBI.BaseAddress)); finally AMemoryMap.Free; end; finally M.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. 

рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдирд╛рд╢рдкрд╛рддреА рдХреА рддрд░рд╣ рдЖрд╕рд╛рди рд╣реИ :)

8. TSymbols - рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ


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


рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рд┐рд░реНрдл SymGetSymFromAddr рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред

рдЖрдЗрдП рдкрд╣рд▓реЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

 function TSymbols.GetDescriptionAtAddr(Address, BaseAddress: ULONG_PTR; const ModuleName: string): string; const BuffSize = $7FF; {$IFDEF WIN64} SizeOfStruct = SizeOf(TImagehlpSymbol64); MaxNameLength = BuffSize - SizeOfStruct; var Symbol: PImagehlpSymbol64; Displacement: DWORD64; {$ELSE} SizeOfStruct = SizeOf(TImagehlpSymbol); MaxNameLength = BuffSize - SizeOfStruct; var Symbol: PImagehlpSymbol; Displacement: DWORD; {$ENDIF} begin Result := ''; if not FInited then Exit; GetMem(Symbol, BuffSize); try Symbol^.SizeOfStruct := SizeOfStruct; Symbol^.MaxNameLength := MaxNameLength; Symbol^.Size := 0; SymLoadModule(FProcess, 0, PAnsiChar(AnsiString(ModuleName)), nil, BaseAddress, 0); try if SymGetSymFromAddr(FProcess, Address, @Displacement, Symbol) then Result := string(PAnsiChar(@(Symbol^).Name[0])) + ' + 0x' + IntToHex(Displacement, 4) else begin //        SymLoadModule(FProcess, 0, PAnsiChar(AnsiString(ModuleName)), nil, BaseAddress, 0); if SymGetSymFromAddr(FProcess, Address, @Displacement, Symbol) then Result := string(PAnsiChar(@(Symbol^).Name[0])) + ' + 0x' + IntToHex(Displacement, 4); end; finally SymUnloadModule(FProcess, BaseAddress); end; finally FreeMem(Symbol); end; if Result = '' then Result := ExtractFileName(ModuleName) + ' + 0x' + IntToHex(Address - BaseAddress, 1); end; 

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

рджреВрд╕рд░рд╛ рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рд╣реИ рдХрд┐ SymGetSymFromAddr рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреЙрд▓ рдХрднреА-рдХрднреА рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХрд╛рд░рдг рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕реЗ SymLoadModule рдлрд╝рдВрдХреНрд╢рди рдХреЛ SymUnloadModule рдХрд╣реЗ рдмрд┐рдирд╛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╕рдордЭ рдирд╣реАрдВ рдереА - рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

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

рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдХ рдХреНрд░реЛрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреИрдХ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (CallStack + SEH рдлреНрд░реЗрдо):


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

 function SymEnumsymbolsCallback(SymbolName: LPSTR; SymbolAddress: ULONG_PTR; SymbolSize: ULONG; UserContext: Pointer): Bool; stdcall; var List: TStringList; begin List := UserContext; List.AddObject(string(SymbolName), Pointer(SymbolAddress)); Result := True; end; procedure TSymbols.GetExportFuncList(const ModuleName: string; BaseAddress: ULONG_PTR; Value: TStringList); begin SymLoadModule(FProcess, 0, PAnsiChar(AnsiString(ModuleName)), nil, BaseAddress, 0); try if not SymEnumerateSymbols(FProcess, BaseAddress, @SymEnumsymbolsCallback, Value) then begin SymLoadModule(FProcess, 0, PAnsiChar(AnsiString(ModuleName)), nil, BaseAddress, 0); SymEnumerateSymbols(FProcess, BaseAddress, @SymEnumsymbolsCallback, Value) end; finally SymUnloadModule(FProcess, BaseAddress); end; end; 

рдпрд╣ рд╕рднреА SymEnumerateSymbols рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ, рдЬреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдЬрдм рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ SymbolName рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛, рдФрд░ SymbolAddress рдЗрд╕рдХрд╛ рдкрддрд╛ред

рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреЗрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:


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

9. ProcessMemoryMap


.
, MemoryMap :

1. EurekaLog OnAttachedFilesRequest, , Private (, , MEM_PRIVATE) , PEB. .
2. .

, MemoryMap, .


рдореИрдВ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдереЛрдбрд╝рд╛ рдЪрд▓реВрдВрдЧрд╛ред

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

рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рд╣реИ, рдпрд╣ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рднреА рд╣реИред

рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:

1. рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рд╕реНрдореГрддрд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рджреЗрдЦреЗрдВ (Ctrl + Q)ред


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


рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдмреНрд▓реЙрдХ рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:


рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЗрддрдиреЗ рдкрд░ред :


, .

2. (Ctrl+F):


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

3. рджреЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХрд╛ рддреБрд▓рдирд┐рддреНрд░ред рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЖрдкрдХреЛ рджреЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред


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

4. рдПрдХ рдореЗрдореЛрд░реА рдбрдВрдкред

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

5. рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рд▓реЛрдб + рдИ) рдореЗрдВ рднрд░реА рд╣реБрдИ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдирд┐рд░реНрдпрд╛рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯред


рд╕рд╛рде рд╣реА рдЕрдкрдиреЗ рдирд╛рдо рдпрд╛ рдкрддреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред

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

ProcessMemoryMap рдПрдХ OpenSource рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред
рдЗрд╕рдХреА рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд░рд┐рд▓реАрдЬ рд╣рдореЗрд╢рд╛ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреА рд╣реИ: http://rouse.drkb.ru/winapi.php#pmm2
GitHub рдирд╡реАрдирддрдо рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/AlexanderBagelel-ProcessMemoryMap

рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ : https://github.com/AlexanderBagel/ProcessMemoryMap/archive/master.zip
рдирд╡реАрдирддрдо рдмрд┐рд▓реНрдб рдХрд╛ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ: http://rouse.drkb.ru/files/processmm_bin.zip

рд╕реНрд╡-рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдЯреНрд░реАрд╡реНрдпреВ рд╕рдВрд╕реНрдХрд░рдг 5 рдФрд░ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: http://www.soft-gems.net/ ред

рдЕрд╕реЗрдВрдмрд▓реА рдбреЗрд▓реНрдлреА XE4 рдФрд░ "Win32 / рд░рд┐рд▓реАрдЬрд╝" рдореЛрдб рдореЗрдВ рдЙрдЪреНрдЪрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ 64-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдФрд░ рдЬреБрдбрд╝рд╛ рд╣реЛрдЧрд╛ (рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ)ред
рдбреЗрд▓реНрдлреА рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рддрд╣рдд, ProcessMemoryMap рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

10. рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


, . , , , , .

, .

TEB/PEB .. :
http://processhacker.sourceforge.net/
http://redplait.blogspot.ru/
http://www.reactos.org/ru

PE :
http://msdn.microsoft.com/en-us/magazine/ms809762.aspx

SEH:
http://msdn.microsoft.com/en-us/library/ms680657(v=VS.85).aspx
http://www.microsoft.com/msj/0197/exception/exception.aspx
http://qxov.narod.ru/articles/seh/seh.html

- .

┬л ┬╗ .

aka ┬л ┬╗, aka ┬лInovet┬╗, aka ┬л┬╗.

рд╕реМрднрд╛рдЧреНрдп рд╣реИред

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


All Articles