2011-08-15 3 views
1

이 보드의 첫 번째 질문과 이미 꽤 긴 질문 - 죄송합니다. (이 플랫폼에서 얻은 훌륭한 팁에 대해 모두 감사드립니다.) .어셈블러 "호출"명령어가 포함 된 Microsoft Detour - Hook 함수

여러 기능을 연결하려고합니다. (플러그인 코드가 많아서 내가 훅을 쓰고 싶지 않은 기능을 쓰거나 변경할 수 없지만 동일한 프로세스/스레드에서 직접 액세스 할 수 있습니다) Microsoft Detours.

C 스타일 컴파일러에 의해 생성되는 중독 항상 다음 어셈블러 "시작"코드가되어야 모든 기능 :

045A1A85 push  ebp 
045A1A86 push  ebx 
045A1A87 push  esi 
045A1A88 push  edi 
045A1A89 call  045A1A8E 
045A1A8E pop   eax 
045A1A8F mov   ebx,eax 
//go on with a little bit more assembler code 

을 일부 레지스터는 스택에 푸시하고 있습니다 볼 수 있듯이 호출 명령어는 다음 줄로 호출됩니다 (이미 생성 된 코드에 액세스 할 수 없다고 말한 것처럼 이것을 변경하지 말아주십시오). 호출 명령은 스택 변경 -이 스택 변화가 EAX 레지스터에 저장하고 추가 처리를 위해 사용된다 (!)

이 방법은 푹한다 :

045A1A85 jmp   hooking_function (528040h) 
045A1A8A int   3 
045A1A8B int   3 
045A1A8C int   3 
045A1A8D int   3 
045A1A8E pop   eax 

후킹 함수로 정의 트램펄린 기능으로 점프하는 알몸 기능.

031F0060 push  ebp 
031F0061 push  ebx 
031F0062 push  esi 
031F0063 push  edi 
031F0064 call  045A1A8E 
031F0069 jmp   045A1A8E 

주요 문제, 트램폴린 어셈블러 코드 1)에서 호출 명령이 경우 (스택에 잘못된 값을 추가하는 031f0064을 행 다음 나토 기능으로

__inline __declspec(naked) void hooking_function() 
{ 
    //more code in future 
    __asm { 
     jmp org_func_trampoline 
    } 
} 

045A1A89 대신) -> eax를 사용한 추가 프로세싱은 잘못된 결과를받습니다. 2) 다음 "ret"가 "031F0069"로 다시 돌아갈 때 스택 프레임을 다소 파괴합니다. ==> 동일한 처리가 두 번 수행됩니다. ret가 다시 호출되어 잘못된 함수로 연결됩니다.

내가 원하는 모든 기능이 위에서 설명한 서문으로 시작한다는 것을 보장하지 않습니다. 따라서 후킹 기능을 다시 쓸 수없고 무시합니다. trampoline 메서드 ...

이 텍스트의 기본 질문은 다음과 같습니다. 함수의 처음 5 바이트에서 호출 명령이 호출되는 Microsoft Detour와 함 수를 연결할 수 있습니까? (하지 않을 경우, 어떤 대안이 있습니까?)

이 (당신의 도움에 대한 희망과) 읽어 주셔서 대단히 감사

+0

주소와 모든 것이 상대적으로 정확합니까? 후킹하려는 함수가 다음 명령어를 호출하는 이유는 무엇입니까 ('call 045A1A8E')? –

+0

아, 예, 트램 폴린을 올바르게 호출하는 한 Detours는 처음 5 바이트가 호출되는 곳의 기능을 연결할 수 있습니다. –

+0

@Seth Carnegie 답변을 주셔서 감사합니다. 지금까지 보았 듯이이 함수는 레지스터 eip에 액세스하려고 시도합니다. 레지스터 eip는 다음 행을 호출하여 가능하며 스택을 읽지 않습니다 (직접이 아님). – TechMuc

답변

1

원래의 코드를 얻기 위해 그냥 쉬운 방법이다

045A1A89 call  045A1A8E 
045A1A8E pop   eax 

을 수행 eip 등록의 내용 pop eax은 스택에서 반환 주소 (045A1A8E)를 즉시 제거하고 실행 지점에서 eaxeip 값으로 설정합니다.

우회 분명이 알 수있는 방법이 없으며, 임의의 서브 루틴처럼 취급 그래서 eax (다른 eip)의 상이한 값을 발생시키는 나토로부터 call 045A1A8E를 행한다.

내가 왜 031F0069으로 돌아갈 지 확신하지 못합니다. 게시 한 코드를 읽는 것이 그렇게해서는 안됩니다.

따라서 입니다. 매우 특별한 경우입니다. Detours는 일반적으로 처음 몇 가지 명령어 중에서 호출이있는 함수를 완벽하게 연결할 수 있습니다. 이 사람은 Detours가 불리한 방식으로이 두 가지 지침을 완벽하게 배치 할 수있었습니다.