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
[68252] Re:Re:Re:리모트 스레드를 이용한 서비스 후킹
Lyn [tohnokanna] 1425 읽음    2012-09-26 15:07
윈도우는 여러개의 세션을 가질 수 있습니다... 간단하게 말해서 여러명이 한 컴퓨터에 접속해서 각자 따로 조작할 수 있단겁니다
(뭐 서버 OS에서나 구경할수있지만 ...)

그런데 윈도 Vista 이후 서비스와 메인유저가 공용으로 사용했던 0번 세션이 서비스 전용으로 분리되었습니다.(보안이슈로 인해)
즉 다른 세션이기때문에 일반적인 권한으론 접근이 안됩니다...

쉘이야 내 세션에 띄운거니까 그냥 접근이 되는거구요.

그리고 실행속성을 가지던 말던 메모리에선 변경이 됩니다... MS도 버그패치나 보안패치할때 함수 앞부분을 바꿔서 다른곳으로 점프시키는 방법으로 재부팅 하지 않고 프로그램의 내용을 바꿉니다(핫 패칭)

pro 님이 쓰신 글 :
: 안녕하세요 빌더님 답변 감사합니당 ^^
:
: 제가 XP만 쓰다가 Win7 프로그래밍 해보기 시작한지 얼마 안되서
: 모르는게 많습니다. 몇가지 더 여쭈어 볼게요
:
: 쉘인 Explorer는 리모트 스레드가 성공하는데 서비스는 안되는 이유가
: 아직 이해가 안됩니다. 세션 개념도 그렇구요.
:
: CreateRemoteThread API 자체를 Tampoline 방식으로 패치하는 방법을
: 알려주셨는데 임포트 테이블 조작이 아니고 함수코드를 직접 조작하는 거라면
: 윈도에서 실행 속성을 갖는 코드는 변경을 금지하고 있는거로 알고 있는데요
: 어떻게 가능하다는 건지 모르겠습니다.
:
:
:
: 빌더(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 자체를 Tampoline 방식으로 패치해서 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 1437 2012/09/25
68246     Re:리모트 스레드를 이용한 서비스 후킹 빌더(TWx) 2018 2012/09/26
68269         Re:Re: 감사합니다 pro 1462 2012/09/27
68251         Re:Re:리모트 스레드를 이용한 서비스 후킹. 몇가지 더 여쭙니다 pro 1844 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.