2009-06-11 20 views
6

미리 정의 된 주소에 도달하면 원격 프로세스 스레드가 중단 (해당 스레드에서 실행 중지)하게하는 프로그램을 Windows에 작성할 수 있습니까?아주 기본적인 디버거 작성

나는 Windows Debug API를 실험 해 왔지만 중단 점 설정과 관련하여 매우 제한적으로 보입니다. DebugBreakProcess 함수가 유망 해 보였지만이 API 호출을 사용하는 방법에 대한 예제를 찾을 수 없습니다.

답변

12

주소에 중단 점 (x86에서 0xCC의 opcode)을 쓰려면 WriteProcessMemory를 사용해야합니다. x86에서 디버거가 코드의 해당 지점에 도달하면 0xCC는 int 3 예외를 생성합니다. 이것은 디버거의 WaitForDebugEvent에 의해 선택되며 EXCEPTION_DEBUG_EVENT가 설정된 DEBUG_EVENT를 반환합니다.

그런 다음 계속하기 전에 해당 주소를 원래 코드로 다시 패치해야합니다. 다시 중단하려면 한 단계 씩 실행 한 다음 중단 점 opcode를 다시 패치해야합니다. 단일 단계를 수행하려면 스레드 컨텍스트의 EFlag에서 단일 단계 플래그를 설정해야합니다.

DebugBreakProcess는 디버깅중인 프로세스의 원격 중단을 생성하는 데 사용되며 코드의 임의의 지점에서 중단 할 수 없습니다.

+0

다음과 같이 할 수 있습니다. 1. 미리 정의 된 주소 (PA)에서 현재 연산을 읽고 을 저장하십시오. 2. op를 0xCC 및 NOPS로 대체하여 int 3 예외를 생성하십시오 (int 3 예외가 자동으로 발생합니까? 실행을 중지하겠습니까?) 3. EXCEPTION_DEBUG_EVENT를 잡으십시오. 4. 스레드의 실행이 올바르게 중지되었지만 일부 코드가 바뀌 었으며 예기치 않은 결과가 발생합니다. PA에서 저장된 OP를 다시 쓸 수는 있었지만 이미 너무 늦지 않았습니까? 대신 원격 스레드가 OP를 수동으로 실행하도록 할 수 있습니까? – ldog

+1

패치를 적용하기에는 너무 늦지 않을 것입니다. 타겟 IP는 변경되지 않았으며, 코드를 변경하지 않으면 디버거가 예외를 재발급합니다. – Michael

+0

패치를 적용하는 데 문제가 있습니다. 브레이크 포인트를 설정할 수는 있지만 브레이크 포인트 예외를 잡을 수는 있지만 원래의 opcode를 다시 쓰려고 WriteProcessMemory를 시도하면 프로그램이 코드를 올바르게 실행하지 못한다는 액세스 제어 예외가 발생합니다. WriteProcessMemory 후에 FlushInstructionCache를 수행하지만 도움이되지 않습니다. – ldog

1

마이클이 맞습니다 - 또한 일단 연결 한 경우 디버거에서 임의의 프로세스에 침입하려는 경우 (예 : 사용자가 "프로세스에 돌입"하는 경우) 표준 방법은 루틴이 int3를 발행하는 원격 스레드.

+0

DebugBreakProcess가 중단 된 원격 스레드를 만드는 것으로 나타납니다. – Michael

+0

오 예, 그렇다면 CreateRemoteThread를 올바르게 사용하는 것은 매우 까다 롭습니다. –

관련 문제