ntqueryinformationprocess 예제
다음 코드는 NtGlobalFlag 플래그 검사를 기반으로 하는 디버깅 방지 보호의 예입니다. 여기서는 상위 프로세스의 이름을 얻고 인기있는 디버거의 이름과 비교해야합니다. 다음은 이러한 디버깅 방지 검사의 예입니다: 트랩 플래그(TF)는 EFLAGS 레지스터 안에 있습니다. TF가 1로 설정된 경우 CPU는 각 명령 실행 후 INT 01h 또는 “단일 단계” 예외를 생성합니다. 다음 디버깅 방지 예제는 TF 설정 및 예외 호출 검사를 기반으로 합니다. 이 처리기에 대한 포인터는 처리기 체인의 시작 부분에 배치됩니다. 그런 다음 int 3h 중단이 생성됩니다. 응용 프로그램이 디버깅되지 않으면 컨트롤이 SEH 처리기로 전송되고 g_isDebuggerPresent 값이 FALSE로 설정됩니다. ContextRecord->Eip += 1 줄은 실행 흐름에서 다음 명령의 주소를 변경하여 int 3h 후에 명령이 실행됩니다. 그런 다음 코드는 원래 SEH 처리기를 반환하고 스택을 지우고 디버거가 있는지 확인합니다.
_HEAP 구조는 문서화되지 않았으며 플래그 및 ForceFlags 필드의 오프셋 값은 운영 체제 버전에 따라 다를 수 있습니다. 다음 코드는 힙 플래그 검사를 기반으로 한 디버깅 방지 보호 예제를 보여 줍니다. 당신은 “안녕하세요”대신 원래 명령 줄있어, 그것은 GetCommandLineA의 경우 아니다, 그것은 당신이 말한 것처럼 다른 주소에 저장되기 때문에. 응용 프로그램이 디버깅되는 경우 int 3시간 중단 생성 후 디버거에 의해 제어가 차단됩니다. 그렇지 않으면 컨트롤이 SEH 처리기로 전송됩니다. 다음 코드 예제에서는 SEH 프레임 기반 디버깅 방지 보호: IA-32 아키텍처에서는 디버그 핸들을 호출하는 데 사용되는 0xCC opcode가 있는 int 3h라는 특정 명령이 있습니다. CPU가 이 명령을 실행하면 중단이 생성되고 컨트롤이 디버거로 전송됩니다. 제어를 얻으려면 디버거는 int 3h 명령을 코드에 삽입해야 합니다. 중단점을 감지하기 위해 함수의 체크섬을 계산할 수 있습니다. 다음은 역방향 엔지니어링 기술에 관심이 있는 모든 소프트웨어 개발자 및 리버스 엔지니어를 위한 것입니다. 여기에 언급된 모든 예제 및 디버깅 방지 기술을 이해하려면 어셈블러 지식, 일부 WinDbg 환경 및 API 함수를 사용하여 Windows용 개발 경험이 필요합니다.
실행 형에는 시스템 로더에 대한 추가 구성 매개 변수가 포함된 IMAGE_LOAD_CONFIG_DIRECTORY 구조가 포함될 수 있습니다. 이 구조는 기본적으로 실행 에 내장되지 않지만 패치를 사용하여 추가할 수 있습니다. 이 구조에는 PEB 구조의 NtGlobalFlag 필드의 플래그를 다시 설정해야 하는 것을 나타내는 GlobalFlagsClear 필드가 있습니다. 실행 하는 것이 처음 언급 된 구조 없이 또는 GlobalFlagsClear = 0으로 처음 만들어진 경우, 디스크 또는 메모리에 있는 동안, 필드는 숨겨진된 디버거 가 작동 하는 것을 나타내는 0 이 아닌 값을 갖습니다. 아래 코드 예제에서는 실행 중인 프로세스의 메모리와 디스크에서 GlobalFlagsClear 필드를 확인하여 인기 있는 디버깅 기술 중 하나를 설명합니다. ContextFlags 구조의 컨텍스트 플래그 필드에 플래그를 표시 하 고 원래 NtGetContextThread 함수 호출 후 해당 값을 복원 합니다.