2011-11-03 2 views
0

저는 Windows 7 머신에 있으며 IDA에서 kernel32.dll을 열어 보았습니다. IDA는 IsDebuggerPresent 함수의 주소가 0x77e2b020이라고 말합니다. 인라인 어셈블리를 사용하여 함수를 호출하려고합니다. VS2010 플랫폼에서 인라인 어셈블리를 사용하여 IsDebuggerPresent 호출하기

, 나는 다음과 같은 코드를 사용하여 시도 : -

#include<iostream> 
using namespace std; 

int blah() { 
    __asm { 
     xor eax, eax 
     mov ebx, 0x77e2b020 
     call ebx 
    } 
} 

int main() { 
    cout<<blah(); 
    return 0; 
} 

EXE 파일을 구축, 그것은 KERNEL32.DLL가로드되는 보여줍니다.

"call"명령이 실행될 때 OllyDbg에서 exe 디버깅을 시도했지만 오류가 "액세스 위반"입니다.

예, C++에서 직접 API를 호출하는 것이 가장 좋고/올바른 방법임을 알고 있습니다.이 작업을 재미있게 수행하고 있습니다. 왜 이것이 작동하지 않는지 이해하지 못합니다.

답변

1

주소 0x77e2b020은 정적이 아니므로 은 반드시이어야합니다. 명시 적 주소가 아닌 이름으로 지정하십시오.

ASLR이 활성화되어 있으면 재부팅 할 때 라이브러리가 다른 주소로로드됩니다. 또한 라이브러리로드 순서를 보장 할 수 없으므로 주소도 영향을받습니다.

간접 전화를 걸려면 LoadLibraryGetProcAddress을 사용하여 런타임에 IsDebuggerPresent의 주소를 찾으십시오.

또 다른 문제는 eaxebx을 걸러내는 것입니다. 당신은 당신이 그런 인라인 어셈블리 작업을 수행하는 동안 예를 들어, 안전 레지스터를 유지하기 위해 pushadpopad을 사용해야합니다

__asm { 
    pushad 
    call IsDebuggerPresent 
    mov dbgPresent, eax 
    popad 
} 
+0

감사합니다! 하지만 흠, 그래, 나는 이것을 시도했지만 컴파일러는 IsDebuggerPresent 라벨이 정의되어 있지 않다고 생각하는 것 같다. –

+0

정의가 포함되어 있습니까? – Polynomial

관련 문제