2017-05-10 13 views
0

아래의 콜 스택을 이해하는 데 어려움을 겪고 있습니다.CreateRemoteThread에 이르는 이상한 콜 스택

ntdll!NtCreateThreadEx+0xc 
KERNELBASE!CreateRemoteThreadEx+0x1f0 
kernel32!CreateThreadStub+0x27 
MyModule!_beginthreadex+0x87 

죄송합니다 나는 때문에 proprietory 문제의 그것의 더 이상 공개 할 수는 없지만 나는 우리가 그냥이 함께 적어도 부분적인 이해 할 수 있어야한다 생각합니다. 그것은 제가보고있는 크래시 덤프 내부의 제 3 자 라이브러리에 의해 생성 된 스레드의 상태였습니다. (스레드 자체는 내가 조사한 문제와 아무런 관련이 없습니다.) _beginthreadex을 호출 할 때 어떤 조건으로 인해 생성이 완료 될 수 있습니까? 원격 스레드? API에 대한 MSDN 문서가 나에게 단서를 제공하지 않습니다. '원격'이라는 단어가 해당 페이지에도 나타나지 않습니다.

제 3 자 라이브러리에 대한 기호가 있으며 콜 스택이 확실히 합법입니다.

업데이트 :

흥미 롭. 나는 그 자리 CreateThreadStub에서 뒤쪽으로 분해하면 나는 다음과 같은 지침을 참조로 복귀하도록되어 :

call dword ptr [MyModule!_imp__CreateThread (573701a0)] 
cmp  eax,ebx 

내가 할 경우 :

0:048> dds MyModule!_imp__CreateThread l1 
573701a0 75b5cf30 kernel32!CreateThreadStub 

을 내가 CreateThreadStub를 분해 할 때, 나는 그것이 CreateRemoteThread를 호출 보는가 . 이것은 모두 매우 혼란 스럽습니다!

+1

이것은 작성 스레드의 절대적인 일반적인 스택입니다. * CreateRemoteThread [Ex] *는 ** 스레드를 만들 때 ** 항상 ** 호출됩니다. – RbMm

+0

@ RBM 정말요? 나는 항상 CreateRemoteThread가 * 다른 * 프로세스의 주소 공간에 스레드를 생성한다고 생각 했습니까? – ForeverLearning

+1

예, 정말로. * CreateRemoteThread [Ex] *는 * CreateThread * 또는 * _beginthreadex *를 호출 할 때 항상 사용됩니다. 당신은'어떤 상태가 발생할 수 있는지'를 묻습니다 - 이것은 무조건적입니다. ** 항상 ** – RbMm

답변

1

MSDN에 대한 기능 설명은 잘못된 비트이다

다른 프로세스의 가상 어드레스 공간에서 실행하는 스레드를 생성한다.

발언의 첫 번째 줄은 CreateRemoteThread의 더 나은 요약 한 것입니다

CreateRemoteThread 함수는 지정된 프로세스의 주소 공간에서 시작하는 실행의 새 스레드를 야기한다.

최소한이 설명을 사용하면 현재 프로세스를 지정하기 만하면 CreateRemoteThread을 사용하여 로컬 프로세스에서 스레드를 만들 수 있습니다. 또한 CreateRemoteThreadEx 발언이 주목 :

CreateRemoteThreadEx 함수는 지정된 프로세스의 주소 공간에서 시작하는 실행의 새 스레드를 야기한다. 스레드는 프로세스가 열리는 모든 오브젝트에 액세스 할 수 있습니다. lpAttribute 매개 변수를 사용하여 새 스레드에 대한 프로세서 그룹 선호도와 같은 확장 된 특성을 지정할 수 있습니다. lpAttribute이 NULL이면 함수의 동작은 CreateRemoteThread과 같습니다. 당신이 매개 변수의 선택에 의해 커널 모드로 전환하고, 사실 CreateRemoteThreadEx이, 생각

, CreateThread 또는 CreateRemoteThread이 할 수있는 모든 것을하고, 각 시스템 콜의 정확성과 보안을 테스트 유지 보수 비용을 수행 할 수 있습니다 하나의 시스템 호출 만 모든 기능의 상위 집합으로 제공하고 이러한 모든 기능이이를 사용하도록하는 것이 좋습니다.

+0

나는 이것을 지금 깨닫는다. 게시하기 전에 Thomas Weller가 아래에 보여준 것을 시도해야합니다! 벤 감사합니다. – ForeverLearning

3

게시 한 스택이 정상 스택입니다. 다음의 C++ 코드를 컴파일

#include "stdafx.h" 
#include <iostream> 
#include <process.h> 
#include <Windows.h> 
using namespace std; 

void test(void *param) 
{ 
    Sleep(1000); 
    _endthread(); 
} 

int main() 
{ 
    HANDLE hThread; 
    hThread = (HANDLE)_beginthread(test, 0, NULL); 
    WaitForSingleObject(hThread, INFINITE); 
    return 0; 
} 
  1. 시작 WinDbg는
  2. 열기 초기 브레이크 포인트에서 실행
  3. 을 중단 점

    0:000> bp KERNELBASE!CreateRemoteThreadEx 
    0:000> bl 
        0 e Disable Clear 7485b060  0001 (0001) 0:**** KERNELBASE!CreateRemoteThreadEx 
    0:000> g 
    
  4. main() 방법은 CreateRemoteThreadEx()를 호출하는 참조 설정 _beginthread() 메소드를 치는 경우 :

    ,363,210
    0:000> k 
    # ChildEBP RetAddr 
    WARNING: Stack unwind information not available. Following frames may be wrong. 
    00 00f7f714 0f7ba3cd KERNELBASE!CreateRemoteThreadEx 
    01 00f7f758 000f255f ucrtbased!_beginthread+0xed [d:\rs1\minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 174] 
    02 00f7f844 000f2cbe ThreadStartStack!main+0x2f [c:\users\t\documents\visual studio 2015\projects\threadstartstack\threadstartstack\threadstartstack.cpp @ 19] 
    03 00f7f858 000f2b20 ThreadStartStack!invoke_main+0x1e [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl @ 64] 
    04 00f7f8b0 000f29bd ThreadStartStack!__scrt_common_main_seh+0x150 [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl @ 253] 
    05 00f7f8b8 000f2cd8 ThreadStartStack!__scrt_common_main+0xd [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl @ 296] 
    06 00f7f8c0 752362c4 ThreadStartStack!mainCRTStartup+0x8 [f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp @ 17] 
    07 00f7f8d4 77370fd9 KERNEL32!BaseThreadInitThunk+0x24 
    08 00f7f91c 77370fa4 ntdll!__RtlUserThreadStart+0x2f 
    09 00f7f92c 00000000 ntdll!_RtlUserThreadStart+0x1b 
    
+0

토마스에게 감사드립니다. 나는이 일을 직접 해냈어야했다. 방금 스레드를 만드는 모든 요청이 위에서 언급 한 Ben Voight처럼 CreateRemoteThreadEx로 전송된다는 것을 알지 못했습니다. – ForeverLearning