매크로 커뮤니티

DuOS : openGL


지니모션 : openGL


윈드로이 : openGL


앤디 : openGL

미뮤 : openGL


녹스(호환) : openGL


녹스(스피드) : DirectX 11.1


블루스택1 : DirectX 9


블루스택2 : DirectX 11.1



원래, openGL을 사용하는 에뮬들과 블루스택1은 후킹에 성공하였지만, 욕심이 생겨

녹스(스피드)모드와 블루스택2도 도전해봤습니다

위에 정리한 글을 보시면 아시겠지만 대부분은 openGL을 쓰지만 

드물게도 녹스(스피드)와 블루스택2는 DirectX 11.1을 사용합니다

DirectX 11 방식으로 후킹할려니 계속 AppCrash가 나길래 IDA 디버거로 모듈을 살펴보니

DirectX 11.1을 쓰더군요. DIrectX10 부터는 Present 함수를 후킹해서 버퍼 데이터를 얻어와야하는데

11과 11.1에서 Present 함수의 파라미터 부분에서 차이가 나더군요

캡쳐 테스트를 해보니 반디캠과 Dxtory는 이를 정확하게 캐치하지만, OBS나 xSplit, 오캠 등은 이를 캐치하지 못합니다






int WINAPI m_Present1(IDXGISwapChain* SwapChain, UINT SyncInterval, UINT Flags, const DXGI_PRESENT_PARAMETERS *pPresentParameters);



int WINAPI m_Present(IDXGISwapChain* SwapChain, UINT SyncInterval, UINT Flags);



위 함수가 11.1의 Present 파라미터 원형이고, 밑 함수가 11의 Present 파라미터 원형입니다

딱봐도 차이가 나는것을 알 수 있네요

저 같은 경우엔 반디캠에서 녹스(스피드)와 블루스택2를 후킹할 때, DX 버젼이 몇인지 확인하고 작업을 시작했습니다

반디캠에서는 DX11이라고 나와있길래, 의심없이 DX11방식으로 Present 후킹을 시도했지만, 계속 원래 함수로 넘겨줄때

AppCrash가 나길래, 슬슬 의심이 가기 시작했고, IDA 디버거를 통해 확신을 얻었습니다



그리고, 바로 DX11.1 방식으로 후킹을 시도했고, 밑 로그와 같이 Present 후킹에 성공하였습니다

테스트 파일은 녹스(스피드)입니다 (블루스택2도 결과가 동일하였습니다)




Injected DLL...

Process Attach

Start Function Initalize

Process ID : 15420

Get HWND success : 1383068

Real SwapChain: 0x905397009053970, 36ECB12E

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936

Calling Hook Present1

SwapChain: 0x905397009053970, 00000001  SyncInterval: 0,  Flags: 150275936





  • 모발러 2016.08.18 17:57

    오 대단하십니다. 

    EndScene을 후킹하는 방법과는 차이가 있나요?

  • 암드래 2016.08.19 15:04
    후킹 방법 자체는 크게 다를게 없지만 차이점이라면, 다이렉트9는 프레임 버퍼를 present를 통해 화면에 뿌려주기 전에 EndScene에서 프레임 버퍼를 출력을 하고 DX 장치를 EndScene에서 곧바로 얻을 수 있고, 이 DX 장치로부터 프레임 버퍼를 얻을 수 있기 때문에 EndScene를 후킹하지만, 다이렉트10 부터는 EndScene가 아닌 DXGI의 swapchain을 이용하는데다가 swapchain을 통해서만 DX 장치를 얻을 수 있기 때문에 present를 후킹합니다
  • 모발러 2016.08.22 14:28
    아 그렇군요... 감사합니다.
  • CoMix 2016.12.13 13:20
    혹시 C#으로 작성된 블택 다이렉트 후킹 예제가 있을까요???
  • 암드래 2016.12.14 15:42
    백업을 하지 않아, 포맷후 현재 제가 제작한 예제는 없고
    다른 사람이 작성한 C#만으로 작성된 예제는 Direct3DHook-master 가 있는데
    이 Direct3DHook-master 예제처럼
    그래픽 작업같은 많은 연산처리를 요구하는 코어 작업은 C#으로 작성하기에 적합하지 않습니다
    (1초 걸릴꺼 4~5초 걸립니다)
    따라서, 후킹용 dll 을 C++로 작성하여 목적 프로세스에 인젝션 한 후,
    인젝션된 후킹용 dll 이 해당 프로세스로 부터 얻어온 버퍼를 C# 프로그램에 전달해주면 되겠습니다
    (타 프로세스와의 값 공유 방법은 공유 메모리, 파이프라인 등 많은데 공유 메모리가 가장 좋습니다)
    (OBS 역시, 공유 메모리를 통해 원본 OBS 프로그램에 버퍼 값을 전달해줍니다)

    저는 후킹 dll 제작시 OBS 소스를 참고하여 제작하였고, 또 공부시 많은 도움이 됐습니다
    (https://github.com/jp9000/OBS/tree/master/GraphicsCapture)

    왜 굳이 후킹을 이용하시려는지는 모르겠지만
    특별한 이유가 아니시라면, 제작하실 때 메모리 누수나, 렉, 자원 해제 등의
    많은 고려를 해야하기에 딱히 추천드리고 싶진 않습니다....
    (하나라도 뻑나면, 프로세스 툭하고 계속 다운됩니다)

    그리고, 얻은 버퍼는 또 공통된 형식으로 재가공(예를 들면 비트맵)을 거쳐야 사용할 수 있으므로
    (다이렉트9,10,11,11.x,12,OpenGL 전부 같은 화면임에도 RAW 버퍼값이 다름)
    다이렉트 이미지 서치보다는 좀 더 느립니다 (물론, ADB보다는 빠릅니다)
    또, 동기식으로 할지 비동기식으로 할지도 문제고요
    (동기식으로 하면, 원본 프로세스 화면이 느려질테고,
    비동기식으로 하면 원본 프로세스 화면은 그대로지만 버퍼를 받는 쪽에서 그 원본 프로세스의
    화면을 따라가지 못하겠지요)
    그래픽 후킹이 다른 화면에 전혀 구애받지 않고, 사용할 수 있다는 점은 매력적이나
    그에 비해 들어가는 노력이 너무나도 큽니다...(배보다 배꼽이 더 큰격)

List of Articles
분류 제목 글쓴이 최근변경 추천
자유 운영 방해 목적의 매크로 관련 글 제재 피카부 2019.09.03 0/0
질문 혹시 매크로 돌리려면 블택1로 해야하나요 ? 1 e팩트 2016.08.08 0/0
자유 5년전 메크로.. 3 올떄멜로나 2017.12.24 0/0
자유 덱분포도가 궁금합니다 7 승버엄 2016.08.11 0/-1
질문 여러분 플스는 어디까지 찍으셧어오? 6 승버엄 2016.08.19 0/-1
질문 1.337버전 오면서 레벨이 모자라다고 안되시는분 계신... 27 포카리스웻트 2016.08.18 0/0
질문 메크로 설정 어떻게들 하시나요?? 5 철빵 2016.08.10 0/0
질문 윈도우7 에어로피크 질문 2 염왕자 2016.08.18 0/0
질문 매크로 설정 6 chrise 2016.08.18 0/0
질문 무탑 127층 나만어려운거에요? 12 wkdgy 2016.08.10 0/0
질문 아이디 비번을 입력해도 스크립트 오류가 나네요 5 파산회생자 2016.08.08 0/0
질문 오류뜨는데 저같은 분 없으신가요? 3 쟈쿠즈레노논 2016.08.08 0/0
자유 각 에뮬들이 쓰는 그래픽 라이브러리(+@ 블루스택2와 ... 5 암드래 2016.12.14 0/0
자유 매크로땜시 말이 많네요.. 31 iphm 2016.08.29 0/0
자유 나도 빨리 쓰고싶어요 14 힘이드네요 2016.09.11 0/0
질문 업뎃 후 로그인... 하고 픈데... 10 소울브레이커 2016.08.09 0/0
자유 정말 신세계네요. 10 파괴신 2016.10.07 0/0
질문 매크로 블루스택 4 핑벨 2016.08.07 0/0
자유 드뎌 된다.. 10 아티펙터 2016.08.07 0/0
질문 매크로 오류해결좀 14 젭비 2016.08.07 0/0
Board Pagination Prev 1 ... 368369370371372373374375376 ... 525 Next
/ 525

전체 최신 인기글

전체 주간 인기글