Post

How to check license on 010 editor ?

How to bypass 010 Editor license check logic

How to check license on 010 editor ?

Introduction

아래 내용은 연구와 공부 목적으로 진행한 것으로 이를 악용하거나 다른 의도로 사용하는 것은 불법입니다. 리버싱 자체는 불법이 아니지만 이를 이용하여 악의적으로 이득을 취하거나 악용하는 것은 불법이며 이는 당사자에게 책임이 있습니다.

무엇인가를 만드는 것도 재밌지만 누군가 만든 것을 역으로 깨부숴나가는 것도 정말 흥미로운 일이다. 대다수의 소프트웨어는 공개되지 않는다. 오픈소스의 세계라 할지라도 유료 소프트웨어는 여전히 있고 그중에서 페쇄된 소프트웨어도 있다.

개발자 관점에서 생각하는 것을 현실화하고 만드는 것이 매력적이지만 리버싱하는 입장에서는 베일로 가려진 소프트웨어를 뜯어내어 가공된 소프트웨어로 다시 만드는 것 역시 매력적이다.

이번에 한국에 길고 긴 연휴가 다가와 이때 시간이 많이 확보되어 미뤄놨던 TODO 리스트들을 하나씩 해보고 있었다.

그중 하나는 악성코드이다. 악성코드 분석과 이를 탐지하는 엔진을 개발할 때 헥스 에디터는 굉장히 유용하다. 이때 사용하는 것은 010 Editor (이하 010) 를 주로 사용한다. 라이센스를 1년마다 갱신하는데 연구와 학습 목적으로 010 이 라이센스를 검증하고 인증하는 전 과정을 들여다보고 우회하는 단계까지 진행해보려고 한다.

What is that

이번에 살펴볼 것은 010 은 유료 hex editor 이다. 무료 30 일 사용 버전이 있지만 돈 주고 풀로 사용해보는 것을 권장한다.

010 은 바이너리를 분석하는데 굉장히 용이하고 커스텀도 지원하여 여러가지 바이너리를 살펴볼 때 파워풀한 헥스 편집기이다.

이를 사용하려면 초기에 사용자명과 라이센스 번호를 입력해야 하는데 이를 잘못 입력하거나 유효하지 않은 정보를 입력하면 활성화되지 않는다.

일반적으로 라이센스가 인증되지 않는다.

팝업 창을 통한 CheckPassword 살펴보기

해당 010 을 IDA 에서 열어보고 라이센스 검증 로직을 찾아본다.

유효하지 않은 라이센스라고 팝업으로 알려줄 때 문자열을 IDA 에서 찾아간다.

1
.rodata:00000000009105E8	000000D8	C	010 Editor has detected that you have entered an invalid license. Please check to see if your license is entered correctly and try again. If this problem persists, please visit 'https://www.sweetscape.com/support/'.

위와 같이 팝업 창에 노출되는 문자열을 찾아볼 수 있다. 이를 참조하는 곳을 찾아가본다.

아래는 문자열을 참조하는 함수 CheckPassword 이며 일부를 참고해보면 안에서 인증이 이뤄지는 걸 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                v33 = TFormRegister::ValidateLicenseOnline(this, 0);
                if ( v33 >= 0 )
                {
                  if ( !v33 )
                  {
                    v95 = (volatile signed __int32 *)QString::fromAscii_helper(
                                                       (QString *)"010 Editor has detected that you have entered an inval"
                                                                  "id license. Please check to see if your license is ent"
                                                                  "ered correctly and try again. If this problem persists"
                                                                  ", please visit 'https://www.sweetscape.com/support/'.",
                                                       (const char *)0xD7,
                                                       v34);
                    R_ShowWarning((const QString *)&v95);

위와 같이 라이센스가 유효하지 않을 때 팝업 창에서 확인했었던 문자열을 볼 수 있다.

ValidateLicenseOnline 살펴보기

ValidateLicenseOnline 가 반환하는 값이 0 보다는 같거나 크되 그리고 두번째 조건에서 0 일 때 해당 문자열 팝업이 보여지는 것으로 보인다.

해당 조건으로 들어가기 전에 간략하게 ValidateLicenseOnline 를 확인해보면 온라인 링크에서 라이센스를 인증받는다.

1
2
  strcpy(v59, "https://www.sweetscape.com/");
  strcpy(&v59[27], "cgibin/010editor_check_license_9b.php?t=");

위와 같이 url 을 통해 라이센스를 인증 받을 수 있다.

CheckStatus 살펴보기

아래 부분에서 v32 에 대한 값이 219 가 아닐 경우 거대한 조건문으로 들어가는데 이를 PASS 하고 건너뛰어야 한다.

위에서 보는 것 같이 CheckStatus 의 반환되는 값에 따라 조건문에 진입한다.

중간에 너무 커서 잘랐는데 조건문 끝에 라이센스 PASS 부분이 있다.

바이너리 패치

이를 참고해보면 아래와 같은 부분을 통해 패치할 수 있다.

1
2
.text:00000000007826FA                 js      loc_7830F7
.text:0000000000782700                 jnz      short loc_782770

그리고

1
2
.text:0000000000782788                 cmp     ebp, 0DBh
.text:000000000078278E                 jz     loc_782BB8

이 2 가지 섹션을 참고해볼 수 있다.

이를 파일 입장에서 바로 바이너리 패치를 한다면 아래와 같이 핵스 배열 패턴을 찾아야 한다.

편한 방법으로 파이썬이나 C 등 언어를 사용해서 스크립트 작성할 수 있다.

아래에서는 IDA 나 다른 헥스 편집기를 통해 탐색 배열을 참고해서 패치할 수 있다.

1
2
3
4C 89 E7 E8 C8 E6 FF FF  85 C0 0F 88 F7 09 00 00
75 6E 48 8D 3D DF DE 18  00 BE D7 00 00 00 E8 3D
D2 CD FF 48 8D AC 24 E0  01 00 00 48 89 84 24 E0

4C 89 E7 E8 C8 E6 FF FF 85 C0 0F 88 F7 09 00 00 75 6E 48 8D 3D DF DE 18 00 BE D7 00 00 00 E8 3D D2 CD FF 48 8D AC 24 E0 01 00 00 48 89 84 24 E0

1
2
3
49 8B 3F BA 71 4C 00 00  BE 0F 00 00 00 E8 BE 30
DC FF 89 C5 0F 1F 40 00  81 FD DB 00 00 00 0F 84
24 04 00 00 81 FD ED 00  00 00 0F 84 08 01 00 00

49 8B 3F BA 71 4C 00 00 BE 0F 00 00 00 E8 BE 30 DC FF 89 C5 0F 1F 40 00 81 FD DB 00 00 00 0F 84 24 04 00 00 81 FD ED 00 00 00 0F 84 08 01 00 00

위 해당 헥스 배열에서 볼드체로 표기된 부분을 참고해볼 수 있다. 패치하는 방법과 어느 부분을 패치할지는 다양하게 존재할 수 있다. 여기서는 위와 같이 2 곳의 조건문 부분을 패치할 것이다.

이를 수행하면 아래와 같이 아무 정보를 입력해도 항상 인증 우회가 되는 결과를 확인할 수 있다.

Bypass

여기까지 진행했을 때 패치된 바이너리를 실행하여 라이센스를 검증해본다.

실행했을 때 위와 같이 우회되는 것을 볼 수 있다.

Conclusion

단순하게 연습이나 공부를 위한 문제 풀이가 아닌 실제 사례를 통해 방대한 코드와 구조를 볼 수 있음에 이러한 경험은 정말 좋은 기회입니다. 악성코드를 분석하는 것 역시 비슷하며 오히려 악성코드에는 무수히 많은 히든 트랙들이 숨어있어 이를 발굴하는 것은 대단히 호기심을 자극합니다. 다시 정리해서 작성하자면 해당 글은 연구와 학습 목적으로 진행한 것이며 크랙한 소프트웨어를 사용 및 배포하는 것은 불법입니다.

About me

저는 소프트웨어 보안 연구원으로 개발하는 것도 좋아하지만 역공학으로 소프트웨어를 뜯는 것 또한 좋아합니다. 블로그만 만들어 놓고서 글도 쓰지 않다가 새로 블로그를 장만하여 주기적으로 쓰려고 했습니다. 살다보니 블로그를 쓰더라도 짧게 짧게 쓰다가 다시 길게 쓰고 대충 쓰고 자주 쓰고.. 이러한 무한 굴레를 반복하다가 오랜만에 휴가를 가져서 이러한 깊이 있는 학습을 진행하였습니다. 제가 하는 발자취에 관심있거나 또 다른 이야기에 관심이 있다면 이메일을 남겨주세요.

This post is licensed under CC BY 4.0 by the author.
If you find any errors, please let me know by comment or email. Thank you.

© Ruffalo. Some rights reserved.

I'm

Using the Chirpy theme for Jekyll.