코딩 범고래의 해저동굴

내가 좋아했던 게임을 위한 파반느 (2) ~ 서바이벌 프로젝트를 내 로컬에서 ~ 본문

Game

내가 좋아했던 게임을 위한 파반느 (2) ~ 서바이벌 프로젝트를 내 로컬에서 ~

코딩범고래 2026. 10. 16. 22:57

빌드에 성공하고 서버를 띄웠더니 콘솔 맨 윗줄에 이런 게 찍혔다.

 
Failed to load iosocketdll.dll. Make sure you included iosocketdll.dll and logdll.dll.
WSAStartup success
Login Server: listen_socket success
Login Server: listening on port 21000
----- Server Started -----

 

찝찝해서 "이건 진짜 무시해도 되는거야?" 하고 물어봤다. 클로드의 답은 이랬다.

 

"네 무시해도 돼요! 저 dll들은 로깅(기록) 기능인데 없어도 서버 동작엔 문제없어요."

 

이 말을 믿은 대가는 꽤 비쌌다. 근데 그건 좀 뒤의 얘기고, 일단 클라이언트부터 내 서버로 붙여야 했다.

 

클라이언트가 자꾸 사설서버로 간다

클로드가 처음에 알려준 방법은 서버 소스 tools 폴더에 있던 DxWnd라는 툴의 Generic IP Bind Patcher였다. 소켓 연결을 가로채서 127.0.0.1로 돌려준다고 했다.

시키는 대로 하고 게임을 켰더니 로그인이 됐다. 그것도 예전에 사설서버에서 쓰던 내 아이디로. 아이템까지 그대로 있었다.

 

엉...?

 

Login32 콘솔에는 로그가 한 줄도 없었다. 그냥 원래 사설서버에 잘 붙어서 놀고 있었던 거다.

그 다음부터 클로드의 제안이 줄줄이 나왔다.

  • iosocketdll.dll 안에 IP가 암호화돼 있다며 dinput.dll로 교체하자 → 똑같음
  • iosocketdll.dll 이름을 바꿔보자 → IOSocketDLL.dll이 없어 코드 실행을 진행할 수 없습니다, 게임이 아예 안 켜짐
  • sp.exe 안의 211.233.70.51 문자열을 127.0.0.1로 바꾸자 → 똑같이 사설서버로 감
  • config 폴더의 bef 파일을 XOR로 복호화해서 IP를 바꿔 넣자 → 역시 똑같음
  • 그러다 결국 나온 말은 이거였다.

“Proxifier는 특정 프로세스의 트래픽을 강제로 다른 IP로 리다이렉트하는 도구인데...”

 

여기서 좀 짜증이 났다.

"아니 그 방법은 하기 싫어. 아까 말했듯 추가적인 도구를 깔고 하는게 아니라 이 사설서버 운영자처럼 내가 아이피를 바꿔서 하고싶다니까?"

 

친구들한테 깔아줄 때 “DxWnd 켜고, 프록시 깔고...” 이런 걸 시키고 싶지는 않았다. 사설서버 운영자는 분명 클라이언트만 배포했고, 그 클라이언트는 그냥 실행하면 운영자 서버로 붙는다. 그럼 답은 클라이언트 안에 있을 거라고 생각했다.

놀자.exe랑 클래식.exe는 뭐가 다른데?

사설서버 클라이언트 폴더에는 서바이벌프로젝트놀자.exe와 서바이벌프로젝트클래식.exe가 같이 들어 있었다. 이름이 다르니 접속하는 서버도 다를 거라고 봤다.

"그럼 놀자.exe와 클래식.exe 는 무엇이 다른거야? 경험치 배율이나 그런걸 변경하려면 서버정보가 달라져야하는거아니야 하다못해 포트라도"

 

두 파일을 바이트 단위로 비교해 보니 딱 한 군데가 달랐다.

  • 클래식.exe → 08 52 00 00 = 21000
  • 놀자.exe → f0 55 00 00 = 22000

포트만 달랐다. 사설서버 운영자가 exe를 직접 고쳐서 서버를 두 개로 나눈 거였다.

그런데 이걸 알고 나서도 클로드는 다시 bef 파일 얘기로 돌아갔다. 그래서 한 번에 다 물어봤다.

"응 근데 너말대로라면 sp.exe를 뜯어서 놀자.exe 클래식.exe 이거 두개가 포트만 다르다며? 그렇다면 너도 sp.exe 에 있는 주소를 수정할 수 있는거 아니야? 나도 마찬가지고?
그리고 iosocketdll.dll이 실제로 그 역할을 하고 있는지는 어떻게 알아?
그 어렵고 복잡한걸 고작 사설서버 운영자가 했을까? 내생각엔 클라를 뜯어서 할거같아"

 

클로드가 그제야 iosocketdll.dll이 export하는 함수 목록을 까봤다. InitClientTCP 같은 함수들이 IP를 인자로 받는 구조였다. IP는 dll 안이 아니라 sp.exe가 넘겨주는 거였다. 결국 고칠 곳은 sp.exe가 맞았다.

HxD로 찾아도 안 나온다

HxD(헥스 에디터)를 깔고 sp.exe에서 222.121.132를 검색했다. 안 나왔다. 16진수 DE 79 84 33으로도,

리틀엔디안 33 84 79 DE로도 안 나왔다. 클로드는 또 "그럼 이 exe는 IP가 없는 거예요. bef로 돌아가야 해요"라고 했다.

"아니 너가 아까 포트가 다르다면서 (순화) 그건 어떻게 안거야"

 

포트를 찾았으면 IP도 그 근처에 있을 확률이 높다. 포트가 있던 오프셋 주변을 뒤져보니 바로 나왔다.

 
mov dword ptr [0x810d67], 0x2e323232   ← "222."
mov dword ptr [0x810d6b], 0x2e313231   ← "121."
mov dword ptr [0x810d6f], 0x2e323331   ← "132."
mov dword ptr [0x810d73], 0x3135       ← "51"
mov dword ptr [0x810d78], 0x5208       ← 21000

 

IP가 문자열로 통째로 박혀 있는 게 아니라 4바이트씩 4조각으로 쪼개져서, 실행할 때 메모리에 한 조각씩 써지는 구조였다. 통째로 검색하면 안 나올 수밖에 없었다.

127.0.0.1이 안 들어간다

이제 바꾸기만 하면 될 줄 알았는데 이것도 세 번을 실패했다.

  • 1차: 127. 0. 0. 1 처럼 공백으로 채움 → "서버와의 접속에 실패했습니다. 계속 문제가 발생하면 helpsp@hanbitsoft.co.kr으로 문의해 주세요." (적어도 IP가 바뀌긴 했다)
  • 2차, 3차: null로 채우거나 0.0. 0.1로 자리를 맞춤 → 마찬가지로 연결 실패, Wireshark에 SYN 패킷조차 안 찍힘

방화벽도 열어보고 Test-NetConnection 127.0.0.1 -Port 21000도 돌려봤다. TcpTestSucceeded : True. 서버는 멀쩡했다.

결국 해결책은 단순했다. 조각이 4바이트씩 4개니까 각 조각을 4바이트로 꽉 채우면 된다. 그래서 127.000.000.001을 넣었다. 윈도우는 이것도 127.0.0.1로 알아듣는다.

 
222. → 127.
121. → 000.
132. → 000.
51   → 001

 

sp_patched5.exe를 실행하자 드디어 Login32 콘솔에 찍혔다.

 
Login Server: Accept Client with IP:127.0.0.1
Client Trying to Login with
ID: test
PW: test1234

 

무야호~

 

하지만 무야호도 잠시... 는 다음 편에..

 

Comments