전체 글

    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번은..

    win32API - Assault Cube ESP : 1. 값 찾기

    FPS 게임의 ESP 중에 가장 기본적인것이 에임봇인데, 에임봇이 선행되려면 화면에서 상대방의 정보를 읽어오는것이 먼저가 되어야 한다. 일단 당장은 화면 정보를 읽어오는건 잘 모르겠으니 , 게임 데이터상에서 플레이어들의 정보를 가져오는걸 우선적인 목표로 해보자. 지뢰찾기랑 비슷하게 인접한 메모리 영역에 플레이어 데이터가 모여있다고 가정하고 진행해보자. 플레이어의 기본 체력이 100이니, 몇대 맞으면 100에서 변할 것이라고 예상하고 값을 바꿔가면서 메모리 번지를 찾아보자. 플레이어의 체력 데이터를 채우고 줄이고 하면서 가리키는 포인터를 찾아간다. 찾아온 데이터는 메모리에 그냥 올라가 있는 값으로, 메모리상에서 정적이지 않고 계속 변할 값이다. 해당 값을 가리키는 정적인 포인터를 찾아놔야 프로세스를 재 실..

    Win32 API - 지뢰 찾기 핵 제작

    지뢰 위치를 찾기 위해, 메모리를 분석해 지뢰의 메모리 상 위치를 찾아보자. 치트엔진에서 지뢰를 찾고, 남은 지뢰 갯수를 카운트하는 변수가 저장된 메모리 주변을 찾아 지뢰가 어디에 있는지, 메모리 구조는 어떻게 되어 있는지 확인해보자. 닫힌칸은 0F로 표시되고, 열린칸은 해당 칸의 숫자로 표시된다. 40은 0이니까 빈 칸을 나타내는 듯. 그럼 8F로 표시된게 지뢰인가? 1바이트당 한칸을 배정해 연달아서 이어지고 있고, 한 줄의 시작점부터 다른 줄의 시작 점 까지는 0x20, 32바이트만큼 차이가 난다. 9*9인데도 그렇게 배정한 걸 보면 더 큰 크기일때를 고려하여 이렇게 한듯. 사용자 지정 옵션을 하더라도 최대 길이는 30 까지밖에 안되고, 각 줄의 시작과 끝에는 0x10이 들어가 있다. 01005361..

    win32API - GDI overlay

    이제 화면위에 올릴 overlay를 구현해야 한다. 배경을 검정색으로 바꾼 다음 , 검정색을 투명으로 변경하는 함수를 사용하여 투명 오버레이를 구현하자. c.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 0)); 실행시 WinMain에서 hWnd 생성 후에 다음 코드를 추가해준다. SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED); SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0),0 , LWA_COLORKEY); SetWindowLong 함수는 윈도우(창)의 설정을 변경하거나 정보를 저장할때 사용하고, SetLayeredWindo..

    win32API - GDI

    GDI(Graphics Device Interface) : 윈도우에서 그래픽 작업 처리를 위해 제공하는 기본 graphic API acase WM_PAINT: { RECT rect; RECT rect2; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); SetTextColor(hdc, RGB(0xFF, 0x00, 0x00)); rect.left = 10; rect.top = 10; rect2.left = 10; rect2.top = 30; DrawText(hdc, L"Hello Win Gdi World!", -1, &rect, DT_SINGLELINE | DT_NOCLIP); DrawText(hdc, L"Hello Win Gdi 2!", -1, &rect2, DT_S..

    win32API - 기초

    게임의 내부 메모리 구조를 리버싱을 통해 분석하고, win32API로 오버레이를 만들어 ESP를 만들어볼거다. 원래 해놨던 작업들을 한꺼번에 블로그 포스팅에 정리해봤는데.. 결과가 신기하긴 한데 괜히 했다 싶기도 한 그런 경험이었다 ㅋㅋ #include /* 윈도우 프로시저 선언 */ LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HWND : GUI요소를 위해 사용되는 인자. 어떤 윈도우에서 콜백이 발생하는지를 지정 UINT : Unsigned Int . 어떤 종류의 메시지인지 메지시 아이디를 인자로 넘김 WPARAM, LPARAM : 윈도우가 메시지에 자료를 추가할 떄 사용하는 매개변수 wparam : word로 넘기는 데이터 . 주로 핸들이나 정수를..

    VM에 설치한 도커로 인한 네트워크 장애 발생

    상황은 이렇다. 동아리 연구실내의 컴퓨터들이 도서관 네트워크에 더미허브를 이용해 연결되어 있는데, 컴퓨터 중 서버 역학을 하는 컴퓨터에는 VM위에 리눅스 서버들이 올라가있다. 또, 예전에 그 서버중 하나에서 가상서버 관리를 위해 도커를 올린적이 있었는데, 작업 중간에 멈추고 그대로 냅둔 상태였다. 어느날 연구실 컴퓨터들에 네트워크 장애가 발생해서 점검해보는데, 학교측에서 도서관 네트워크 장비구성을 변경한 이후에 이런 문제가 생겼다고 했다. 명확한 원인이 잡히지가 않아 대체 뭘까.. 하고 있던 와중에, 각 컴퓨터에 설정된 dns가 여타 장비들이랑 다르게 잡혀있어서, dns를 재설정하니 이제 네트워크가 정상작동했다. 근데 여기서부터 진짜 문제가 발생한다. 연구실 컴퓨터들이 도서관 네트워크에 연결되자마자 도서..