매크로

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
분류 제목 글쓴이 최근변경 추천
자유 외부 커뮤니티로의 유입 광고 글에 대해 피카부 2023.10.19 0/0
자유 글이 베스트로 이동될 시 권한 부여 피카부 2021.06.07 0/0
자유 추천 금지를 권유/유도하는 행위는 제재 됩니다 피카부 2020.01.15 0/0
자유 이메일로 공유 요청하는 계정 제재 피카부 2018.09.14 0/0
자유 이곳은 매크로 장터가 아닙니다. 구매/판매 글 제재 피카부 2019.02.19 0/0
자유 운영 방해 목적의 매크로 관련 글 제재 피카부 2019.09.03 0/0
자유 테일스타 회원 레벨 정보 이용하기 피카부 2022.02.17 0/0
자유 외부 유료 매크로의 추천 유도 및 광고 추천 제재 피카부 2018.04.25 0/0
자유 매크로는 [공유] 분류를 지정해주세요 피카부 2022.02.17 0/0
질문 매크로 비활성화로 버튼만 계속 누르게 할려면 어떻게 ... 2 싸카이 2016.11.02 0/0
질문 매크로 사용 관련 질문입니다. 8 샤크아빠 2022.10.07 0/0
질문 매크로 사용 불법? 18 주인쁨쁨 2019.12.15 1/0
자유 매크로 사용~! 3 평강온달 2014.09.25 0/0
자유 매크로 사용도 안하는데... 9 로브 2022.03.26 0/0
매크로 사용법 보려면 베스트 글가야겠죠? 3 텟라 2016.01.20 0/0
질문 매크로 사용시 13 서연이아부지 2015.04.03 0/0
자유 매크로 사용시 n씨에 안 걸리나요??? 9 하늘이여1 2021.12.28 1/0
질문 매크로 사용시 가상데스크탑 사용하시는분들 4 바로바로먹자 2020.09.17 0/0
질문 매크로 사용시 꼭 지니모션, 블루스택을 사용해야 하나요? 4 인사왕바이킹 2014.12.02 0/0
질문 매크로 사용시 다른작업 할수있나요? 4 원클릭투트윅 2019.01.21 0/0
질문 매크로 사용시 렉걸림현상 GUNZ 2016.10.01 0/0
자유 매크로 사용시 바이러스로 체크되요 4 고르 2015.01.07 0/0
질문 매크로 사용시 질문입니다. 1 닉넴잉 2016.10.06 0/0
질문 매크로 사용시 쫄확률 줄어드는 체감 안느껴지시나요? 24 svnght 2016.07.27 0/0
질문 매크로 사용시 팅김현상? Skymy 2019.03.25 0/0
질문 매크로 사용시에는 화면보호기쓰면 안되나요? 2 자쿠러스 2020.12.19 0/0
질문 매크로 사용은 처음인데.. 7 매크로첫이용 2015.06.07 0/0
자유 매크로 사용자가 문제인가.. 회사가 문제인가.. 4 noshel 2015.11.03 1/0
질문 매크로 사용중 컴퓨터 다운 성남시민 2016.12.07 0/0
Board Pagination Prev 1 ... 149150151152153154155156157 ... 516 Next
/ 516

전체 최신 인기글

전체 주간 인기글