DuOS : 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
오 대단하십니다.
EndScene을 후킹하는 방법과는 차이가 있나요?