전체 글

    [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는 이에 더해 포인터나 테이블을 추가로 변조하지 않고 어셈블리를 건드려 코드 실행 흐름을 바꾼 다음 원본 함수의 동작을 그대로 실행하게 한다. 다른 후킹과의 차별점은 추가적인 메모리 할당이나 불필요한 코드 패치등이 이뤄지지 않는다는 것. 일반..

    윈도우 운영체제 구조

    윈도우 운영체제 구조 윈도우 NT 아키텍쳐 커널모드와 유저모드의 두 가지 메인 구성요소로 설계 자원낭비를 줄이기 위해 여러 부분으로 쪼개어 설계됨 윈도우 Ring 구조 각 계층을 구분하여 운영, 시스템의 보안수준을 높은 상태로 유지하기 위해 고안됨. 커널모드 하드웨어 ~ 각종관리자 사용자가 "직접" 접근이 불가능한 영역. 프로그램을 실행하는 기본 관리 시스템이 위치함. 커널 : 운영체제의 중심에 위치함으로써, 운영체제의 핵심 기능들을 제공하고, 하드웨어를 비롯한 각종 장치들의 제어를 담당함. 하드웨어 HAL (Hardware Abstraction Layer) : 하드웨어 - 소프트웨어간 원할한 통신을 위한 역할. 윈도우의 기본 표준역할을 하기때문에 새로운 하드웨어가 시스템에 추가되어도 HAL 표준만 지키..

    Unity Attack : 5. DLL Injection 2

    GameObject 가져오기 먼저 원본 게임의 Scene에는 다음과 같은 오브젝트들이 존재한다. 여기서 정보를 받아오고자 하는 컴포넌트는 Enemy_Turret과 Player인데, Assembly-Cshaep.dll 파일에서 Scene에 대한 정보를 받아오지는 못하므로, 인젝션한 코드를 가지고 저 목록을 받아와 보자. namespace unity_injection_2 { public class Cheat : UnityEngine.MonoBehaviour { private void OnGUI() { GameObject[] allObjects = UnityEngine.Object.FindObjectsOfType(); int i = 0; foreach (GameObject objs in allObjects) ..

    Unity Attack : 4. DLL injection

    Code(Script) Injection in C# C#으로 만들어진 유니티 엔진에 코드 패치를 진행할 때는 이전 assault cube 때 처럼 직접 DLL인젝션을 진행해도 되지만, C#으로 공격 스크립트를 작성하여 사용한다면 유니티에서 사용하는 문법과 클래스 등을 그대로 쓸 수 있다. 즉, C#으로 DLL 인젝션 도구를 만들어 사용하면 훨씬 편리하다는 뜻이다. 지금의 경우는 직접 만드는 대신에 도구를 사용해보려고 한다. 기존에 내가 CPP로 작성했던 DLL Injection 도구는 아래와 같다. module = GetModuleHandle(L"kernel32.dll"); thread_start_routine = (LPTHREAD_START_ROUTINE)GetProcAddress(module, "Lo..

    Unity Attack : 3. 엔진의 구조

    Unity 구조분석 1과 2에서 치트엔진을 가지고 많은 삽질을 했었다. 최종적으로 알아낸 건 Object → Health 컴포넌트 → 체력 값 순의 구조를 가지고 있다는 것. 엔진의 구조부터 차근차근 분석하여 실제로는 어떻게 되어있는지와 그 값을 다루는 방법을 익혀보자. Assembly-Csharp.dll Unity 엔진에서는 두가지 어셈블리를 가지고 있다. Assembly-Csharp : 게임 내 에셋들에 들어있는 모든 스크립트를 묶어둠 Assembly-Csharp-Editor : Editor 폴더 안에 들어있는 스크립트를 묶어둠. 위 그림에서는 여러 DLL 파일들이 Assembly-Cshaep.dll 이라는 파일 하나에 묶여있는것이 보인다. 파일 하나에서 종속성이 명확하게 정의된 여러 어셈블리 파일들..

    DLL injection : 3. Assualt Cube

    이젠 이전에 월핵을 만들어봤던 어썰트 큐브에다 코드 패치를 적용해보자. 만들 기능은 플레이어가 피격당하더라도 체력이 감소하지 않게 만들기. 플레이어의 체력감소 이벤트 코드 구문을 찾아가야한다. 맨 아래쪽이 플레이어 피격 발생시 체력 감소 구문이다. 무기 종류에 관계 없이 피격 발생시엔 해당 코드가 동작한다. sub를 add로 바꿔보자. 피격 발생시 체력이 올라가는게 보인다. 근데 그렇게 하면 나만 체력이 올라가는게 아니고, 모든 피격 이벤트에 대응하여 모든 캐릭터의 체력이 증가하게 된다 . 즉, 멀티플레이어 게임에서 코드 구문 변경으로 동작을 변경하는 방식은 썩 좋은 형태는 아니란 소리 . 메모리 값에 직접 접근해야할듯 싶다. 다른 사람들이 만들었던 핵을 보니, 코드 패치보다는 게임 인스턴스에 직접 접근..

    DLL Injection : 2. 코드 후킹

    해볼 시나리오는 2개였다. 타이머 0초로 고정하기 게임 시작하자마자 지뢰 위치 전부 보여주기 우선 지뢰찾기에 디버거를 연결한 후 심볼을 보면, 몇몇 함수들의 심볼이 남아있는것 처럼 보인다. 그러나 대부분의 함수들이 라이브러리 표준 함수로, 게임 내에서 자체적으로 사용하는 함수중엔 심볼이 남아있는게 없는모양. 따라서 직접 함수를 찾아가야 한다. 치트엔진을 이용해 타이머 값과 연관되는 메모리-프로그램 주소를 찾아가보자. 위에서부터 순서대로 타이머 동작 → 타이머 1씩 증가 → 타이머 정지 순이다. 마지막 경우에는 edi에 0이 들어있어서 타이머가 0으로 바뀌는듯. 코드를 패치해서 타이머를 0으로 고정하려면, 몇가지 방법을 생각해볼 수 있다. inc 명령어 자체를 mov 0 으로 변경해 항상 0을 넣게 하기 ..