문제

이전 고용주에서 우리는 기본적으로 DLL과 헤더 파일 인 타사 구성 요소를 사용했습니다. 특정 모듈은 Win32에서 인쇄를 처리했습니다. 그러나 구성 요소를 만든 회사는 BankCrup으로 갔기 때문에 내가 찾은 버그를보고 할 수 없었습니다.

그래서 나는 버그를 직접 수정하기로 결정하고 디버거를 시작했습니다. 거의 모든 곳에서 방지 코드를 발견 한 것에 놀랐습니다. IsDebuggerPresent, 그러나 내 관심을 끌었던 것은 다음과 같습니다.

    ; some twiddling with xor 
    ; and data, result in eax 
    jmp eax 
    mov eax, 0x310fac09 
    ; rest of code here 

언뜻보기에 나는 방금 두 번 불리는 루틴을 밟았다. 잠시 후 나는 비트 twiddling 결과가 항상 동일하다는 것을 깨달았습니다. 즉, JMP EAX는 항상 바로 뛰어 들었습니다. mov eax, 0x310fac09 지침. 나는 바이트를 해부했고 거기에 있었다. 0f31,, rdtsc DLL의 일부 호출 사이의 시간을 측정하는 데 사용 된 지침.

그래서 내 질문은 다음과 같습니다. 가장 좋아하는 방지 방지 트릭은 무엇입니까?

도움이 되었습니까?

해결책

내가 가장 좋아하는 트릭은 모호한 마이크로 프로세서를 위해 간단한 명령 에뮬레이터를 작성하는 것입니다.

그런 다음 사본 보호 및 일부 핵심 기능이 마이크로 프로세서 (GCC는 큰 도움이됩니다)를 편집하고 이진 블로브로 프로그램에 연결됩니다.

이에 대한 아이디어는 사본 보호가 일반 x86 코드에 존재하지 않아서 분해 될 수 없다는 것입니다. 프로그램에서 핵심 기능을 제거하기 때문에 전체 에뮬레이터를 제거 할 수 없습니다.

이 프로그램을 해킹 할 수있는 유일한 기회는 마이크로 프로세서 에뮬레이터가하는 일을 리버스 엔지니어링하는 것입니다.

에뮬레이션에 MIPS32를 사용했습니다 (500 줄의 간단한 C 코드가 필요했습니다). 물건을 더욱 모호하게 만들기 위해 Raw MIPS32 Opcodes를 사용하지 않았습니다. 대신 각 Opcode는 자체 주소로 xor'ed되었습니다.

사본 보호의 이진은 쓰레기 데이터처럼 보였습니다.

추천! 균열이 나오기까지 6 개월 이상 걸렸습니다 (게임 프로젝트를위한 것이 었습니다).

다른 팁

나는 많은 RCE 커뮤니티의 회원이었고 해킹 및 크래킹에 대한 공평한 점유율을 가졌습니다. 내 시간부터 나는 그러한 어색한 속임수가 일반적으로 변동적이고 다소 쓸모가 없다는 것을 깨달았습니다. 일반적인 방지 트릭의 대부분은 OS에 따라 다르며 '휴대용'이 아닙니다.

앞서 언급 한 예에서는 아마도 인라인 어셈블리와 naked 기능 __declspec, X64 아키텍처에서 컴파일 할 때 MSVC가 지원하지 않는 두 가지. 물론 앞서 언급 한 트릭을 구현하는 방법이 여전히 있지만, 오랫동안 반전 한 사람은 몇 분 안에 그 속임수를 발견하고 물리 칠 수 있습니다.

그래서 일반적으로 나는 사용하는 것 외부에서 방지 방지 트릭을 사용하는 것에 대해 제안합니다. IsDebuggerPresent 탐지를위한 API. 대신, 나는 당신이 스터브 및/또는 가상 머신을 코딩하는 것이 좋습니다. 나는 내 자신의 가상 머신을 코딩하고 지금 몇 년 동안 그것을 개선 해 왔으며 지금까지 내 코드를 보호하는 것과 관련하여 내가 한 최고의 결정이라고 솔직히 말할 수 있습니다.

부모에게 디버거로 첨부하고 주요 변수를 수정하는 아동 프로세스를 분사합니다. 아동 프로세스 거주지를 유지하고 디버거 메모리 작업을 특정 주요 작업을위한 일종의 IPC로 사용하기위한 보너스 포인트.

내 시스템에서는 두 개의 디버거를 동일한 프로세스에 첨부 할 수 없습니다.

이것에 대한 좋은 점은 그들이 아무것도 깨지지 않는 것을 훼손하려고하지 않는 한 것입니다.

언급되지 않은 메모리를 참조하십시오! (그리고 다른 흑인 마술/보oo ...)

이것은 매우 멋진 읽기입니다.http://spareclockcycles.org/2012/02/14/stack-necromancy-defeating-debuggers-by-raising-the-dead/

가장 현대적인 난독 화 방법은 가상 머신 인 것 같습니다.

기본적으로 객체 코드의 일부를 가져 와서 자신의 바이트 코드 형식으로 변환합니다. 그런 다음이 코드를 실행하기 위해 작은 가상 머신을 추가합니다. 이 코드를 올바르게 디버깅하는 유일한 방법은 VM의 명령 형식에 대해 에뮬레이터 또는 분리기를 코딩하는 것입니다. 물론 성능도 생각해야합니다. 바이트 코드가 너무 많으면 프로그램이 기본 코드보다 느리게 실행됩니다.

대부분의 오래된 트릭은 이제 쓸모가 없습니다.

  • ISDEBUGGERPRESENT : 매우 절름발이와 패치가 쉽습니다
  • 다른 디버거/브레이크 포인트 탐지
  • Ring0 재료 : 사용자는 드라이버를 설치하는 것을 좋아하지 않으며 실제로 시스템에서 무언가를 깨뜨릴 수 있습니다.
  • 모든 사람이 알고 있거나 소프트웨어를 불안정하게 만드는 다른 사소한 것들. 균열이 프로그램을 불안정하게 만들지 만 여전히 작동 하더라도이 불안정성은 당신에게 비난받을 것임을 기억하십시오.

VM 솔루션을 직접 코딩하려면 (판매용 좋은 프로그램이 좋은지) 하나의 명령 형식 만 사용하지 마십시오. 코드의 다른 부분이 다른 형식을 가질 수 있도록 다형성으로 만드십시오. 이렇게하면 하나의 에뮬레이터/분리기 만 작성하여 모든 코드를 깨뜨릴 수 없습니다. 예를 들어 MIPS 솔루션 MIPS 명령 형식이 잘 문서화되어 있고 IDA와 같은 분석 도구가 이미 코드를 분해 할 수 있기 때문에 일부 사람들이 제공하는 사람들이 쉽게 파손되는 것처럼 보입니다.

IDA Pro Disassembler에서 지원하는 지침 형식 목록

나는 사람들이 견고하고 신뢰할 수 있고 광고하는 것을하는 소프트웨어를 작성하는 것을 선호합니다. 그들은 또한 합리적인 라이센스로 합리적인 가격으로 그것을 판매합니다.

나는 고객과 공급 업체에 문제를 일으키는 복잡한 라이센스 체계가있는 공급 업체를 다루는 데 너무 많은 시간을 낭비했다는 것을 알고 있습니다. 이러한 공급 업체를 피하는 것이 항상 권장 사항입니다. 원자력 발전소에서 일하면서 우리는 특정 공급 업체 제품을 사용해야하므로 라이센스 체계를 처리해야합니다. 나는 우리에게 실패한 라이센스 제품을 제공하려는 그들의 실패한 시도를 다루는 데 개인적으로 낭비되는 시간을 되 찾을 수있는 방법이 있었으면 좋겠다. 물어 보는 것은 작은 것 같지만, 자신의 이익을 위해 너무 까다로운 사람들에게는 어려운 것 같습니다.

두 번째 가상 기계 제안입니다. (지금) MIPS I 시뮬레이터를 구현했습니다. 해당 코드/데이터 암호화 기능 (AES 또는 선택한 다른 알고리즘과 함께), 자체 시뮬레이션 능력 (따라서 시뮬레이터 중첩 할 수 있음)에 추가하면 꽤 좋은 코드 obfuscator가 있습니다.

MIPS I를 선택하는 좋은 기능은 1) 구현하기 쉽다는 것입니다. 2) C로 코드를 작성하고 데스크탑에서 디버깅하고 완료되면 MIPS를 위해 크로스 컴파일 할 수 있습니다. 사용자 정의 opcodes를 디버깅하거나 사용자 정의 vm에 대한 코드를 수동으로 작성할 필요가 없습니다.

내가 개인적으로 가장 좋아하는 것은 Amiga에 있었는데, 여기에는 공동 프로세서가 있습니다. 블리터) 프로세서와 독립적으로 대규모 데이터 전송을 수행합니다. 이 칩은 모든 메모리를 지우고 타이머 IRQ에서 재설정하도록 지시받습니다.

액션 리플레이 카트리지를 부착하면 CPU를 중지하면 블리터가 메모리를 계속 지우게 될 것입니다.

합법적 인 외모의 한가운데서 계산 된 점프는 실제로 실제 지시 지침을 숨기는 것이 제가 가장 좋아하는 것입니다. 어쨌든 인간을 감지하기는 매우 쉽지만 자동화 된 도구는 종종 엉망입니다.

또한 스택에서 리턴 주소를 교체하면 좋은 시간을 낭비 할 수 있습니다.

사용 NOP 디버거를 통해 어셈블리를 제거하는 것은 유용한 트릭입니다. 물론, 코드를 다시 넣는 것은 훨씬 어렵다 !!!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top