USFM(www.maplestorylab.com)에 오신것을 환영합니다! 카페규칙에 어긋나는 게시글은 자동 삭제되며 관련 게시물 작성자는 제재될 수 있습니다. |
> 패킷 정의
- 네트워크 작업에서 오가는 통신의 양을 보통 패킷이라고 합니다. 허나, 우리가 이 글에서 배우자 하는 패킷의 정의는 jpcap을 포함하여 자바어플리케이션을 이용한 네트워킹 기반의 패킷이라고 보면된다.
> 패킷은 어떨때 오고, 가는가?
- 딱히 상황은 정해져 있는게 아니다. 우리가 게임안에서 하는 모든 행동 하나하나가 패킷이 오고가는 상황이라고 보면된다. 깊히 말하자면 우리가 인터넷을 하는것 또한 패킷을 주고 받는다.
> 우리가 Decode 해야 할 패킷
- 우리가 복호화 시켜야될 패킷은 16진수(HEX)로 출력되는 패킷이다. 16진수는 0~16 즉 0 ~ F 까지 라고 보면된다.
(0~9 까지는 일반 숫자로 기입하며 10부터는 0A, 0B, 0C… 이런식으로 기입한다.)
> 본격 적인 패킷 복호화
Step1) 먼저 패킷은 이미 복호화가(MaplePacketCreator.java) 되어 있는 패킷을 기반으로 ( 새로 추가된 패킷이 아니라면 ) 분석을 하는것이 좋다.
Step2) getServerlist( 겟헬로는 로그가 없으니 양해 바람 ) 부터 가볍게 분석을 해보자. 그전 각 패킷의 사이즈를 미리 용어를 통해 알아보자.
write(byte*1) = 00 // 지정가능한 범위 : -128 ~ 127
short(byte*2) = 00 00 // 지정가능한 범위 : -32768 ~ 32767
int(byte*4) = 00 00 00 00 // 지정가능한 범위 : -2147483648 ~ 2147483647
long(byte*8) = 00 00 00 00 00 00 00 00 // 지정가능한 범위 : -9223372036854775808 ~ 9223372036854775807
아래는 내가 가지고있는 getServerList 이다.
보면 어지럽다. 하지만 위의 각 단위별 사이즈를 보니 대충 사이즈가 짐작가려 하는것 같지만, 대체 뭔지도 모를거같은것들이 수두룩하다. 우리는 대부분 저런생각을 느끼고 패킷을 포기하곤 한다. 하지만 시간을 조금만 투자해서 한번을 이해하면 평생 써먹을 수 있다는것을 각인시켜두자.
아래는 Serverlist의 로그이다.
Received SERVERLIST [000A] (359)
0A 00 00 06 00 53 63 61 6E 69 61 00 00 00 64 00 64 00 00 13 08 00 53 63 61 6E 69 61 2D 31 1F 05 00 00 00 00 00 08 00 53 63 61 6E 69 61 2D 32 EF 01 00 00 00 01 00 08 00 53 63 61 6E 69 61 2D 33 95 01 00 00 00 02 00 08 00 53 63 61 6E 69 61 2D 34 53 01 00 00 00 03 00 08 00 53 63 61 6E 69 61 2D 35 4C 01 00 00 00 04 00 08 00 53 63 61 6E 69 61 2D 36 99 01 00 00 00 05 00 08 00 53 63 61 6E 69 61 2D 37 61 01 00 00 00 06 00 08 00 53 63 61 6E 69 61 2D 38 58 01 00 00 00 07 00 08 00 53 63 61 6E 69 61 2D 39 5A 01 00 00 00 08 00 09 00 53 63 61 6E 69 61 2D 31 30 3E 01 00 00 00 09 00 09 00 53 63 61 6E 69 61 2D 31 31 83 01 00 00 00 0A 00 09 00 53 63 61 6E 69 61 2D 31 32 53 01 00 00 00 0B 00 09 00 53 63 61 6E 69 61 2D 31 33 71 01 00 00 00 0C 00 09 00 53 63 61 6E 69 61 2D 31 34 56 01 00 00 00 0D 00 09 00 53 63 61 6E 69 61 2D 31 35 56 01 00 00 00 0E 00 09 00 53 63 61 6E 69 61 2D 31 36 4C 01 00 00 00 0F 00 09 00 53 63 61 6E 69 61 2D 31 37 5A 01 00 00 00 10 00 09 00 53 63 61 6E 69 61 2D 31 38 62 01 00 00 00 11 00 09 00 53 63 61 6E 69 61 2D 31 39 7F 01 00 00 00 12 00 00 00 00 00 00 00
.....Scania...d.d.....Scania-1.........Scania-2?........Scania-3?........Scania-4S........Scania-5L........Scania-6?........Scania-7a........Scania-8X........Scania-9Z........Scania-10>........Scania-11?........Scania-12S........Scania-13q........Scania-14V........Scania-15V........Scania-16L........Scania-17Z........Scania-18b........Scania-19............
각 용어별 설명에 들어간다.
Received // 서버에서 패킷을 받았다.
SERVERLIST // 옵코드 이름이다. 하지만 이 이름은 패킷 스니퍼 안에 내장되 있는 이름이기 때문에 알아보기 쉽게 지정했다고 생각하자. 깊게 생각하면 머리아프다. 요즘버전에선 옵코드 이름은 전혀상관없다는점 유의하자.
[000A] // 옵코드 값이다. 보통 출력은 전부 4자릿수로 출력되는데 옆과 같은 경우 0x0A로 기입한다. 왠만한 초등학생 3학년의 수준이 아니면 000A 에서 0x0A로 바뀐거에 대한 차이점을 못찾을순 없을것이다. 대강 어떻게 쓰는지 때려 맞출 수 있다.
(359) // 패킷의 사이즈이다. 359byte가 뽑혔다.
0A 00 00 06 00 53 63 61 6E 69 61 00 00 00 64 00 64 00 00 13 08 00 53 63 61 6E 69 61 2D 31 1F 05 00 00 00 00 00 08 00 53 63 61 6E 69 61 2D 32 EF 01 00 00 00 01 00 08 00 53 63 61 6E 69 61 2D 33 95 01 00 00 00 02 00 08 00 53 63 61 6E 69 61 2D 34 53 01 00 00 00 03 00 08 00 53 63 61 6E 69 61 2D 35 4C 01 00 00 00 04 00 08 00 53 63 61 6E 69 61 2D 36 99 01 00 00 00 05 00 08 00 53 63 61 6E 69 61 2D 37 61 01 00 00 00 06 00 08 00 53 63 61 6E 69 61 2D 38 58 01 00 00 00 07 00 08 00 53 63 61 6E 69 61 2D 39 5A 01 00 00 00 08 00 09 00 53 63 61 6E 69 61 2D 31 30 3E 01 00 00 00 09 00 09 00 53 63 61 6E 69 61 2D 31 31 83 01 00 00 00 0A 00 09 00 53 63 61 6E 69 61 2D 31 32 53 01 00 00 00 0B 00 09 00 53 63 61 6E 69 61 2D 31 33 71 01 00 00 00 0C 00 09 00 53 63 61 6E 69 61 2D 31 34 56 01 00 00 00 0D 00 09 00 53 63 61 6E 69 61 2D 31 35 56 01 00 00 00 0E 00 09 00 53 63 61 6E 69 61 2D 31 36 4C 01 00 00 00 0F 00 09 00 53 63 61 6E 69 61 2D 31 37 5A 01 00 00 00 10 00 09 00 53 63 61 6E 69 61 2D 31 38 62 01 00 00 00 11 00 09 00 53 63 61 6E 69 61 2D 31 39 7F 01 00 00 00 12 00 00 00 00 00 00 00
위 구간은 16진수(HEX)로 인코딩된 로그이다. 이걸 다시 우리는 디코드를 하는것이다.
.....Scania...d.d.....Scania-1.........Scania-2?........Scania-3?........Scania-4S........Scania-5L........Scania-6?........Scania-7a........Scania-8X........Scania-9Z........Scania-10>........Scania-11?........Scania-12S........Scania-13q........Scania-14V........Scania-15V........Scania-16L........Scania-17Z........Scania-18b........Scania-19............
이건 위 로그에 대한 HEX to String 값이다. 몇몇은 알아볼 수 있게 뽑혔지만 나머지는 알 수 없는 값들이다. 이것이 같이 뽑혀 나오는 이유는 자세힌 모르지만, 개발자를 위한 작은 배려라고 봐도 된다.
우리가 필요한건 16진수로 인코딩된 로그를 기반으로 저 위 패킷에 짜맞춤 하는것이다. 다음 절차를 밟아보자.
Step3) 패킷 복호화
0A 00 // Opcode
00 // serverID
06 00 6E 53 63 61 69 61 // serverName 메이플아스키스트링 맨앞 06 00(6바이트 00 한개수치당 1 바이트) 6E 53 63 61 59 61
00 // flag 깃발이다 이벤트 마크, N마크 ,H마크 등..
00 00 // 이벤트 메세지 이다. 메이플아스키 스트링은 값이 없어도 00 00 short크기를 반환한다.
64 // 64(10진수:100)값이다.
00 // 0값이다.
64 // 64(10진수:100)값이다.
00 // 0값이다.
00 // 0값이다.
13 // lastChannel 마지막 채널이 13이란건데 13은 10진수로 19이다. 즉 채널은 19개란소리.
/* for문이다. 위에 lastChannel 만큼 반복한다. 즉 19번을 반복한다. */
08 00 53 63 61 6E 69 61 2D 31 1F 05 00 00 00 00 00 // 1 채널
08 00 53 63 61 6E 69 61 2D 32 EF 01 00 00 00 01 00 // 2 ''
08 00 53 63 61 6E 69 61 2D 33 95 01 00 00 00 02 00 // 3 ''
08 00 53 63 61 6E 69 61 2D 34 53 01 00 00 00 03 00 // 4
08 00 53 63 61 6E 69 61 2D 35 4C 01 00 00 00 04 00 // 5
08 00 53 63 61 6E 69 61 2D 36 99 01 00 00 00 05 00 // 6
08 00 53 63 61 6E 69 61 2D 37 61 01 00 00 00 06 00 // 7
08 00 53 63 61 6E 69 61 2D 38 58 01 00 00 00 07 00 // 8
08 00 53 63 61 6E 69 61 2D 39 5A 01 00 00 00 08 00 // 9
09 00 53 63 61 6E 69 61 2D 31 30 3E 01 00 00 00 09 00 // 10
09 00 53 63 61 6E 69 61 2D 31 31 83 01 00 00 00 0A 00 // 11
09 00 53 63 61 6E 69 61 2D 31 32 53 01 00 00 00 0B 00 // 12
09 00 53 63 61 6E 69 61 2D 31 33 71 01 00 00 00 0C 00 // 13
09 00 53 63 61 6E 69 61 2D 31 34 56 01 00 00 00 0D 00 // 14
09 00 53 63 61 6E 69 61 2D 31 35 56 01 00 00 00 0E 00 // 15
09 00 53 63 61 6E 69 61 2D 31 36 4C 01 00 00 00 0F 00 // 16
09 00 53 63 61 6E 69 61 2D 31 37 5A 01 00 00 00 10 00 // 17
09 00 53 63 61 6E 69 61 2D 31 38 62 01 00 00 00 11 00 // 18
09 00 53 63 61 6E 69 61 2D 31 39 7F 01 00 00 00 12 00 // 19
00 00 00 00 00 00 // byte 6개
위는 내가 분석한 getServerList이다.
바뀐 값은 딱 하나. 마지막 mplew.writeShort(0); 에서 mplew.write0(6); 으로 바뀌었다.
즉 아래와 같이 정리할수 있다.
이러면 분석은 끝났다. 완성후의 패킷은 아래와 같다.
○ 제로바이트만 연속일 경우.
Ex) 00 00 00 // 이런식의 0크기의 바이트가 3개 일경우(즉 byte,short,int,long 처럼 갯수가 정해지지않은것)
- > write0(3);
Ex) 00 00 00 00 00 00 00 00 00 00 // 이런건 어떻게 하겠는가? 여러가지 방법이 있지만 많이쓰는 방법은 여러가지 이지만 내가 꼽은건 세 가지 이다.
1. 첫 번째
writeLong(0);
writeShort(0);
2. 두 번째
write0(10);
3. 세 번째
writeShort(0);
writeLong(0);
- 주의할점은 무조건 패킷은 저렇게 크기만 맞춰서 되는게 아니다. 패킷은 바뀌는 값이있다. 바뀌는값을 저렇게 크기만 맞출려고 대충대충 처리하다간 올바르게 동작하지 않는다. 그렇기 때문에, 두 세번 뽑아보고 그게 계속 바뀌지 않는다면 그때서 저런식으로 작성하자.
이 작성자의 게시글더보기
|
ex_plorer__ 주소노출은안대는걸로알고있습니다.
출처는저는잘몰라서 ㅎ
일딴적을게욤 출처:익스트림개뿔ex_plorer__ 어떤거말하시는거임?
ex_plorer__ 저가태풍이라는거어케아셧음?
'게임 관련 정보 > @USFM' 카테고리의 다른 글
옵코드(핸들러)에 대해서 정확히 파헤쳐 봅시다. / Projecter(alslwjd12) (2) | 2012.12.28 |
---|---|
버전업할때팁 / Projecter(alslwjd12) (0) | 2012.12.28 |
패킷강의 기초적인버프스탯을 하여보자 / Projecter(alslwjd12) (0) | 2012.12.28 |
패킷강의 / Projecter(alslwjd12) (0) | 2012.12.28 |
포토샵 못해도 상관없다! 1분이면 간지나는 명함만들기 / 산타하요(ca_hayo) (0) | 2012.12.28 |