Reversing
DLL injection : 3. Assualt Cube
이젠 이전에 월핵을 만들어봤던 어썰트 큐브에다 코드 패치를 적용해보자. 만들 기능은 플레이어가 피격당하더라도 체력이 감소하지 않게 만들기. 플레이어의 체력감소 이벤트 코드 구문을 찾아가야한다. 맨 아래쪽이 플레이어 피격 발생시 체력 감소 구문이다. 무기 종류에 관계 없이 피격 발생시엔 해당 코드가 동작한다. sub를 add로 바꿔보자. 피격 발생시 체력이 올라가는게 보인다. 근데 그렇게 하면 나만 체력이 올라가는게 아니고, 모든 피격 이벤트에 대응하여 모든 캐릭터의 체력이 증가하게 된다 . 즉, 멀티플레이어 게임에서 코드 구문 변경으로 동작을 변경하는 방식은 썩 좋은 형태는 아니란 소리 . 메모리 값에 직접 접근해야할듯 싶다. 다른 사람들이 만들었던 핵을 보니, 코드 패치보다는 게임 인스턴스에 직접 접근..
DLL Injection : 2. 코드 후킹
해볼 시나리오는 2개였다. 타이머 0초로 고정하기 게임 시작하자마자 지뢰 위치 전부 보여주기 우선 지뢰찾기에 디버거를 연결한 후 심볼을 보면, 몇몇 함수들의 심볼이 남아있는것 처럼 보인다. 그러나 대부분의 함수들이 라이브러리 표준 함수로, 게임 내에서 자체적으로 사용하는 함수중엔 심볼이 남아있는게 없는모양. 따라서 직접 함수를 찾아가야 한다. 치트엔진을 이용해 타이머 값과 연관되는 메모리-프로그램 주소를 찾아가보자. 위에서부터 순서대로 타이머 동작 → 타이머 1씩 증가 → 타이머 정지 순이다. 마지막 경우에는 edi에 0이 들어있어서 타이머가 0으로 바뀌는듯. 코드를 패치해서 타이머를 0으로 고정하려면, 몇가지 방법을 생각해볼 수 있다. inc 명령어 자체를 mov 0 으로 변경해 항상 0을 넣게 하기 ..
DOC 문서형 악성코드 2- trojan_EvilDoc-IcedID
git : https://github.com/synod2/DOC_Malware/trojan_EvilDoc-IcedID any.run 에서 수집한 악성코드 샘플을 가지고 분석을 진행하였음. 악성코드 이름 : trojan_EvilDoc-IcedID.doc MD5 : 4A88E83B325AA23DA1E4BFA90B4F7C34 doc용 vba script를 오피스를 실행하지 않고도 추출할 수 있는 도구를 사용해 스크립트를 추출 후 분석을 진행하였다. VBA 스크립트 추출 먼저 info 명령어를 실행하여 해당 문서의 정보를 파악해보면 OLE2 형식 파일이 아니기 떄문에 분석할수는 없지만, 오피스 2007 이상의 XML 포맷 파일임이 확인되어 inflate 명령어를 실행하라는 결과를 볼 수 있었다. (OLE 파일 ..
DOC 문서형 악성코드 1
DOC 문서형 악성코드 .1 참고문 : https://blog.cystack.net/word-based-malware-attack/ 개요 문서형 악성코드 중 워드 기반 악성코드로, 워드 문서의 매크로 기능(Enable Content)을 사용할때 동작한다. 악성 워드파일 열람 - 매크로 실행 악성코드 DROP DROP된 악성코드 실행 word 악성코드의 경우 주로 위와 같은 형태로 동작하는데, 순서에 따라 구분해서 분석을 진행하였다. 환경 windows 7 Pro - service pack 2 office 2010 1. 워드파일 매크로 실행 test.doc 파일을 실행하면 아래와 같은 이미지가 나온다 무슨 말인지는 하나도 알아들을수가 없지만, 워드상에서 매크로를 차단하고 Enable Content를 할껀지..
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번은..
win32API - Assault Cube ESP : 1. 값 찾기
FPS 게임의 ESP 중에 가장 기본적인것이 에임봇인데, 에임봇이 선행되려면 화면에서 상대방의 정보를 읽어오는것이 먼저가 되어야 한다. 일단 당장은 화면 정보를 읽어오는건 잘 모르겠으니 , 게임 데이터상에서 플레이어들의 정보를 가져오는걸 우선적인 목표로 해보자. 지뢰찾기랑 비슷하게 인접한 메모리 영역에 플레이어 데이터가 모여있다고 가정하고 진행해보자. 플레이어의 기본 체력이 100이니, 몇대 맞으면 100에서 변할 것이라고 예상하고 값을 바꿔가면서 메모리 번지를 찾아보자. 플레이어의 체력 데이터를 채우고 줄이고 하면서 가리키는 포인터를 찾아간다. 찾아온 데이터는 메모리에 그냥 올라가 있는 값으로, 메모리상에서 정적이지 않고 계속 변할 값이다. 해당 값을 가리키는 정적인 포인터를 찾아놔야 프로세스를 재 실..