c# winform 변조??

안녕하세요 c# winform으로 이것저것 개발해보다가 요즘 게임쪽에서 클라이언트 변조 이런얘기가 보여서 문득 궁금한점이 생겨서 질문 남겨봅니다.

C# 같은경우에 exe파일을 디컴파일하면 내부 소스가 그대로 보이는데 심지어 프로젝트로 export도 가능하더라구요
그래서 제가 확인을 해봤는데 코드 및 프로젝트 구조는 그대로 export되었는데 delegate는 따로 클래스로 빠지고 디자이너 코드는 못 내보내는 것 같았습니다. 아래같이 에러가 뜨더라구요
‘InitializeComponent’ 메서드를 구문 분석하지 못했습니다. 파서에서 다음 오류를 보고했습니다. ‘Invalid symbol kind: NamedType’. 작업 목록에 잠재적 오류가 있는지 확인하세요.

그래서 궁금한점은 만약 제가 winform으로 프로그램을 배포를 했는데, 이 프로그램에는 로그인을 해야 다음 동작을 진행 할 수 있다고 한다면

  1. 누군가가 디컴파일해서 로그인만 우회해서 다음 동작을 진행하게끔 할 수 있나요?? 로그인은 서버에서 진행을 합니다.
    → 만약 우회가 가능하다면, 이것을 막기위해서 어떻게 해야할까요??
1개의 좋아요

기술적인 솔루션이 있을 수도 있지만, 저 개인적으로는 "지연"시키는 것에 초점이 있는 것이지, "차단"시키는 것은 불가능하다는 생각입니다. 그 점에 입각하여 아래 의견을 드려봅니다.

Windows Forms를 비롯한 닷넷 계열 코드는 IL 코드를 사용하도록 되어있어서, 디컴파일은 물론 tampering (변조)가 다른 기계어 코드보다 월등히 쉽습니다. 이를 완화할 목적으로, 모든 코드를 처음부터 기계어로 컴파일하는 AOT 처리나 난독 처리를 하는 경우도 있지만, 궁극적으로 디컴파일이나 변조를 유의미하게 "지연"시키는 것이고, "차단"하는 것이 아닙니다. 그리고 이는 C/C++로 빌드한 애플리케이션이라고 해도 다르지 않습니다.

또 다른 측면으로, 로그인 같이 네트워크 동작을 포함하는 부분은 굳이 EXE 파일을 위변조하려는 성의를 들일 필요 없이, 네트워크 패킷을 스니핑하고 역공학 작업을 거쳐서 프로토콜의 구조를 파악하여 손쉽게 서버로 위조되거나 훼손된 패킷을 보낼 수 있습니다. 이를 "막을 수 있는 방법"은 그래서 없다고 보는 것이 정확합니다.

그래서 제가 보기에 적정하다고 생각하는 대응 방법은 위의 두 측면을 나눠서 보면 각각 다음과 같다고 생각합니다.

EXE 파일이나 디지털 사본 측면: 프로그램 파일 내에 중요한 정보나 민감 정보, 민감 자산은 포함되지 않도록 설계해야 합니다. 궁극적으로 개발자의 손을 떠나는 디지털 사본은 언제든 "위변조된다"고 믿는 것이 안전하며, 흔히 zero-trust 보안 모델이 이런 의미를 내포합니다. 그래서 EXE 파일이 어떻게 쓰이는지 알수 있도록, 애널리틱스 로그를 수집할 수 있도록 하는 것이 도움이 될 수 있습니다. (물론 이 또한 궁극적으로는 애널리틱스 로그를 보내지 않도록 끌 여지는 있습니다.)

네트워크 측면: 배포된 클라이언트를 변조했든, 직접 프로토콜을 분석해서 대응되는 클라이언트를 창작했든, 어디서든 신뢰할 수 없는 패킷이나 메시지는 유입될 수 있다고 가정하는 것이 좋습니다. (마찬가지로 zero-trust 보안 모델에 따른 해석입니다.) 그래서 유입되는 패킷이나 메시지가 "정당한 요청"인지, 그리고 "신원 식별"이 이루어졌고, 6하 원칙에 따라 로그를 서버 측에 기록해두는 것이 좋습니다.

그래서 위의 두 가지 측면에서 "수집한 데이터"를 토대로, 분쟁이나 사건이 발생하면, 법적 판단을 위한 "증거 자료"로서 제출될 수 있도록 관리하는 것이 필요하다고 생각합니다.

3개의 좋아요

일단 로그인 서버에서 client 의 위변조를 막는것 거의 불가능할것예요
웹의 경우 cors 라도 있지만 네이티브의 경우 그대로 정상 로그인으로 판단하죠
근데 제가 해커라면 굳이 프로그램을 디컴파일할것 같지는 않습니다.
그렇게 어렵게 하는니 단순히 통신 으로 들어가는 패킷 분석해서
위변조해서 통신으로 데이타를 얻겠습니다. 근데 이건 애초에 비번 이 털렸다는 얘기니
서버측에서 이상 신호에 대해서 모니터링 하면서 사람이 차단 관리하는 운영측면으로 풀어야겠죠
국내 내노라하는 온라인 게임도 그렇게 털려서 해적 서버 운영 되니까요
그리고 시큐어 코딩을 하면서 가이드만 충실하셔도 될것 같습니다.

4개의 좋아요

제 생각에도 위 두 분의 의견과 같습니다.

Desktop Application의 난독화 솔루션에 관하여 갑론을박이 많지만, 저도 할 수 있다면 하는 것이 좋다는 주의입니다.

다만 차단이 아니라 지연인 것이죠.

잘 기억이 안나는데, 대표적인 Desktop Application인 게임 클라이언트같은 경우에는 언리얼 엔진으로 개발되었다면 소스코드를 수일 내로 싹 분석해서 올려두는 사이트도 있었던 것으로 기억납니다.

따라서 클라이언트에는 비지니스 로직에서 중요한 부분은 넣지 않는 것이 일반적입니다.

다른 얘기긴 한데 그래도 털릴 경우를 대비해서 요즘 모바일 게임들 같은 경우 경매장을 삭제하거나, 유저간 거래 기능을 의도적으로 개발하지 않는 경우가 있는데 이것은 해킹되었을 때 금전적인 문제 역시 최소화 하기 위함인 것도 있습니다. (그래서 계정거래를 하지만요)

3개의 좋아요

C나 C++로 만들어도 어셈블리 수준에서 리버싱하면 안될게 없을겁니다.
특정기능은 서버에서 처리하는 수밖에 없습니다.

통상 리버싱을 방지하기 위해,
pe packer를 통해 실행파일 압축으로 리버싱이 어렵게하거나
pe protector를 통해 리버싱 방지를 하거나 합니다.
상용 protector중에 ASProtect, Themida를 사용합니다.
카카오톡 pc버전이 Themida를 이용하는 것으로 알고 있습니다.~

3개의 좋아요

모두 답변 감사드립니다.

결국 난독화등 여러가지 방법을 통해 분석을 어렵게 함으로써
차단보다는 시간대비 분석에 드는 비용을 높여서 그만큼 분석할 가치를 떨어뜨리고,

네트워크 통신 시에는 암호화 및 보안에 신경쓰고 유사시 대응을 위한 로그를 가지고 있는게 최선이 되겠네요

감사합니다!

2개의 좋아요