Reversing/Hooking

    [Hooking] 8. D3D Hooking : dx9, dx11 후킹 실습

    DirectX 후킹 방식과 과정에 대해 다시 정리해보면, EndScene 함수 후킹 한번의 랜더링이 끝날 때 마다 EndScene 함수가 호출됨 해당 함수를 후킹하면 매 렌더 프레임마다 원하는 동작 수행 가능 주로 이를 통해 화면 위에 그림을 그릴 수 있음. 따라서 EndScene 함수의 주소가 필요함. VTable 시작주소 탐색 EndScene 함수는 D3d9.dll의 VTable 공간에 담겨있음. CreateDevice 함수 어셈블리 코드 패턴 탐색을 진행하여 VTable 시작주소를 얻어올 수 있음. VTable 찾아 인덱스 번호 참조하여 EndScene 함수 시작주소 가져올 수 있음. Detour 후킹 원본함수의 실행코드 시작부분을 패치하여 코드 흐름을 바꾸는 Inline 후킹의 한 종류 원본함수의..

    [hooking] 7. D3D Hooking : Dummy Device

    DirectX의 동작 방식 DirectX를 이용하기 위해선 d3d를 초기화 하고 d3d 디바이스를 생성하는 작업이 우선되어야 한다. 정석적인 d3d 개발의 순서는 다음과 같다 생성하고자 하는 윈도우 클래스 등록 윈도우를 생성하고 화면에 표시 생성된 윈도우의 핸들을 가져와 Direct3D를 초기화 메시지 루프 및 루프 종료시 초기화한 D3D를 메모리에서 해제 프로그램 종료 여기서 우리는 이미 생성된 윈도우에 후킹을 걸었으므로 1~2의 과정은 불필요하다. 현재 후킹을 걸어놓은 윈도우의 핸들(HWND)만 가져오면 된다. 4번의 메시지 루프는 openGL 이나 GDI때 사용했던 그 메시지를 가리키는게 맞다. OS가 윈도우 프로세스에 보내는 메시지에 따라 동작시키는 부분이다. 현재 우리는 후킹을 진행하여 Ends..

    [hooking] 6. D3D hooking : 실습

    D3D 후킹 한번 해보려다 온갖걸 다 해보고 다시 돌아왔다. 다음과 같은 순서로 D3D 후킹이 진행된다. 코드 패턴찾아 Vtable로부터 EndScene 함수 주소 찾아오기 Detour 함수 이용해 코드 패치 trampoline으로 점프하여 후킹함수 실행 후킹함수 실행하여 원하는 동작 수행 Trampoline - 원본함수로 돌아가 EndScene 함수 마저 실행됨 EndScene의 Vtable 주소 가져오기 이전 문서에서 찾은 헥스코드 패턴을 이용해 vtable 주소값을 얻어올 것이다. C7 06 ?? ?? ?? ?? 89 86 ?? ?? ?? ?? 89 86 ?? ?? ?? ?? DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMa..

    [Hooking ] 5. TLS + TLS CallBack

    D3D 후킹 관련 코드를 찾다보니 아래와 같은 예제 코드를 볼 수 있었다. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hinstDLL); StartD3DHooks(); return true break } case DLL_PROCESS_DETACH: { MessageBox(NULL,L"detach dll!", L"ok", MB_OK); break } } return TRUE; } 일단 예제에서 소개하는 코드를 보면, DisableThreadLibraryCalls() 라는 함수가..

    [Hooking] 4. openGL&SDL Hooking

    이전엔 기껏 디버거로 다 찾아놨더니 D11이라 물먹었었다. D9를 쓸만한 바이너리를 찾아서 후킹을 시도해보려고 했다. 특정 라이브러리를 사용하는지 확인해보려면 IDA로 import 혹은 Name 심볼중에 라이브러리 심볼 있는지 찾기 x64 디버거에서 로드 심볼중 해당 DLL 로드하는지 찾기 두가지 정도로 확인이 가능할 것 같은데, 테스트 빌드했던 언리얼 바이너리는 2는 해당되지만 1은 해당되지 않아 어셈블리 코드 탐색에 문제가 있었다. openGL Hooking - Assault Cube https://guidedhacking.com/threads/opengl-swapbuffers-hooking-for-drawings-and-etc.10943/ 이친구 오랜만이다. 클라이언트 실행하고 디버거를 attach..

    [Hooking ] 3. D3D Hooking : 이론

    D3D 후킹을 진행할 때는 DirectX에서 장면의 랜더를 종료할떄 사용하는 함수인 EndScene 함수를 주로 후킹한다. 해당 함수의 주소를 Vtable을 이용해 후킹을 진행하는 모양. Vtable은 선언된 가상함수들의 주소를 담는 테이블이라고 했다. Vtable의 시작주소만 알고있다면 오프셋 계산을 통해 해당 바이너리에서 사용되는 모든 가상함수들의 주소를 얻어낼 수 있는것. D3D 후킹은 다음과 같은 순서로 진행된다. dll injection을 통해 목표 프로세스에서 dll 메인을 실행 dll 메인에서 후킹을 위해 만든 함수가 호출되며 d3d9.dll의 vTable 시작주소 탐색 알아낸 vTable 시작주소에서 오프셋 연산을 진행해 Endscene 함수의 실제 주소를 찾아냄 코드 패치 (후킹) 진행 ..

    [Hooking] 2. 기초지식 - 가상함수와 Vtable

    가상함수에 대해 말하기 전 - Overriding 클래스에서 선언된 함수에 대해, 해당 클래스의 자식 클래스가 정의되었을 때 자식 클래스에서 상속받은 함수를 새롭게 정의하여 사용하는것을 오버라이딩이라 한다. 부모 클래스의 함수에서 선언된 리턴타입과 함수 인자 구성이 똑같아야 한다. 이렇게 정의된 클래스 타입으로 변수를 선언하여 사용하는 경우, 함수를 새로 정의한 자식 클래스를 타입으로 지정하여 함수를 호출했을 때는 새롭게 정의된 함수가 호출된다. #include class Parent { public : void show() { printf("this is parent\n"); } }; class Child : public Parent { public: void show() { printf("this i..

    [Hooking] 1. 기초지식 - Detours Hook

    Inline Function Hook (detours Hook ) 후킹은 정말 여러가지 종류가 있다. 목표 대상으로 하는 함수 내부 어셈코드를 패치하여 공격자가 원하는 목표를 실행하게 하거나, 원래 실행될 함수의 인자를 바꿔 아예 다른 결과를 만들게도 한다. 혹은 내부에서만 왔다갔다해야 할 정보를 끄집어내 가져오기도 한다. inline 후킹 기법은 원본 함수의 내부 실행코드 시작부분을 공격자가 실행하고자 하는 함수로 점프하는 어셈으로 변경하는 방식인데, Detours는 이에 더해 포인터나 테이블을 추가로 변조하지 않고 어셈블리를 건드려 코드 실행 흐름을 바꾼 다음 원본 함수의 동작을 그대로 실행하게 한다. 다른 후킹과의 차별점은 추가적인 메모리 할당이나 불필요한 코드 패치등이 이뤄지지 않는다는 것. 일반..