2016년 3월 25일 금요일

싸인코드와 국내 클라이언트 보안 업계에 대한 이야기

"국내 게임보안솔루션" 하면 좀 열받는다. 남들 다 하는 던파 한번 하려고 했다. 켤 때마다 관리자 권한을 요구하며, 심지어 내 컴퓨터에선 변조 툴이 감지되었다며 무력화 없이는 게임을 켜는 것조차 불가능했다. 이 블로그의 개설 동기다.
 
일단 켜지면 내 기준에 전혀 신뢰할 수 없는 드라이버를 알림도 없이 시스템에 올린다. 그 드라이버 개발자를 믿고 내 컴퓨터의 전체 권한을 맡겨야 한다는 말인데, 유쾌할리 없다. 업무에 사용하는 모니터링 툴 같은 것들은 한 번 켜면 재부팅 전까지 감지 메세지를 띄우며, 일부 툴은 삭제하지 않으면 안 된다.
 
내부적으로 로그인 된 유저아이디를 입력받아 감지시 서버로 전송한다. 정확히 어떤 정보가 같이 전송되는지는 분석해보진 않았으나, OS 종류 등 적지 않은 정보가 전송될 것이다.
특정 악성 유저를 하드웨어ID 기반으로 차단하는 기능도 있다고 하니, 법적으로 '사용자를 식별가능한 개인정보'를 수집하고 있는 것은 명확해 보인다. 물론 나는 어떤 동의도 한 기억이 없다.
 
켤 때마다 아무 알림도 동의도 없이 몰래 모듈 업데이트를 진행하고, 그걸 관리자 권한으로 내 컴퓨터에서 실행시킨다. 싸인코드 업데이트 서버가 해킹당하면, 게임을 켜는 모든 PC가 동시에 좀비PC가 될 수 있는 멋진 환경이다. 이런 극단적인 해킹 시나리오는 생각보다 빈번히 현실에서 발생한다. 메신저의 업데이트 서버는 해킹당해도 어플리케이션에 관리자 권한이 없으니, 최악의 경우를 방지할 수 있지만 이런 보안솔루션의 경우엔 정말 얄짤없다. 유저 스스로 대비가 절대 불가능하다. 애초에 업데이트하고 있었는지도 모를 테니까.
 
수많은 API를 후킹해, 말 도 안되는 각종 호환성 이슈와 성능 저하를 발생시킨다. 최악의 경우 블루스크린이다.

백신 프로그램들은 바이러스로 부터 PC를 보호하지만, 이 프로그램은 사용자로부터 게임을 보호한다. 보호하기 위해 말도안되는 권한과 정보들을 요구한다. 정말 일반 사용자에게는 불편하기만 하고 한 점 도움이 안 되는 프로그램이다.
 
나는 이런 프로그램이 내 PC에서 돌아가는걸 원치 않는다. 관리자 권한을 요구하지 않는다면 모를까. 성능 하락을 각오하고 VM에 게임을 설치하면, 상당수는 VM에서 게임을 실행하는걸 허용하지 않는 댄다. 그래서 난 아예 국내 온라인게임을 하지 않는다. 국내 보안솔루션이 달려있을 거거든.
 
열받아서 포스트 몇 개 올리고 잊어버리고 있었더니, 최근엔 이 블로그가 수면 위로 떠올라 상당한 화젯거리인 모양이다.
http://jiniya.net/ng/2016/03/misunderstanding-about-xigncode/
싸인코드 블로그에도 마치 내 블로그를 겨냥한 듯한 해명글을 올리기도 하고 말이다. 대부분 맞는 말을 하고 있지만, 아쉽게도 내가 말하는 "나같이 선량한 유저를 괴롭히며 기술적 수준이 떨어지는 조악한 물건"임을 부정하지는 못 했다.

이 블로그는 현재 싸인코드 타도 의견의 어떤 신뢰할만한 출처로 사용되고 있다. 부분적으로 동의하지만, 방향이 잘못됐다. 타도해야할 건 정확히 싸인코드가 아니다.

정확히는, "게임 해킹 툴을 막기 위한 시스템 권한을 요구하는 보안 솔루션"이라는 그림 자체가 모순이다. 어떤 컴퓨터에서는 관리자 권한이 없는 사람도 있는 반면, 게임이나 단순 소프트웨어가 실행 시마다 관리자 권한을 요구한 후에 켜지는 것은 변명의 여지가 없는 설계 실패다.

그럼 어떤 게 맞는 그림이냐? 라는 답엔 해외 주요 온라인게임을 살펴볼 수 있다. 블리자드의 디아블로, 스타크래프트, 혹은 리그오브레전드, 마인크래프트, ... 등의 게임들은 싸인코드를 사용하지 않는다. 스타크래프트는 동기화가 끊어지면(즉, 클라이언트 변조 등이 일어나면) 게임을 무효화시키는 구조이고, 디아블로, 리그오브레전드, 마인크래프트 등의 게임은 모든 행동에 서버의 유효성 검사가 들어가기 때문에, 사실상 게임 해킹 툴이 아무런 의미가 없다. 그렇다면, 보안이 필요한 영역으로는 작업장 오토 정도가 남는다. 블리자드의 게임엔 작업장 오토 프로그램들이 쉽게 클라이언트를 변조하거나 따라만들 수 없도록 각종 클라이언트 코드, 리소스 의 위변조를 방지하는 서버사이드 기능들이 사용되고 있다. 즉, 자기 자신의 정보만 보호하면 되니, 사용자가 보안솔루션의 존재유무를 알 필요도 없고, 다른 프로그램과 하드디스크 검색을 위해 관리자 권한을 요구할 필요도 없다. 일반 사용자는 아무런 불편함이 없고, 해커만 힘들어진다.

국내의 이런 모순된 온라인게임 보안 솔루션의 산업적 요구를 만들어내는 1차적 원인은 게임 아키텍트 담당 핵심 서버 개발자에게 있다. 한 마디로, 개발사의 아키텍트가 싸지른 똥(설계상의 취약점)을 외주업체에게 맡기려다 보니, 온라인게임보안솔루션 산업에 수요가 생기는 것이다.

2차적 원인은 이런 수요를 통해 수익을 창출하려는 게임보안솔루션사에 있다.
이미 설계가 끝난 게임은, 워낙 방대한 소프트웨어여서 그 프로토콜을 뜯어고치는 것은 거의 불가능에 가깝다. 그리고, 소위말하는 핵유저 때문에 이러지도 저러지도 못 하는 진퇴양난의 상황에 있는 게임사들에게, 이들은 '사용자 컴퓨터의 루트킷과 같은 시스템 권한을 요구하는 말도안되는 프로그램'으로 게임사의 게임을 보호하도록 영업한다. 절대 "그거 설계 잘못이니까, 다음부턴 리그 오브 레전드처럼 설계하세요," 혹은 "검증된 보안 전문가를 고용하세요," 라고 말해주지 않는다. 대신, "우리랑 독점계약하면 좀 더 싸게 해드릴게요," 라고 말한다. 이미 게임보안솔루션사들도 자신들의 솔루션이 말도 안되는 모순에 걸쳐있다는 것을 안다. 하지만 돈이 되니, 드러내지 않고, 오히려 수익의 기회로 만드는 것이다. 이 과정에서 게임사와 사용자들이 우롱당한다.

이런 그림은 사실 국내 인터넷 뱅킹에 공인인증서와 수십가지 '보안 솔루션' 액티브X를 설치하게 만드는 은행과 보안솔루션사의 그림과 매우 흡사하다. "SSL쓰면 ActiveX 필요 없습니다." 라고 보안 솔루션이 필요 없다는 사실을 알려주면 돈을 떼먹을 수 없으니, 어떻게든 자사 솔루션을 과대포장해 도입을 유도하며, 은행은 "우리 보안솔루션 썼는데? 그래도 해킹당한거면 우리 책임은 아니죠."라는 법적인 목소리를 내기 위해 면피성 목적이 겹쳐 금융권 보안솔루션 사업이 성립되는 것이다.

싸인코드와 같은 종류인  게임가드, 핵쉴드와 비교해 보자. 게임가드는 2000년대 게임보안솔루션의 무법자 그 자체였다. 윈도우 XP는 드라이버 로드에 아무 제한이 없기에, 게임가드가 전용 드라이버를 올려 시스템을 완벽하게 장악한 뒤, 루트킷의 그것과 같은 기술로 게임프로그램에 영향을 줄 수도 있는 모든 요청을 차단한다. 다른 프로그램의 동작을 제한하고 어쩔 땐 오탐을 내더라도, 무조건 더 많이 감지하고 더 많이 막아냈다. 물론, 버그, 호환성문제, 심지어 해킹툴이 감지되면 일부러(해커들의 해킹 의욕을 꺽는다는 목적으로) 시도때도없이 블루스크린을 띄우는 악질적인 드라이버였다. 이런 깡패같은 짓을 유지한 기간은 길지 않았다.
윈도우7은 루트킷과 각종 악성코드로부터 운영체제를 보호하기위해 여러가지 시스템적 장치를 마련했다. 패치가드(드라이버 레벨 후킹 방어 시스템)와 서명된 드라이버만 로드를 허용하는 정책의 도입(루트킷 드라이버는 물론 게임가드같은 양아치 드라이버는 마이크로소프트가 서명을 절대 허용해주지 않아, 로딩이 불가능하다), UAC(관리자 권한) 시스템 도입이 그것이다. 게임가드는 한동안 MS가 드라이버를 서명해주지 않아 윈도우7 64비트 환경에서 사실상 무력화됐다. 그리고, 게임가드는 이 당시 잘못된 구조를 자각하고 각종 호환성 문제 등 사용자를 불편하게 할 수 있는 코드를 지우고, 블루스크린을 띄우는 짓은 절대 하지 않는다는 정책으로 들어섰다. 보안솔루션으로서 성숙한 것이다. 하지만, 완성도를 위해 필연적으로 포기해야했던 부분 - 해킹툴 탐지율때문에 사업성이 떨어져, 현재는 INCA사의 주력 매출상품이 아니다. 현재는 핵쉴드에 비해 나을 점이 거의 없다고 봐도 무방하다.
핵쉴드는, 시작할 때부터 성숙한 모양이었다. 국내 최고 백신 개발사이기 때문에, 바이러스분석팀 기술 수준의 리버싱을 할 줄 아는 인재들이 투입된 흔적이 보인다. 초기엔 탐지율도 낮고 무력화도 쉬웠으나, 호환성과 소프트웨어적 완성도에 특히 신경쓴 느낌을 지울 수 없다. 무력화에 대해서는 당시부터 지속적으로 강화를 거쳐, 엄청나게 무력화에 강한 구조를 가지게 됐다. 수치로 나타내보자면, 완전 무력화를 위해선 현업 바이러스분석팀에서 5년 구른 프로 리버서 기준으로 15에서 35일정도의 시간 소요가 예상된다(물론 재능에 따라 편차가 크다). 안정성과 오탐율 면에서, 단연 업계 1위 솔루션이라고 판단된다.
싸인코드는 초기 게임가드와 같은 모양새다. 백신사 수준의 리버서를 영입하지 못해, 기술적 수준은 형편없으며, 오탐율은 높고 서드파티와 호환성은 낮으며 개인사용자를 괴롭힌다. 개인적으로 유저들의 보안의식이 성숙해, 관리자 권한 요구 다이얼로그에 "아니오"를 누르기 시작하는 시점부터 양아치 짓을 그만두지 않을까, 하고 예상해본다.

3차적 원인은 무지한 사용자들에게 있다. 싸인코드 타도를 외치는 이들은 "개인정보 유출", "지속적인 디스크 스캔" 등을 말하고 있으나, 그건 중요한 문제가 아니다.
관리자 권한의 의미가 무엇이라고 생각하는가? UAC, 즉 관리자 권한 기능은 악성코드로부터 컴퓨터를 방어하는 일종의 필수이자 최종방어선 같은 매우 중요한 보안기능이다. 지속적인 윈도우업데이트와 신뢰할 수 없는 프로그램에 관리자 권한을 주지만 않으면, 컴퓨터는 이론 상 절대 감염되지 않는다.
드라이버 로드의 의미가 무엇이라고 생각하는가? 드라이버는 관리자 권한은 고사하고, 컴퓨터의 가장 높은 권한을 가지고 실행되는 프로그램이다. 이런 프로그램을 허락도 없이 시스템에 설치한다는 것은 말도 안 된다. 싸인코드 블로그는 "우리 드라이버는 게임이 종료되면 메모리에 상주되지 않으니까 아무 문제 없어요"라고 사용자들을 우롱하고 있으나,
드라이버의 의미는 그걸로 끝나는게 아니다. 내가 악성코드 제작자라면, 게임이 켜져있는 사이 로드돼있는 싸인코드의 드라이버 서비스에 통신을 요청해서, 혹은 싸인코드의 드라이버를 추출해내서, 유저권한으로 관리자권한을 얻는, 혹은 관리자권한에서 시스템권한을 얻는 취약점으로써 활용할 것이다. 내 의견으론 현재 싸인코드 드라이버는 요청자를 검증하지 않고 있어 사용자가 관리자 권한을 게임 프로그램에만 준 상황에서도, 악성코드가 이를 역으로 악용해 관리자 권한을 탈취하는 일이 충분히 가능해보인다. 싸인코드와 같은 준 루트킷 기능의 드라이버는, 그 존재 자체만으로도 시스템 보안의 큰 구멍이 된다. "가능하다면, 드라이버를 사용하지 않는다." 시스템 개발자들의 공통된 의견이다.
소프트웨어 제작자들에겐, "정보통신망 이용촉진 및 정보보호 등에 관한 법률"에 따라, 소프트웨어가 요구하는 시스템의 접근 권한, 소프트웨어의 용도 및 "삭제 방법", "특정한 개인을 알아볼 수 있는 부호·문자·음성·음향 및 영상 등의 정보(즉, 개인정보)"의 수집 항목, 이용 목적, 보유 기간을 고지해야 하는 의무가 있다. 글세, 난 아직까지 고지 받은 적이 없다.
"법률 검토"를 받았다고 주장하는데, 내가 법률 자문을 한다면, 소프트웨어가 "최종 사용자 소프트웨어 사용권 동의서(EULA)" 조차 가지고 있지 않고, 게임 소프트웨어의 EULA와 보안솔루션의 EULA의 개념을 혼용해 사용하도록 자문하진 않겠다.

결론?
그러니까, 무슨 디스크를 통째로 스캔해서 어디로 보낸다느니, 이런 이상한 선동하는애들 때문에 웰비아의 입장이 측은해진다는 말이다. 이런 선동당한 주장은 오히려 제대로 알고 하는 주장의 힘마저 잃게 한다. 제발 검증된 말만 가져다 쓰세요.
그리고, 관리자 권한 요구에 아니오를 누르는 개념찬 유저가 늘어나야, 웰비아같은 보안솔루션사들이 게임사에게 "드라이버를 사용하면 해킹툴을 더 잘 막을 수는 있으나, PC 보안에 구멍이 생겨 사용자의 반발이 매우 클 겁니다. 저희 소프트웨어는 드라이버를 사용하지 않습니다." 라고 말할 수 있게 된단 말이다. 알겠니?

이만 쓴다. 피곤하다.

2015년 11월 19일 목요일

사인코드 무력화에 대한 팁 #1

"어떤 게임엔 어떤 보호가 들어가고 어떤 게임엔 안 들어가는걸 봐서 게임마다 구현이 다른 것 같다" 이런 댓글이 달려서 하나 더 써본다.
사인코드는 개발사에게 사인코드 사용을 위한 SDK를 제공하고 있다.
그리고, 해당 SDK에서는 사인코드의 기능을 부분적으로 끄고 켤 수 있다.
물론 이런 함수들을 조작하면 사인코드의 특정 기능을 원하는대로  껐다 켤 수 있다.
네가 게임에 로그인한 아이디를 사인코드에 알려주는 알짜배기 기능도 있다. 네 개인정보를 뒤지다가 수상한게 발견되면 네 아이디랑 함께 서버로 쏘기 위한 기능이지.
그래서 결론을 말해주자면, 각 게임에 들어가 있는 사인코드는 전혀 안 다르다. 게임별로 SDK 에서 어떤 기능을 사용할지를 사인코드에 알려주면, 그에 따라 로드되는 모듈 종류만 다르다.
물론 모든 모듈은 매뉴얼매핑되기 때문에 그냥 메모리만 봐서는 감이 안 올거고, 매뉴얼매핑하는 함수를 찾아서 브레이크포인트를 걸고 언제 어떤 걸 로드하는지를 잘 봐.
무력화를 시도하려면 구조를 잘 알아야겠지? 이 함수가 그 초석이 될 거야.
실력이 좋다면 여기서 pure pe file을 뽑아낼 수도 있을 거야. 멍청하게 runnable한 바이너리를 추출할 수 있도록 해 놨거든.

덤프된 감지 모듈
추출해낸 주요 감지 모듈 중 하나
힘내.
나도 빨리 이런 프로그램이 내 컴퓨터에서 관리자권한 쳐먹고 돌 일이 없는 날이 왔으면 좋겠다.

2015년 11월 10일 화요일

사인코드 분석4

xhunter1.sys
게임 프로세스로의 접근을 막는 기능이 주된 기능.
또, 커널 모드에서 직접 API를 대신 호출해주어 API후킹을 무력화하는 기능, 크게 두 가지로 나뉨. 시스템폴더에 잠깐 만들어서 로드 후 삭제. 지우기 전에 복사한 다음 그냥 열면 모든게 다 나옴. 누누이 말하지만, 거의 대부분이 예제코드보고 따라 만든것 같은 퀄리티라 이런걸 내 커널에 올리고싶지가 않다.

프로세스 보호 부분
API후킹 무력화 부분


팁을 주자면, 이 드라이버를 다루는 데에 사인코드가 어떤 API를 쓰는지를 잘 생각해봐라. 아니면, 커널모드로 한 2바이트정도만 패치하는 것도 먹힌다. 한 번 해 놓으면 다음부턴 신경 안 써도 된다. 초기 개발자 한 명이 다 개발하고 그 이후론 유지보수만 간간이 하는 것 같다.
이건 뭐 더 쓰고싶어도 진짜 더이상 내용이 없다. 드라이버는 이게 끝이다.

사인코드 분석3

*2016 3.25추가*
하도 선동들을 많이 당해서, 직접 정정한다.
이 포스트 대부분의 내용은 위트를 위해 상당 부분 과장돼있다. 너네들, 기술적인건 읽지도 못해서 재미 없잖아, 맞지?
SSD수명, '네 생각만큼 미친듯이' 줄어드는 건 아니다. 그냥 일반 소프트웨어 사용보다 조금 더 많이 깎을 뿐이다. 요즘 SSD들은 평생 써도 write count 다 못 까먹는다는건 검색해보면 바로 나온다.
개인정보. 전체 디스크 스캔이란말은 한 적이 없다. 서버에 전송하는 파일? 있을수야 있겠지만, 난 언급한 바 없다.
정확한 정보 가지고들 이야기 해라.
**

이전글2가  하도 뭔소린지 모르겠다는 말들이 많아서 그냥 다시 흥미위주로 작성함. 원래는 뚫고 싶은 애들한테 팁주려는 거였는데, 그런애들은 댓글을 달던가 날 찾아서 알려달라고 하던가 해.
 아무튼 난 내 온라인게임생활을 방해하는 사인코드가 무척 싫기 때문에, 단점 위주로 잔뜩 알려줄거야.
 SSD 써? 그럼 게임 오래 켜놓으면 SSD의 수명이 비약적으로 줄어드는 효과를 누릴 수 있어. 왜냐면 주기적으로 디스크에서 감지할 프로그램을 싹 스캔하거든. 랜덤하게 한 30초에서 1~2분 사이에 한 번씩 스캔이라고 보면 돼.
 그 내용을 알려줄까?
 뭐 아무리 개인정보가 더이상 개인정보가 아닌 시대가 왔다지만 그래도..


네가 한 번이라도 켰던 모든 프로그램이나
네 컴퓨터에 존재하는 모든 바로가기들
네 컴퓨터에 연결 됐던 모든 하드웨어들
네 다운로드폴더, 내 사진, 내 연락처, 내 검색, 내 음악, 내 '동영상'..??


같은 정보를 주기적으로, 혹은 켤 때마다 읽고있는 걸 알면 좀 충격일텐데..?

관리자 권한 얘기를 해 볼까? 사인코드가 달린 게임을 켜면 관리자권한을 당연하다는 듯이 요구하잖아? 요즘 게임들은 내부컨텐츠로 인터넷을 띄우거나, 플래시, 동영상 등의 멀티미디어 파일을 많이 사용하지? 근데 그런 문서나 컨텐츠엔 악의적인 코드가 들어있는 경우가 많아... 그 코드가 관리자 권한으로 실행되는 순간 네 컴퓨터는 좀비행이야...

드라이버 이야기를 해보자.
xhunter1.sys
사인코드는 켤 때 xhunter1.sys 라는 드라이버를 네 컴퓨터에 모올래 설치하고 있어. 드라이버를 설치한다는 건, 그 사용자의 컴퓨터를 바닥부터 제어하겠다는 의미야. 맘만 먹으면 네 컴퓨터에 OS를 다시 깔아도 지워지지 않는 루트킷을 깐다던가,  다시는 켜지지 않게 만든다던가 하는 작업도 가능해. 일반 어플리케이션은 오류가 나면 그냥 꺼지지만 드라이버는 오류가 나면 블루스크린이 뜬다? 어? 하는 사람 있을거야. 이상하게 던파만 켜면 블루스크린이 뜬다던가, 하는사람들 몇 있던데. 얘는 메모리와 기타 자원을 계속해서 먹는 핵심 역할을 담당하고있기에, 재부팅하기 전 까지는 절대로 메모리에서 지울 수 없어. 이런거 설치해도 된다고 허용한 기억 있어?


다음편엔 뭘 써볼까..

2015년 11월 9일 월요일

사인코드 분석2


이전글에 이어 마저 써 보마.

 

핵심 기능

매뉴얼매핑


매뉴얼 매핑이 핵심 보안기능이라고 하면, 사실 개발자는 좀 부끄러워해야 한다. 부끄러우라고 쓴 거다. 매뉴얼 매핑이 뭔지 모르는 중생들에게 스피드왜건이 설명해주자면, 운영체제한테 보고하지 않고 몰래 dll을 로드하는걸 말한다.
즉 기능은 완전히 똑같이 작동하는데,








모듈 리스트
dll 리스트. x3.xem 한 개 밖에 안 보인다.

위 처럼 모듈 리스트에서는 숨겨지는 게 다다. 짝짝.
매뉴얼매핑이 뭔지도 모르는 핵쟁이들에겐 이걸 보면 "와 ㅅㅂ 코드가 분신술을 써 미쳤나봐!!"라고 감탄하게 만드는 부가 효과가 있다.




멋진 로딩 스플래시

 
스플래시 이미지
이런 멋진 스플래시 로딩 이미지를 띄워준다.


별 거 아닌거같지만 역할이 크다.
솔루션 이름 홍보와 게임사로 하여금 아 내 게임이 안전하게 보호받고 있구나 라는 인상을 받게 하는 마케팅적 효과, 툴키디 일부와 나같은 대다수의 선량한 일반사용자들을 부들부들 떨게 만드는 효과가 있다.
부가 기능으로 "아 왜 게임이 이렇게 안켜져"라고 짜증내는 유저들에게 "우리 보안솔루션이 한창 로딩 중이라 그래요. 좀 느리니 참아주세요."라고 알려주는 UI/UX적 효과, 게임사에게는 게임이 뚫려도 "우리 큰 돈 주고 싸인코드 썼는데요? 유저들한테 물어보세요"라는 면피성 보안 효과도 강하다.
잘 살펴보면 2~3픽셀 정도 프로그레스 바가 깨알같이 차오르는데, 그 때 매뉴얼매핑을 사용해 각종 감지 등에 관련된 잡다한 모듈을 로드하고 있는거다.


 

리버싱 방지(Anti reversing) 기능




void 어_어_ 왜_이런짓을()




void 참신하긴_하다()

나름 보안솔루션이기에, 리버싱당할 것을 염두에 두고 개발했는지 리버싱을 방지하는 차원의 함정코드가 꽤나 많이 보인다. 내 기억에 남아있는 것들은 한 가지도 빠짐 없이 구글에 Antireversing techniques 뭐 이런식으로 치면 나오는 예제코드 수준이다. 무력화하고 싶다면 너도 검색해서 좀 찾아봐라. 또, 좀만 수틀리면 이상한짓을 해서 프로세스를 죽이려는 참신한 코드들이 여기저기서 실행되는데, 그 중 가장 바보같은 것 들 몇가지를 첨부했다. 이해하는 사람만 크게 웃을 수 있다.
개 ㅄ같은데 왜 이딴걸 핵심기능이라고 적었냐고 물을 사람이 있을거다. 하지만 명백히 핵심기능이다. 리버서들로 하여금 깨알 웃음과 사인코드의 개발자들이 리버싱에는 재능이 전혀없다는 확신, 함께 무력화가 쉬울 것이라는 자신감을 주는 효과가 있다.



3편은 나중에. 귀찮다..
그리고 내가 쓰고싶어서 근질근질한 것들 많은데 썼다가 다 고칠까봐 그런건 공개표시로 쓰질 못하겠다. 궁금하면 개인적으로 물어봐.

2015년 11월 5일 목요일

Xigncode 분석

사인코드의 핵심 기능에 대한 코맨트와 무력화에 대한 힌트를 적어놓겠으니 재량껏 읽기 바란다.
댓글도 관리자 승인 후에만 달 수 있는 언론통제형 기술허세 블로그와 쓰이지도 않고 있는 특허를 내세운 마케팅에 낚여 최근 많은 게임들이 사인코드로 갈아타는 추세다.
구조부터 시작해보겠다.
 우선 사인코드는 인터페이스 모듈 x3.xem에서 각종 모듈들을 파일에서 가져오든, 웹에서 받아오든 한 후에 메모리에 매뉴얼 매핑해 올린다. 그 모듈들은 헤더만 붙이면 순수한 바이너리 파일로 뽑아 분석이 가능하다. 가장 많이 봐야할 서브모듈은 xbase, xclio, xobserver등이 있겠지만 역시 감지에 관련된 xez와 xkaga 이겠다.
 드라이버에 관해 언급하자면, 예제코드 보고 짠 수준의 설계다. 암호화도 없고 스니핑도 쉽다. Api후킹이 되어있을 경우를 대비해 커널모드에 winapi비슷하게 구현해서 호출하면 프로세스 핸들 등을 돌려준다.
 구조상 무결성검사에 매우 취약하다. 게임 코드 체크섬을 뜨는 시도도 안 보이고 그것을 서버로 보내는 정황은 전혀 없다. 스스로에 대한 체크도 서버사이드 기능은 없다. 하트비트 구현이 매우 쉽다는 의미이며, 논 클라봇 제작에 있어서는 사인코드는 있으나 마나 한 수준이라는 의미가 된다.
 칭찬을 좀 해주자면, dll injection에 관련된 감지는 조금 짜증난다. 수상한 스레드도 감지하는 듯하다. 허나, 아마추어스럽게 각종 시스템 dll들도 의심스럽다며 로그를 쌓는다.
 가장 개념찬 기능은 켜지도 않은 프로그램들의 실행 기록-정확히말하자면 prefetch와 바로가기등을 스캔해 로그도 쌓고 감지도 한다는 것이다. 저작권과 개인정보의식의 지옥이라는 한국에 걸맞는 기능이다. 당 기능은 해외 던파 커뮤니티에서 언급되며 유저들이 게임을 지우고 항의하는 등 논란이 컸었다.
 ( https://m.reddit.com/r/DFO/comments/30tcb6/xigncode_looks_at_all_files_youve_accessed_in_the/ )
또, 체크섬 기반의 탐지가 멍청함을 깨달았는지, 프로그램 내 리소스-이미지와 아이콘을 스캔하는 독창적인 기능도 있다. 짝짝.
 개인적인 의견으로는 개발자들에게 정신분열증이 있거나 협업도구를 쓸 줄 모르는 것 같다는 것이다. 각 모듈은 api후킹 방지나 스트링 처리가 제각각이다. 어떤 모듈은 자기가 쓰려는 api를 바이트어레이를 사용해 검색해내며, 어떤 모듈은 getprocaddress를, 어떤 모듈은 getprocaddress의 직접구현한 버전을 사용한다. 자랑이신 매뉴얼매핑 기술로 ntdll.dll을 매뉴얼 매핑한 후에 그 내부 api를 호출하기도 한다.
 모듈간 함수 호출 시 불편한 문제를 없애기 위해 많은 매서드들이 virtual method로 작성돼있다. 이는 양날의 검이다. 특히 초보 리버서들에게는 켜보기 전까진 무슨 매서드를 호출하는지 몰라 막막하지만, 다 분석이 되면 객체지향적 그림은 훨씬 잘 그려진다.
 스코어링을 사용한 매크로 탐지 기능도 보인다..
 Getasynckeystate나 message박스 류 함수 호출하면 감지당한다. ㅋㅋㅋㅋ
 개발자가 개발엔 재능이 영 없는지 초보적인 버그들이 많이 보인다. 자료구조를 어설프게 직접 구현하려다 생긴 문제나 매뉴얼매핑에 대한 지식 부족에서 나오는 실수 같은 것들.


총평.
중상.
어설픈 핵쟁이들 막기엔 잘 해놨다.
다만 false positive가 높은 기법들을 잔뜩 써놔서 나같은 일반사용자들에게 피해를 많이 준다. 겜하는데 변조 프로그램이니 뭐니 개소리 안 했으면 이런 글도 없었을거다.
리버싱을 제대로 하는 사람에게 이정도는 무력화하는 데에 1주일 정도의 여흥거리정도라고 보면 된다.
핵쉴드와 비교하면 약 반도 못 미치는 완성도라고 볼 수 있겠다. 개발자들이 리버싱을 할 줄 안다고 자부하는 것 같은데, 초보적인 수준이며, 개발을 더 잘한다. 몇명은 개발도 못 한다.
게임사님들, 핵쉴드 씁시다. 논클라봇 막으셔야지요 ^^