2012-01-20 6 views
8

고정밀 타이머를 사용하여 정수를 0으로 나누는 데 걸리는 시간을 측정하여 디버거가 기본 Windows 프로세스에 연결되는지 여부를 감지 할 수 있습니까?0으로 Div를 사용하여 프로세스에 연결된 디버거를 감지 할 수 있습니까?

디버거가 연결되어 있지 않으면 하드웨어로 처리되어 매우 빠르다는 단점이 있습니다. 디버거가 연결되면 소프트 결함이 발생합니다. 소프트 결함은 OS 및 결국 디버거로 전달됩니다. 이것은 상대적으로 느립니다. 당신은 리버스 코드 엔지니어링에서 결정 사람을 방지하기 위해 할 수있는 일은 절대적으로 존재하지 않기 때문에

+1

시도해 보셨습니까? –

+2

나는 그것을 시도했다. 나는 통계적으로 상관 관계가 있다고 생각하지만, 다른 하드웨어에서 얼마나 오래 걸릴지에 대한 한계점을 선택하기가 어렵 기 때문에 안정적으로 사용할 수는 없습니다. –

+3

그리고 그 순간에 인터럽트가 도착했다면 어떻게 될까요? 컨텍스트 스위치는 어때? 기껏해야 당신은 확률 론적 결과를 얻을 것입니다. –

답변

1

리버스 엔지니어가 사용하는 대부분의 디버거에는 디버거가 남긴 마크의 99 %를 영향을주는 (제거하는) 방법이 있지만 대부분의 디버거는 예외 필터링을 제공하므로 속도 차이가 감지되지 않습니다.

디버거가 처음부터 연결되는 것을 방지하는 데 더 많은 생산성을 제공하지만 장기간에 걸쳐 필요한 노력 투자를 실현할 수 없다면 앞으로 나아지지 않을 것입니다.

4

, 당신이 찾아 더 현명한 접근 방법은 단순히 프로세스를 호스트 할 IsDebuggerPresent()

+0

코드를 리버스 엔지니어링하는 사람은 단순히 시간을 숨기는 가상화 된 타이머를 제공 할 수 있습니다 디버거에서 ... –

+0

... 또는 0으로 느린 나누기 감지시 수행 할 작업이 무엇이든 제거하거나 ... 0으로 자체 나누기를 제거하거나 ... 그냥 분해 된 코드를 읽습니다. 또는 리버스 엔지니어링의 가치가있는 애플리케이션에 시간을 낭비하지 않아도됩니다. –

+2

예, 명확한 접근법을 사용하고'IsDebuggerPresent'를 호출하면 무엇이 잘못되었는지 명확하지 않습니다. 누군가는 그것에 대해 논평했지만, 질문자는 단지 화 났고 대신 그를 "아무도"라고 불렀습니다. –

3

아니요 충분히 판단 공격자를 호출하는 것보다 훨씬 더 나은 수 없습니다 VM에 넣고 그런 식으로 깨세요.

또한 디버거를 연결하여 프로그램을 공격 할 필요가 없습니다. 미니 덤프를 잡으면 오프라인 상태를 검사 할 수 있습니다. process explorer을 사용하면 열려있는 핸들을 검사하여 취약한 파일을 확인할 수 있습니다.

예외를 사용하여 순진 디버거가 연결되었는지 확인하려면 INT_MIN/-1을 개인적으로 사용하여 정수 오버플로 예외를 트리거해야합니다. 대부분은 그 사실을 모른다.

+1

0이나 'INT_MIN/-1'에 의한 나눗셈을 수행하는 것은 실제로 (C에서) 중요하지 않다는 것을 알아야합니다. UB이기 때문에 컴파일러가 컴파일 타임에 일어날 수있는 것을 감지 할 수있는 한 자유롭게 최적화하거나 원하는대로 할 수 있습니다 ... 컴파일러에서 비헤이비어를 숨기려면 흔히 일부러 뛰어 넘어야합니다. ... –

+0

x86에서 동일한 예외 (#DE)가 0과 INT_MIN/-1로 나눌 때 생성됩니다. –

+0

@R .. : 분자 또는 분모를 휘발성 변수에 저장하고 대부분의 컴파일러는 나눗셈을위한 코드를 생성합니다. –

관련 문제