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주일 정도의 여흥거리정도라고 보면 된다.
핵쉴드와 비교하면 약 반도 못 미치는 완성도라고 볼 수 있겠다. 개발자들이 리버싱을 할 줄 안다고 자부하는 것 같은데, 초보적인 수준이며, 개발을 더 잘한다. 몇명은 개발도 못 한다.
게임사님들, 핵쉴드 씁시다. 논클라봇 막으셔야지요 ^^

댓글 19개:

  1. 니마 팬이에요 싸인해주세요

    답글삭제
  2. 다른소식 들을수있을까요? 사인코드가 게임마다 구현을 다르게하는거같네요
    어떤건 메모리가 보호되고 어떤건 보호가 안되고 흠

    답글삭제
    답글
    1. http://reverselawliet.blogspot.kr/2015/11/1.html

      삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
    답글
    1. 작업장 관계자분께 포스트까지 써줄 의리는 없을 것 같고, 댓글로 간단하게만 말해줄게.
      난 사인코드 개발자들이 만들었을 실제 하트비트 로직엔 전혀 관심도 없고 알 필요도 없었어.
      사실 하드코딩 수준에 로직 하나만 가져오면 될거라 예상하고 있었는데, 사인코드가 더 어렵게 느껴진다고 말하는 걸 봐서 그것보단 복잡하게 해놨나 보네.
      근데 넌 그 개발자보다 못 나서 그냥 함정에 빠진거야..
      예상해서 맞춰볼게.
      1. 서버에서 인증 요청 -> 클라이언트 측에서 서버에서 보낸 암호화키/코드 등을 복호화/실행 후 결과값 서버에 재전송 -> 예상 결과와 다른 경우 클라이언트 연결 해제
      2. 서버에서 보내주는 암호화키/코드는 랜덤생성되거나 임의로 바뀔 수 있음.
      난 위 구조와 완전히 같은 모양일 거라고 99% 확신하고 있어.
      재밌지? 그 코드가 어느정도 수준일지 본 적도 없는 게 너무 잘 그려진다?
      개발자 생각까지 예측해볼게. "이렇게 만들어놓으면 우리가 인증코드 바꿀 때마다 해커놈들은 쩔쩔매겠지? ㅋㅋㅋㅋ멍청한놈들 내가 니들 머리 위에있어!"
      프로 리버서의 생각은 "얘는 왜 내가 지가 원하는 장단에서 놀아줄거라 생각하는거지? ㅋㅋㅋ 그 인증과정은 x3.xem이랑 다른 모듈들에 니들이 이미 구현해놨는데 뭣하러 내가 그걸 다시 따라 구현할까?"
      이 분야 개발자의 역량은 본인의 리버싱 실력에따라 좌우된다. 리버싱을 제대로 할 줄 몰라서 어느 부분에 신경을 써야 리버서를 괴롭힐 수 있는지를 잘 모르면 이렇게 농락당하는거야.
      자, 다시.
      사인코드 하트비트가 왜 쉽냐? 고생은 개고생해서 만들어놓은 서버사이드 인증루틴을 보지도않고 무력화가 가능하다는 그림이라서 허접하단 거다.
      도움이 됐니?

      삭제
    2. 다시 보니 너 말이 좀 이상하네?
      핵쉴드 뜯어보긴 했어?
      핵쉴드 하트비트를 만들어봤다는 듯이 말하면서 사인코드는 어려울 실력이다? 개소리도 유분수지.

      삭제
  4. 안녕하세요. 리버싱 엔지니어링을 접한지 두달된 신입입니다..

    다름이 아니라 XignCode가 so파일로 생성되어서 통신하는거 같은데..

    도중에 프로세스가 죽어버리면

    xigncode에서 죽이는건가요? xtrap.xem에서 죽이는건가요?

    부탁드립니다..알려주세요 ...

    답글삭제
    답글
    1. 뭐라는 질 잘 이해가 안되는데..
      프로세스 죽이는 코드라면 여러 모듈에 거쳐서 나뉘어있다. 그리고 프로세스가 죽은 시점에 break를 걸고 죽이는 코드가 어디인지를 찾는 시도는 하지 않길 바란다. 네가 어떤 걸릴만한 짓을 했는지 개발자 입장에서 생각해보고, 그걸 감지하는 코드를 예측해서 찾아봐.

      삭제
    2. http://duli.kr/xe/genymotion/1886 so파일이 어쩌고하는건 아마 이런 모바일게임과 관련있는듯 14년글임에도 불구하고 모바일게임에도 벌써쓰였는진 안드를 안써서 모르고있었는데.. 여튼 저런건 블루스택으로 pc에서 돌리는거(왜인진 모름 오토같은거 돌릴려고 그러는건가?) 막아놓은거 우회하는글일려나
      지금은 어떤수준일지 모르겠지만 작성자 글을 쭉 읽어보니 모바일은 뭔가 더 허술할것같은 느낌인데.. 시간난다면 모바일보안수준 관련글도 작성부탁해봄.

      삭제
  5. 음...도데체 어떻게 분석을 하신거죠??

    답글삭제
    답글
    1. 각 모듈 로드되는 것 브레이크걸고 추출가능하다. 그후 언패킹해서(언패킹이라고 하기 민망할 정도로 쉽다) 천천히 분석하면 된다.

      삭제
    2. 음...모듈 로드시키는 함수에 브포를 걸고 추출을 하셨다는거에요??

      삭제
    3. Getasynckeystate나 message박스 류 함수 호출하면 감지당한다. 핵카페에서 나온 DLL들이 워낙 저함수를 호출해대서 말이지요 ㅋ

      삭제
  6. 작성자가 댓글을 삭제했습니다.

    답글삭제
  7. X-trap에서 프로그램을 감지해서 강제 종료를 시켜 버리는데 이건 어떻게 회피가 가능할까요?
    프로그램 코드를 완전히 제거하고 오로지 종료버튼 한개만 구현을 해놔도 감지하고 종료를 시켜 버리는 군요. 다른 일체의 리소스나 코드는 없고 오로지 WinMain뼈대와 WinProc의 Initial부분에서 종료버튼이 들어가 있는 다이얼로그만 만듭니다. 다이얼로그 Proc에서는 종료버튼이 눌리면 프로그램을 종료하도록만 되어 있고요.
    이걸 감지해서 강제 종료를 시켜 버리는데 무얼 감지하는지 도저희 감을 잡을 수가 없습니다.
    일체의 문자열도 없습니다.
    Visual Studio 2008과 2015로 시도를 해봤는데 양쪽다 막히고요.
    CreateWindow, CreateDialog, DestroyWindow 딱 이 3개의 API만 사용했습니다.
    프로그램 개발은 API만 사용해서 개발하고 있습니다. 처음에 API로 몽땅 개발하다보니 C++로 넘어갈 수가 없네요.
    이걸 어찌 감별해내는지 어이가 없을 지경입니다.

    답글삭제