Closed devunt closed 8 years ago
2.4 - 2.5 넘어가는 시절에 매칭 알리미 같은 것을 생각해서 유사한 것을 만들면서 비슷한 이슈를 겪은 적이 있었는데요, (제가 만들었던 버전은 네트워크 패킷을 가로채서 분석하는 것이 아니라 게임 내 메모리를 읽어서 알아냈습니다.)
임무 찾기와 관련한 메모리를 살펴보면 보면 선택한 맵이 무작위 임무일 경우 선택한 맵 부분이 다음과 같은 값으로 채워졌던 것으로 기억합니다.
{
// 직접 맵을 선택한 경우 선택한 인스턴스 ID로 채워짐
"1": "무작위 임무: 저레벨",
"2": "무작위 임무: 고레벨",
"3": "무작위 임무: 주요 퀘스트",
"4": "무작위 임무: 길드 작전",
"5": "무작위 임무: 숙련자",
"6": "무작위 임무: 토벌전",
"7": "무작위 임무: 전장"
}
지금은 한참 패치가 많이 지난데다가, 3.1에서 매칭 알고리즘이 변경되어서 어떻게 변했는지 체크는 안 해보았지만, 이제와서 불가능할 이유는 없을 것 같습니다.
https://github.com/devunt/DFAssist/tree/v20160617.1-x64 본 프로그램의 최초 버전(v20160617.1-x64) 코드를 보시면 DFAssist도 메모리 리딩 방식으로 동작하고 있던걸 보실 수 있습니다만, 말씀하신 바이너리 버전별/아키텍쳐별 오프셋 차이로 인해 패킷을 이용하는 방식으로 선회한 전력이 있습니다. 온라인 게임의 특성상 결국 인게임의 메모리에 저장되는 데이터는 패킷에서 받은 정보일 확률이 높은 관계로 패킷쪽에서도 얻어올 방법이 있지 않을까 싶습니다만 제가 요즘 여러모로 바쁜 관계로 테스트 해 볼 시간이 부족하군요...
음 지금 읽어보니까 최초 버전은 메모리 리딩이 아니라 파판 패킷 처리 메서드를 후킹해서 처리했었군요... 4개월 전 코드라 기억이; 어쨌든 binary-dependant한 작업은 최대한 지양하려 합니다.
무작위 임무를 등록하면 서버에서 opcode 118(0x76)으로 등록한 무작위 임무 ID가 오는 것 같습니다.
확인한 결과는 다음과 같습니다:
(하위 바이트 <-> 상위 바이트)
숙련자: 05 03
레벨 60: 08 03
레벨 50: 02 FF
레벨링: 01 FF
토벌전: 06 FF
주요퀘: 03 03
길드 작전: 04 FF
전장: 07 07
note: 레벨 60이 8번으로 되어 있으니 하위 바이트가 https://github.com/devunt/DFAssist/issues/22#issuecomment-250163797 와 매우 유사한데, 상위 바이트는 왜 바뀌었고 목적이 무엇인지도 모르겠습니다. -_-; (메모리를 직접 읽어봐도 바뀐 값으로 되어 있습니다.)
상위 바이트는 무시하고 하위 바이트만 봐도 괜찮겠네요. 최소 데이터 단위가 2바이트가 아니라 1바이트일때도 있기 때문에...
88c5b2a8e5831dfc038b7d525427e8c2acd2cf1d 에서 구현, v20161001.2에서 릴리즈되었습니다. 감사합니다.
이런 저런 말이나 악용 사례들이 있어서... 무작위 임무의 내용까지 띄워주는게 과연 파판 커뮤니티에게 올바른 일인지 재고해봐야 할 것 같습니다. 근데 현재 매칭중인게 무작위 임무인지 알아내려면 또 거하게 삽질을 해야겠네요...