C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[68269] Re:Re: 감사합니다
pro [] 1461 읽음    2012-09-27 12:38
빌더님이 알려주신 세번째 방법으로 성공했습니다 ^^
API 패치하는 방법은 생각보다 복잡해서 포기 흑흑
답변해주신 분들 모두 감사합니다 ^^


빌더(TWx) 님이 쓰신 글 :
: pro 님이 쓰신 글 :
: : 그지같은 C++ 빌더가 64비트를 지원하지 않아서
: : 비쥬얼 스튜디오 64비트 C++ 컴파일러를 이용해서
: : 쉘인 Explorer.exe를 후킹  하는데 성공했습니다 ^^
: :
: : 이번엔 서비스를 인젝션해서 후킹하려고 하는데요
: : 서비스를 OpenProcess로 오픈하면 프로세스가 정상적으로 오픈됨에도 불구하고
: : 리모트 스레드 생성에서 실패하네요.
: :
: : XP에선 되는데 Win 7 64비트에선 왜 안되는 건가요.
: :
: : 컴파일도 비쥬얼 스튜디오 64비트 C++ 컴파일러로 했거든요.
:
:
:
:
: 답변:
:
: Protected Mode Context로 실행되고 있는 프로세스(서비스)에 리모트 쓰레드를 생성하기 위해선 Token Access Right 등
:
: 충분한 권한이 확보 되어있는 상태라야 하는데, OpenProcess로 프로세스 핸들을 여는데 까진 성공했다는 것은
:
: 권한과 관련한 사전작업 들은 이미 처리하고 있는 것으로 보여지네요.
:
:
: 리모트 쓰레드 생성에 실패하는 이유는... 비스타 이후 부터 바뀐 OS 구조 때문 입니다.
:
: 비스타 이후 부터 프로세스 들은 Session과 연계 되어 처리되게 되는데... 타겟 대상인 서비스와 Injector 프로세스의 Session이
:
: 다르기 때문에 리모트 쓰레드 생성에 실패하고 있을 겁니다.
:
:
: 문제를 해결하기 위한 방법을 찾아 보자면... 대략 세가지 정도 생각해 볼 수 있을텐데...
:
:
: 첫번째 방법...
:
: 더미로 서비스를 하나 만들어 주어서, 이 서비스가 Injector 프로세스를 실행하도록 해주는 겁니다.
:
: 이 경우 Injector 프로세스가 서비스의 세션으로 실행되기 때문에 리모트 쓰레드 생성이 가능해 집니다.
:
: Injector 프로세스가 실행되면 역할을 다한 서비스는 제거해 주면 되고요.
:
: 서비스 형태로 실행되어야 해서 관리자 권한이 필요해 지게 됩니다.
:
:
: 두번째 방법...
:
: CreateRemoteThread API 자체를 Trampoline 방식으로 패치해서 Session Validation 처리를 하지 않도록 해주는 방법 입니다.
:
: API를 디스어셈블링해서 코드를 패치해줘야 하니까 번거롭겠죠.
:
:
: 세번째 방법...
:
: 'NtCreateThreadEx'라는 Undocumented API를 직접 이용하는 방법입니다.
:
: CreateRemoteThread API가 Session Validataion Check에 성공하면 'NtCreateThreadEx'라는 Undocumented API를
:
: 내부적으로 호출하게 되어 있으니까... 이 시스템 API를 직접 이용해서 리모트 쓰레드를 생성해 주는 겁니다.
:
: Undocumented API인 'NtCreateThreadEx'는 'NTDLL.DLL'에서 Export 하고 있고, API의 프로토타입은 다음과 같습니다.
:
: typedef DWORD (WINAPI *PFNTCREATETHREADEX)
: (   
:      PHANDLE ThreadHandle,
:      ACCESS_MASK DesiredAccess,
:      LPVOID ObjectAttributes,
:      HANDLE  ProcessHandle,
:      LPTHREAD_START_ROUTINE  lpStartAddress,
:      LPVOID lpParameter,
:      BOOL  CreateSuspended,
:      DWORD  dwStackSize,
:      DWORD  dw1,
:      DWORD  dw2,
:      LPVOID   Unknown
: );
:
: API를 사용하기 위해선 아래와 같은 식으로 펑션의 주소를 얻어서 사용하면 됩니다.
:
: HMODULE hNtDLL = LoadLibraryA("NTDLL.DLL");
: PFNTCREATETHREADEX pFunc = NULL;
:
: pFunc = (PFNTCREATETHREADEX)GetProcAddress(hNtDLL, "NtCreateThreadEx");
:
: pFunc( &hRemoteThread,
:             0x1FFFFF,
:             NULL,
:             hTargetProc,
:             reinterpret_cast< LPTHREAD_START_ROUTINE >( pRemoteFunc ),
:             pRemoteArgs,
:             FALSE,
:             0,
:             0,
:             0,
:             NULL);
:
:
: ...

+ -

관련 글 리스트
68240 리모트 스레드를 이용한 서비스 후킹 pro 1436 2012/09/25
68246     Re:리모트 스레드를 이용한 서비스 후킹 빌더(TWx) 2018 2012/09/26
68269         Re:Re: 감사합니다 pro 1461 2012/09/27
68251         Re:Re:리모트 스레드를 이용한 서비스 후킹. 몇가지 더 여쭙니다 pro 1843 2012/09/26
68253             Re:Re:Re:리모트 스레드를 이용한 서비스 후킹. 몇가지 더 여쭙니다 MarunGuy 2076 2012/09/26
68252             Re:Re:Re:리모트 스레드를 이용한 서비스 후킹 Lyn 1425 2012/09/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.