분류 전체보기

좀비고의 이동 알고리즘은 꽤 특이하다. 다음과 같은 맵에서 S -> E로 경로를 찾아간다고 가정하겠다. 보통의 A* 알고리즘을 사용한다면 경로는 이렇게 된다. ( 사진1 )하지만 좀비고에서는 이렇게 이동하지 않는다. best next path 우선순위 설정에 따라 달라질수도 있지만, 원하는 좀비 이동 로직은 나오지 않는다. ( 사진2 )좀비고에서는 아마 이렇게 이동할 것이다. 일반적인 A* 알고리즘으로는 재현이 안되는 이유는, 좀비고의 로직은 거리의 dx, dy값을 알고리즘에 반영해서 이동하기 때문이다. 사진1 과 사진2 는 이동에 드는 cost가 동일하다. 어느 경로를 택하더라도 이동에 걸리는 시간은 동일하므로, 사진2 의 경로가 선택되지 않는다. 동일한 cost가 드는 next nodes중에서 dx,..
· 네트워크
Cloudflare에서는 다양한 종류의 SSL을 설정할 수 있다. 설정 가능한 인증서들 중 아래 3가지가 있다. - Edge cert- Client cert- Origin server 1. Edge certificateEdge 인증서는 클라이언트와 Cloudflare 간의 통신에 사용되는 인증서다. 기본적으로 무료로 cloudflare가 제공해주며,유료 결제를 하면 직접 인증서 발급과 커스텀 인증서 업로드 등도 가능하다. 2. Client certificateClient 인증서는 보안을 위해 mTLS를 사용하기 위해 필요하다. Client 인증서는 Cloudflare와 Client 간에서만 사용된다.다만 서버에서 쓰이는 인증서가 아닌, Client에서 사용되는 인증서다.  mTLS란 Client단에서 서..
1. 이동경로좀비고등학교의 인간 추적 알고리즘은 AStar path finding을 변형해서 사용하고 있다. 아래는 좀비고의 좀비 이동 회로다. 주의 깊게 보아야할건 좀비와 인간이 1칸 대각선 위치에 서있는 상황이다. 인간이 정지한 상태일 경우, 좀비는 x, y 좌표중 랜덤하게 우선순위가 선택되어 이동한다. 그러나 이동중인 상태일때는 다르다. 인간이 좀비보다 한칸 아래에 있을때는 x좌표 우선, 위에 있을때는 y좌표 우선으로 움직인다.나머지 위치에 있을 경우는 정지된 상태와 동일하다. 이를 통해 인간과 좀비가 쉽게 겹쳐서 죽어버리는걸 방지했다. 인게임에서 좀비로 널뛰기가 가능한 이유도 위와 같다.  2. 알고리즘 좀비의 이동 루틴은 아래와 같다. 1. 타겟 플레이어의 위치와 이동중인지 여부 가져오기2. 이..
· 리버싱
Firefox의 쿠키와 local storage가 저장되는 기본 디렉토리는%APPDATA%\Roaming\Mozilla\Firefox\Profiles 이다. 1. Cookie폴더 내부에는 .default-release 폴더가 있는데,쿠키는 cookies.sqlite에 저장된다. 스키마 구조는 아래와 같이 되어있다. 통상적으로 name, value, host 값이 필요하다. host는 ".naver.com" 과 같이 hostname 앞에 "." 이 붙어서 저장된다. 2. LocalStorage localstorage db는 위의 base directory / storage / default / +++ / ls / data.sqlite 에 저장된다. Ex) storage/default/https+++nave..
· 리버싱
ld.exe는 ldplayer에서 내부적으로 실행중인 LDPlayer의 VitrualBox console에 접속하기 위해 사용된다. Default usage:.\ld.exe -s  session 값을 주지 않을 경우 모든 실행중인 에뮬레이터 중 하나에 연결된다. ld.exe는 어떻게 창에 attach할까. IDA로 분석해봤다. CPP로 작성되었고, start 함수에서 CRTStartup 함수로 이동한다. CRTStartup -> wmain wmain 함수는 두개의 int pointer를 인자로 받는데, 이 값은 pre_cpp_init에서 초기화된다. dword_406414에 *argc,dword_406418에 ***argv 가 담긴다. __tmainCRTStartup에서는 wmain에 env까지 인자로 ..
C# 에서의 IntPtr은 본래부터 포인터 연산을 위한 값을 담기 위해 사용되었다. nint는 C# 9 버전에 추가되었고, 그저 x86, x64에 따라 사이즈가 바뀌는 정수 타입으로만 사용되었었다. 어떻게 보면 IntPtr과 nint가 동일한 역할을 한다고 볼 수 있다. IntPtr 또한 플랫폼에 따라 32, 64비트로 사이즈가 바뀌었으니 말이다. 하지만 C# 11 이전까지는 IntPtr과 nint가 공존하는 형태로 사용되어 왔었다. C# 11 이전에서는 아래와 같은 연산이 불가능했다. IntPtr a = new IntPtr(1); // C# 10 이하에서 연산 불가 IntPtr b = a + 1; 하지만 nint는 단지 정수로 사용되었기 때문에 위와 같은 연산이 가능했다. C# 11 부터는 nint 또..
· 리버싱
API Host https://api.zeta-ai.io 1. 친구 목록 Zeta에서 대화 가능한 친구 목록은 아래 요청으로 받아온다. GET /v1/layouts/main 왜인지 몰라도 Authorization 없이도 접근이 가능하다. https://api.zeta-ai.io/v1/layouts/main 2. 대화창 특정 캐릭터 대화창을 열었을때, GET /v1/rooms?characterId= 로 요청이 간다. Response: {"rooms":[],"nextCursor":null} rooms가 비어있으면, POST 요청을 통해 방을 생성한다. POST /v1/rooms {"characterId": } Response: {"id": , "character": { "id": }} 3. 대화하기 Zeta..
· 리버싱
Zeta는 React native로 되어있으며, 데이터베이스로 mmkv를 사용하고 있다. 저장소 경로: /data/data/com.scatterlab.messenger/files/mmkv/mmkv.default 따로 암호화는 되어있지 않다. MMKV Parser를 사용해서 복호화 해 보자. Access Token KEY: TOKEN Refresh Token KEY: REFRESH_TOKEN 동일한 이름의 field로 두개가 나올건데, 둘다 동일하다.
서론. 윈도우용 안드로이드 앱플레이어중에 개인적으로 가장 개발자 친화적으로 설계된건 LDPlayer가 아닐까 싶다. 직설적으로 말하면 매크로, 작업장 친화적이다. LD (구 모모)는 별도의 컨트롤러를 제공하지 않는 Nox, Blustacks와 달리, 전용 컨트롤러가 존재한다. ldconsole.exe 를 사용해서 대부분의 원하는 작업을 자동화 할 수 있다. 지원하는 명령어도 엄청나게 많다. quit quitall launch reboot list runninglist isrunning list2 add [--name ] copy [--name ] --from remove rename [--name ] --title modify [--resolution ] [--cpu ] [--memory ] [--man..
· 리버싱
Nutty가 새롭게 이름이 Zeta로 바뀌었다. 근데, 소스코드가 완전 통째로 바뀌어서 기존에 만들어뒀던 nutty client 구현체가 무용지물이 되어버렸다. 아무튼 분석을 시작해보자. Nutty 시절에는 어플리케이션이 React native로 되어있었고, 별도의 보안 장치가 없어서 쉽게 디컴파일이 가능했었다. Zeta로 넘어온 후에는 React native + hermes로 되어있었다. Hermes란 React native에 최적화 된 자바스크립트 엔진이며, JS코드를 byte code로 컴파일해준다. hermes로 컴파일 된 바이너리는 Hermes-dec을 사용해서 디컴파일 할 수 있다. 근데 말이 디컴파일이지, 바이너리로 컴파일 된 파일을 디컴파일 해봤자 그다지 보기 좋게 나오진 않는다. JS코드..
0xff
'분류 전체보기' 카테고리의 글 목록 (3 Page)