Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

클라이언트 폴더 무결성검사 #29

Closed
chlrhkd4 opened this issue Oct 5, 2023 · 13 comments · Fixed by #32
Closed

클라이언트 폴더 무결성검사 #29

chlrhkd4 opened this issue Oct 5, 2023 · 13 comments · Fixed by #32

Comments

@chlrhkd4
Copy link
Contributor

chlrhkd4 commented Oct 5, 2023

종종 패치 중에 파일이 이상하거나, 변조되는것을 확인하기 위해 무결성 검사 기능이 있으면 좋겠다고 생각합니다.

기능은 Steam과 비슷하게, 유저가 원할때만 진행하며, 시간이 다소 오래걸릴수 있음을 인지(클라이언트 내 모든 파일을 검사해야함).

구현은 거상 FullClient 부터 최신 패치까지 확인 후 md5sum 으로 확인하는것이 괜찮을 것 같습니다.

어떻게 생각하세요?

@byungmeo
Copy link
Owner

byungmeo commented Oct 5, 2023

예전에 한 번 비슷한 건의가 오긴 했는데

서버를 하나 두지 않는 이상 FullClient + 최신 패치를 클라이언트마다 다운로드 받아서 체크해야 할텐데 이러면 새로 다운받아서 덮어쓰는게 더 좋지 않을까 싶고,
만약 하더라도 FullClient를 대규모 업데이트 할 때마다 최신 버전을 어떻게 잡을지가 관건일 것 같습니다

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 6, 2023

코멘트 감사합니다.

관련해서 고려 해보았는데, 만약 구현한다면 크게 두가지 옵션이 있을 것 같습니다.

  1. 거상 서버에서 클라이언트 + 패치 파일 다운로드 후 비교
  • FullClient 주소는 찾아내었습니다.
  • FullCIient 압축 해제 후, 지금 거상스테이션에서 하고있는대로 패치 적용 뒤에 파일 확인
    장점) 추가 작업 필요없음, 거상 서버에 있는 데이터로 확인
    단점) 이 작업은 시간도 오래 걸릴 뿐더러, 유저의 드라이브에 용량 필요함
  1. 버전 별 각 파일의 해시값을 깃허브에 저장 후 이것을 불러와서 확인
  • 코드에서 구현하셨다 싶이, 거상 패치파일 (숫자 다섯자리)에는 인덱스, zip파일이름, 원본파일이름, 경로, 체크섬 등이 들어있습니다.
  • 제가 확인했을때 거상 패치 중 파일 다운로드 후 체크섬을 확인하여 무결성을 확인하는 것으로 보입니다.
  • 이 체크섬을 그대로 사용하고 싶으나, 어떠한 알고리즘으로 체크섬을 확인하는지는 찾아내지 못하였습니다.
  • 대신 3대 이상의 컴퓨터에서 client 패치 후, 각 파일의 hash값을 확인하여 리스트를 만들고 이를 업로드 합니다.
  • 해당하는 버전의 파일이 있는 경우, 그 파일을 불러와 hash값을 확인합니다. (예시 파일 업로드 해놓겠습니다)
    장점) 유저 클라이언트 내에 있는 파일을 불러와 해시 검사만 하면 되기때문에 빠름
    단점) 해당 정보를 직접 업로드 필요함. 수작업 필요.

한번 고려해주시면 감사하겠습니다.

매번 감사합니다.

report.md5.txt

@byungmeo
Copy link
Owner

byungmeo commented Oct 6, 2023

1번 옵션은 완전히 제외해도 될 것 같습니다.

2번 옵션에 대해서 조금 알아봤는데
https://emn178.github.io/online-tools/crc32_checksum.html
이 사이트에서 클라이언트 파일의 체크섬 값을 CRC-32 방식으로 추출한 후
결과로 나오는 16비트 값을 10진수로 변환하니
거상 패치 정보 파일의 ZIP CRC 값과 같은 값이 나온다는 것을 알 수 있었습니다.

깃허브에 저장하는 방식 보다는
이걸 힌트로 거상 스테이션에서 매 패치 시마다
info 파일을 활용해서 체크섬 검사를 수행할 수 있지 않을까 예상이 됩니다.

만약, 매 버전마다 Full Client의 info 파일도 추출할 수 있다면 (제가 아직 알아보지 않았습니다)
별도의 옵션으로 Steam처럼 전체 파일 유효성 검사도 수행할 수 있을것같은데
만약 그럴 수 없다면 info파일을 이용해 특정 버전을 시작으로 현재 클라이언트 버전 까지의 패치 파일 유효성 검사 정도는 옵션으로 넣을 수 있을 것 같습니다.

의외로 희망이 보이네요..

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 6, 2023

ZIP CRC가 도움이 될지는 몰랐네요 :)

매 버전마다 Full Client의 인포파일은 따로 없는것같고 - 거상에서 Full Client를 자주 업데이트 해주지 않는 것 같습니다..

다만 지금 제가 찾아보고 있는건, 7z 파일 자체에 header 혹은 footer에서 파일 리스트 및 CRC 데이터를 가져올 수 있는지 보고있습니다. 거기에 거상 서버 내에 있는 7z파일의 header 와 footer만 가져올 수 있다면 info파일이 없더라도 이 부분을 참고할 수 있을 것 같습니다.

찾게되면 말씀드릴게요 :)

@byungmeo
Copy link
Owner

byungmeo commented Oct 6, 2023

@chlrhkd4
번외로 폰트 관련한 문제가 notoSans 브랜치에서 해결되었고
기존에 폰트 문제 때문에 사용했던 CustomControl 들을 전부 MaterialControl로 교체 하는 작업을 진행 중입니다.

아마 무결성 검사 기능 건이 마무리되는대로 1.5 버전 릴리즈가 이루어질 것 같은데
혹시나 그 전에 릴리즈 버전 사용을 원하시면
아래처럼 설정하시고 publish 후 사용하시면 될 것 같습니다.

image

자동 업데이트 다운로드 기능이 없는 만큼 가능한 패치를 몰아서 하는 편이라
양해 부탁드립니다 ㅎㅎ..

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 6, 2023

넵 편하신때 업데이트 부탁드리겠습니다 👍

추가로 7zip파일 일부만 받아서 확인해보았을떄 파일 이름, 사이즈 및 CRC값은 확인 가능한것으로 파악됩니다.

아래의 왼쪽은 현재 클라이언트(최신버전), 오른쪽은 거상 서버에서 헤더와 푸터만 가져오고 나머지는 더미데이터를 넣은 자료입니다.
image

보시게되면 Gersang.exe 파일 같은 업데이트 된 파일은 CRC가 다르나, 이외 D3DX9_*.dll 같은 파일은 CRC가 같은 것을 확인 할 수 있었습니다.

결과적으로, 거상 서버에서 7zip의 일부분만 다운받아 파일리스트를 복원하고, 이것 + 패치를 통해 무결성검사에 대한 희망이 보이네요.

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 7, 2023

위의 방법으로 코드 작성 중 입니다.

혹시 따로 진행하시는 중이시면 말씀해주세요.

@byungmeo
Copy link
Owner

byungmeo commented Oct 7, 2023

@chlrhkd4
궁금한게
풀 클라이언트를 다 다운받지 않고
헤더만 다운받을 수 있나요?

이게 어느정도 거상 다운로드 서버 쪽에도 부하가 가지 않는 방향으로
지향을 하고 있어서 좀 민감한 사항입니다.
그래서 용량 작은 info 파일을 찾은 거구요.

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 7, 2023

@byungmeo
네 가능합니다.

제 Fork에서 IntegrityCheck브랜치에 IntegrityChecker모듈을 보시면,

HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, FullClientInfo.Url); requestMessage.Headers.Add("Range", FullClientInfo.CreateRange(0, 100)); //Get 100 bytes from server first

메세지에 Range를 줌으로서 일정 바이트만 가져올 수 있습니다.
이것으로 헤더와 풋터만 가져올 예정입니다.

혹시 걱정되는 부분 있으시면 말씀해주세요

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 7, 2023

@byungmeo

관련 테스트 스크립트 추가합니다.

7zip 파일의 헤더인 32bytes 와 footer 1mb를 다운받고 그 사이는 더미데이터로 추가하는 스크립트입니다.

그럼 Gersang_Install.7z 파일의 내용을 볼 수 있을거에요.

downloader.zip

@byungmeo
Copy link
Owner

byungmeo commented Oct 7, 2023

@chlrhkd4
좋은 아이디어 같습니다
그러면 최종적으로는

  1. 헤더 정보 다운로드를 통해 Full Client 파일들의 CRC 획득
  2. 현재 클라이언트 버전과 Full Client 사이의 버전에 대한 CRC 정보는 패치 정보 파일을 통해 획득
  3. 무결성 검사 (손상, 누락, 불필요파일 등)

순으로 진행된다고 이해하면 될까요?

거상 Full Client 7zip 파일의 CRC 정보도 보기에 CRC32 같으니 수고는 덜겠네요.
패치 정보 파일의 Zip CRC값을 16진수로만 변환하여 합치기만 하면
거상 최신 버전의 Full Client CRC Set을 얻을 수 있을것같습니다.

아직 7zip 쪽 로직 작성 중 이시면
제가 패치 정보 파일을 통해서 CRC 획득 및 16진수 변환 작업까지는 가능할 것 같습니다.
필요하시면 말씀주세요!

추가로
master pull 받으시면 추가 기능 탭페이지가 새로 생길겁니다.
거기다가 유효성 검사 기능 버튼을 넣으면 될 것 같습니다.

수고 많으십니다~

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 8, 2023

@byungmeo

안녕하세요.

관련 구현은 현재 로컬에 있는 client 파일들을 읽어와서 CRC값 확인 및 Web에 있는 FullClient정보를 가져와서 CRC정보 확인까지는 문제가 없습니다.

다만, FullClient에서 정보를 가져온 후에, 현재 어떤 version의 클라이언트가 올라와 있는지 확인해야 다음 버전을 가져올 수 있는데요,

현재 제 생각은 local client(최신)가 32205 버전이면, 버전을 하나씩 낮춰가면서 vsn.dat 파일을 읽어오고, 이 파일의 CRC로 webClient의 vsn.dat파일 crc와 확인하여 검사하려고 하는데,

문제는 거상이 패치를 32200 이전 버전은 32012인데, 이것을 하나씩 숫자 낮춰가며 request를 던지면 너무 많은 request가 나와 걱정됩니다.

혹시 관련해서 정보 알고계신 것이 있는지요? -- 해결되었습니다

@chlrhkd4
Copy link
Contributor Author

chlrhkd4 commented Oct 8, 2023

readme.txt 경로 찾았습니다.

http://akgersang.xdn.kinxcdn.com/Gersang/Patch/Gersang_Server/Client_Readme/readme.txt

이걸로 파싱해서 패치 정보 받아오도록 할게요

@byungmeo byungmeo linked a pull request Oct 9, 2023 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants