Reversing/Game Hack

    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을 넣게 하기 ..

    DLL Injection : 1. 게임 인젝션 실습

    Assault Cube용 핵을 제작하기 위해서 DLL 인젝션을 해야하는데, 게임에 바로 적용해보기 전에 일단 어떤식으로 코드가 동작하는지 실습해본다. 대상은 예전에 쓰던 지뢰찾기 게임. 정상 프로세스에 내가 만든 DLL을 인젝션하고, DLL이 인젝션되면 메시지 박스가 뜨게끔 해보자. 진행시에는 백신을 끄고 진행해야한다. dll 인젝션 기능은 바이러스에서도 많이 사용하기에 악성코드로 인식하더라. #include #include #include #include //프로세스 이름을 인자로 하여 pid를 반환하는 함수 bool process_name_to_pid( __out DWORD& pid, __in const std::wstring& process_name ); //해당 PID를 가진 프로세스에 지정한 이..

    Unity 구조 분석 : 2. 메모리에 저장된 값 찾기

    빌드 완료된 게임 클라이언트를 실행해서 분석 할 것이다. 초기값을 모르니 Unknown 으로 세팅하고 first scan 후, 적을 쏴서 체력을 감소시킨 뒤 감소한 값을 찾는다. 근데 이게 4바이트 값인지 8바이트 값인지 알수가 없어서.. 둘다 해보자. Decreased 로 세팅한 뒤 next scan 진행 이후 가만히 냅둔 상태에서 변하지 않은 값을 찾는다. Unchanged 로 세팅한 뒤 Next scan 진행, 과정을 반복한다. 음.. 쉽게는 안나온다. 아까 설정했던 정확한 수치인 1000 을 두고 찾아봐도 메모리에 실제 값이 1000이 저장되는게 아닌모양이다. 다른값이 저장되어 사용되는걸로 보인다. 6개 정도가 남았는데, 로봇의 체력이 감소할 떄 마다 저 값들이 한꺼번에 같이 변하는게 확인된다. ..

    Unity 구조 분석 : 1. 게임 빌드

    이제는 현재 많이 쓰는 엔진들에서도 이런 방법이 통용될 수 있는지를 확인해보고 싶고, 이런걸 하면서 라이브 리버싱 능력을 좀 키워보고 싶다. 현재 게임들이 많이 쓰는 엔진은 유니티 엔진과 언리얼 엔진인데, 이런 엔진들을 이용해 나온 상용 게임을 실제로 뜯어볼수는 없으니 , 샘플 게임을 가져와서 빌드하고 , 분석해보는 작업을 하려고 한다. 일단 유니티부터. 유니티의 FPS 샘플게임은 엔진을 설치할 때 제공되며, 샘플로 선택하여 플레이 해볼 수 있다. 일종의 튜토리얼용 게임인 셈인데, 게임의 구조는 다음과 같다. 플레이어에게는 체력이 있고, 에너지가 회복되는 방식의 탄창을 가진 총을 사용 플레이어가 일정 범위 내로 들어오거나, 플레이어에게 공격을 받으면 공격하는 적이 2개 존재 2개의 적을 모두 처치하면 게..

    win32API - Assault Cube ESP : 3. 좌표계 계산

    대략적으로 정한 순서 각 플레이어의 절대 좌표를 기준으로 하여 목표와의 상대적인 각도(x축 y축 각각)를 구해야함 지금 화면에 들어온 각도 범위에 해당 각도가 들어오는지 판정할 수 있어야함 - 이는 카메라 viewpoint 시야각에 대한 계산도 필요할듯- 시야각 내에 적이 존재한다면 사각형을 그려서 표시해야한다. 사각형의 위치는 자신과 상대의 좌표를 기준으로 계산한 각도와 현재 플레이어가 바라보고 있는 방향의 각도를 사용해 계산하여 표시해야한다. 사각형의 크기는 자신과 상대의 좌표를 기준으로 거리를 계산하여 그에 맞게 줄어지고 커져야함. 좌표를 기준으로 각도찾기 화면상에서 N 방향을 볼 때 X축 각도(lr angle)이 0도가 되고, 상하 각도(Y)는 수평을 기준으로 90~-90까지 이어진다. 먼저 z좌..

    win32API - Assault Cube ESP : 2. 데이터 표시

    게임 내의 데이터들이 어떤 주소에 있을지를 찾아놨으니 이제 그 데이터를 활용해야한다. 화면에 오버레이를 띄우는 동작은 할 수 있으니, 데이터를 화면에 띄워 적이 어디에 있건 그 위치를 출력할 수있는 동작(월핵)을 구현해보려고 한다. 이전에 만들었던 지뢰찾기와는 다르게, 어썰트 큐브는 3d +1인칭 게임으로 원하는 대상의 위치를 입체적으로 표현할 수 있어야 한다. 우선 거리에 상관없이 적 정보를 표시할 수 있는 오버레이를 먼저 띄워보는걸 해보자 어떤 순서로 해볼거냐면, assault cube 프로세스에 오버레이를 연결, 화면 크기에 맞게 띄워주고 메모리를 읽어와 화면의 특정 부분에 정보를 표시한다. 적 위치를 화면에 사각형 모양으로 표시한다 에임봇이 작동되면 자동으로 적에게 타겟팅 및 발사된다 우선 1번은..