2010-12-03 2 views
1

"GetThreadContext"사용 이외의 다른 프로세스 (Windows의 C++)에서 스레드의 EBP를 얻을 수있는 방법이 있는지 궁금합니다. 나는이 방법이 너무 많은 시간이 걸린다 고 생각한다. (나는 그것을 많이 사용한다.) 단지 EBTE를 얻을 수 있으면서도 CONTEXT의 모든 값을 얻을 수 없다면 더 빠를 것이다.
"ReadProcessMemory"를 사용하고 나머지 호출 스택과 함께 EBP를 얻으려는 생각이 들었지만 스택이 있어야하는 위치와 어디에서 가져와야하는지는 알지 못합니다.
누군가가 더 좋은 방법을 알고 있다면, 그것에 대해 듣게되어 기쁩니다.
감사합니다 :)다른 프로세스에서 스레드의 EBP 가져 오기

+1

프로필 작성자는 무엇입니까? 어쩌면 당신이 당신의 문제를 설명한다면, 누군가 당신에게 더 빠른 길을 줄 수 있습니다. –

+0

예, 프로필러 :) – Idov

답변

3

다른 스레드의 EBP의 실행 값은 물론 스레드가 실행중인 경우 EBP 레지스터에 있습니다. 실행 중이 아니면 커널의 스케줄러에 의해 저장됩니다. GetThreadContext는 커널의 내용을 검색합니다. 그 외에는 더 빠를 것입니다.

성능 상황이 내가 이것을 썼을 때 이해했던 것보다 나쁘다. 스레드가 실행 중이면 커널은 APC 메커니즘을 사용하여 최신 값을 얻습니다. 이는 속도가 빠르지 만 다른 대체 API는 없습니다.

+0

아니요, 잘못되었습니다. NtGetContextThread는 APC를 현재 스레드가 아닌 경우 항상 대상 스레드에 대기시킵니다. 그런 다음 APC가 완료 될 때까지 대기합니다. 그리 빠르지는 않습니다. – wj32

+0

사실, 다른 빠른 대안이 있다면 나는 이것에 대해 더 열악해질 것입니다. 하나 있습니까? – bmargulies

+0

아니요. 스레드가 실행중인 경우 해당 레지스터는 레지스터에 있습니다. 이는별로 도움이되지 않습니다. 실행 중이 아니면 레지스터는 KTHREAD 객체에 저장됩니다. 그래서 우리가 실제로 읽을 수 있도록 쓰레드 레지스터가 저장되어 있는지 확인하는 가장 좋은 방법은 APC를 큐에 넣고 그 쓰레드의 프로세서에 인터럽트를 발생시키는 것입니다. – wj32

1

EBP가 레지스터이기 때문에 GetThreadContext가 유일한 방법입니다. 프로세서는 컨텍스트 스위치를 수행 할 때이를 저장합니다. 스레드의 레지스터를 읽는 유일한 방법은 GetThreadContext를 사용하는 것입니다.

물론 EBP에 원하는 값이 있다는 보장이 없습니다 ... 프레임 포인터 생략으로 컴파일 된 함수는 현재 호출 프레임의 프레임 포인터에 EBP를 설정할 수 없습니다.

스택 추적 (EBP를 시작하려는 가장 보편적 인 이유)을 찾고 있다면 StackWalk64을 제안 할 수 있습니까?

관련 문제