рдореИрдиреБрдЕрд▓ рдХрд░реНрд╖рдг рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБ (x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП)

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





рдирд┐рд░реНрджреЗрд╢ рд╡рд┐рд░рд╛рдо





[рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ , рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛]



рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдЕрдВрджрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЛрдб рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ int 3



рдирд┐рд░реНрджреЗрд╢ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╡реНрдпрд╡рдзрд╛рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд┐ OS рдХрд╛ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдмрджрд▓реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд SIGTRAP рд╕рд┐рдЧреНрдирд▓ рдореЗрдВред рдирд┐: рд╢реБрд▓реНрдХ рддреИрд░рд╛рдХреА рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕ int 3



рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧрд░ рдЗрд╕ рд╕рдВрдХреЗрдд рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред



рд╡реИрд╕реЗ, рдбрд┐рдмрдЧрд░реНрд╕ рд╕реНрд╡рдпрдВ рднреА рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдмрд╕ рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмреНрд░реЗрдХ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕реАрд▓рд┐рдП int 3



рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ ( 0xCC



) рдХреЗ рд╕рд╛рде рдПрдирдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреЛ рдирд╣реАрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо 0xCD imm8



int X



( 0xCD imm8



) рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдХреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рддрд░рд╣ - рдЕрдиреНрдпрдерд╛ int 3



рд╕рд┐рдВрдЧрд▓-рдмрд╛рдЗрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред



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



( 0x90



) рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрджрд▓реЗрдВред



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



рдкрд╣реБрдВрдЪ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБ





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



рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЙрдирдХреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ



void SetAccessBreak(void* addr);







рдпрд╣рд╛рдВ, рдЕрдЪреНрдЫреЗ dr0



рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдП рдЧрдП рдбрд┐рдмрдЧ рд░рдЬрд┐рд╕реНрдЯрд░ dr0



, dr1



, dr2



, dr3



рдФрд░ рдЙрдирдХреЗ рдЪрд╛рдЪрд╛ рдЪреЗрд░реНрдиреЛрдореЛрд░ dr7



, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдЭрдВрдбреЗ рд╣реЛрддреЗ рд╣реИрдВред



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



- dr3



рдЙрд╕ рдкрддреЗ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ dr7



рдЙрдкрдпреБрдХреНрдд рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдШрдЯрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ (рдирд┐рд╖реНрдкрд╛рджрд┐рдд / рдкрдврд╝реЗрдВ / рдкрдврд╝реЗрдВ рдпрд╛ рд▓рд┐рдЦрд┐рдП рдЗрд╕ рдкрддреЗ рдкрд░), рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ (1 рдмрд╛рдЗрдЯ, 2 рдмрд╛рдЗрдЯреНрд╕, 4 рдмрд╛рдЗрдЯреНрд╕, 8 рдмрд╛рдЗрдЯреНрд╕)ред рдзреНрд╡рдЬ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдореМрдЦрд┐рдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рд╕реНрдерд╛рди рдХреЛ рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд рджреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХреЛрдб рджреВрдВрдЧрд╛: MakeFlags



, рдЬреЛ dr7



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



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



enum DebugRegister { <br/>

kDR0 = 0 ,<br/>

kDR1 = 2 ,<br/>

kDR2 = 4 ,<br/>

kDR3 = 6 <br/>

} ; <br/>

<br/>

enum BreakState { <br/>

kDisabled = 0 , // disabled - 00 <br/>

kEnabledLocally = 1 , // task local - 01 <br/>

kEnabledGlobally = 2 , // global - 10 <br/>

kBreakStateMask = 3 // mask 11 <br/>

} ; <br/>

<br/>

enum Condition { <br/>

kWhenExecuted = 0 , // on execution - 00 <br/>

kWhenWritten = 1 , // on write - 01 <br/>

kWhenWrittenOrReaden = 3 , // on read or write - 11 <br/>

kConditionMask = 3 // mask 11 <br/>

} ; <br/>

<br/>

enum Size { <br/>

kByte = 0 , // 1 byte - 00 <br/>

kHalfWord = 1 , // 2 bytes - 01 <br/>

kWord = 3 , // 4 bytes - 11 <br/>

kDoubleWord = 2 , // 5 bytes - 10 <br/>

kSizeMask = 3 // mask 11 <br/>

} ; <br/>

<br/>

<br/>

uint32_t MakeFlags ( DebugRegister reg, BreakState state, Condition cond, Size size ) { <br/>

return ( state | cond << 16 | size << 24 ) << reg ; <br/>

} <br/>

<br/>

<br/>

uint32_t MakeMask ( DebugRegister reg ) { <br/>

return MakeFlags ( reg, kBreakStateMask, kConditionMask, kSizeMask ) ; <br/>

} <br/>









рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛ рдмрддрд╛рдП рдкрд╛рдиреА рдореЗрдВ рднрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд░рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рд╛рде SetAccessBreak



рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



bool SetAccessBreak ( void * addr,<br/>

DebugRegister reg,<br/>

Condition cond,<br/>

Size size ) { <br/>

const uint32_t control = MakeFlags ( reg, kEnabledLocally, cond, size ) ; <br/>

__asm__ ( "movl %0, %%dr0 \n " <br/>

"movl %1, %%dr7 \n " : : "r" ( addr ) , "r" ( control ) : ) ; <br/>

}








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



/ thread_set_state



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



рд▓рд╛рдЧреВ SetAccessBreak



:



bool SetAccessBreak ( pthread_t target_thread,<br/>

void * addr,<br/>

DebugRegister reg,<br/>

Condition cond,<br/>

Size size ) { <br/>

x86_debug_state dr ; <br/>

mach_msg_type_number_t dr_count = x86_DEBUG_STATE_COUNT ; <br/>

<br/>

// POSIX MACH . <br/>

mach_port_t target_mach_thread = pthread_mach_thread_np ( target_thread ) ; <br/>

<br/>

// . <br/>

kern_return_t rc = thread_get_state ( target_mach_thread,<br/>

x86_DEBUG_STATE,<br/>

reinterpret_cast < thread_state_t > ( & dr ) ,<br/>

& dr_count ) ; <br/>

<br/>

// <br/>

if ( rc ! = KERN_SUCCESS ) return false ; <br/>

<br/>

// , . <br/>

switch ( reg ) { <br/>

case kDR0 : dr. uds . ds32 .__dr0 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>

case kDR1 : dr. uds . ds32 .__dr1 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>

case kDR2 : dr. uds . ds32 .__dr2 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>

case kDR3 : dr. uds . ds32 .__dr3 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>

} <br/>

<br/>

// . <br/>

dr. uds . ds32 .__dr7 & = ~MakeMask ( reg ) ; <br/>

<br/>

// . <br/>

dr. uds . ds32 .__dr7 | = MakeFlags ( reg, kEnabledLocally, cond, size ) ; <br/>

<br/>

// . <br/>

rc = thread_set_state ( target_mach_thread,<br/>

x86_DEBUG_STATE,<br/>

reinterpret_cast < thread_state_t > ( & dr ) ,<br/>

dr_count ) ; <br/>

<br/>

// . <br/>

if ( rc ! = KERN_SUCCESS ) return false ; <br/>

<br/>

// . <br/>

return true ; <br/>

}








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



static int16_t foo = 0 ; <br/>

static int32_t bar = 0 ; <br/>

<br/>

int main ( int argc, char * argv [ ] ) { <br/>

foo = 1 ; <br/>

bar = 1 ; <br/>

SetAccessBreak ( pthread_self ( ) , & bar, kDR0, kWhenWritten, kWord ) ; <br/>

foo = 2 ; <br/>

bar = 2 ; <br/>

SetAccessBreak ( pthread_self ( ) , & foo, kDR0, kWhenWritten, kHalfWord ) ; <br/>

foo = 3 ; <br/>

bar = 3 ; <br/>

return 0 ; <br/>

} <br/>









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



(gdb) r

Starting program: /Users/mraleph/test

Reading symbols for shared libraries +++. done



Program received signal SIGTRAP, Trace/breakpoint trap.

main (argc=1, argv=0xbffff9f8) at test.cc:107

106 bar = 2; <= triggered SIGTRAP -- mr.aleph

107 SetAccessBreak(pthread_self(), &foo, kDR0, kWhenWritten, kHalfWord);

(gdb) c

Continuing.



Program received signal SIGTRAP, Trace/breakpoint trap.

main (argc=1, argv=0xbffff9f8) at test.cc:109

108 foo = 3; <= triggered SIGTRAP -- mr.aleph

109 bar = 3;

(gdb) c

Continuing.



Program exited normally.








All Articles