본문 바로가기
Reversing/리버싱 핵심 원리

[리버싱 핵심 원리] 8장, abex' crackme #2 분석

by Y06 2020. 11. 7.

08, abex' crackme #2 분석

첫 화면

Check 클릭

About 클릭

실행화면이다. 이름과 시리얼을 맞는 것을 입력해야 한다.

 

Visual Basic?

: 윈도우용 응용 프로그램을 개발할 수 있는 프로그래밍 언어

- 비주얼 언어는 화면 디자인을 위해 많은 줄의 코드를 작성하지 않고 미리 만들어진 도구를 이용하여 그림 그리듯이 디자인할 수 있는 언어

 

VB 전용 엔진

(1) VB 파일은 MSVBVM60.dll (Microsoft Visual Basic Virtual Machine 6.0)이라는 VB전용 엔진을 사용한다.

(2) VB 엔진의 사용 예를 들어보면 메세지 박스를 출력하고 싶을 때 VB 소스코드에서 MshBox() 함수를 사용한다.

(3) VB 컴파일러는 실제로 MSVBVM60.dllrtcMsgBox() 함수가 호출되도록 만들고, 이 함수 내부에서 Win32 API인 user32.dlMessageBoxW() 함수를 호출해주는 방식으로 동작한다.

 

N(Native) code, P(Pseudo) code

 

(1) VB 파일은 컴파일 옵션에 따라 N code와 P code로 컴파일이 가능하다.

  - N code: Native code로서 일반적인 실행 파일처럼 어셈블리를 통해 해석할 수 있는 방식이다.

  - VB의 경우 MSVBV60.dll 같은 VB 엔진에 의해서 실행되기 때문에 바로 스텀을 지나 Main()으로 가는 일반적인 실행     파일과는 차이점이 존재한다.

  - B code: 인터프리터(Interpreter)언어 개념으로서 VB 엔진으로 가상 머신을 구현하여 자체적으로 해석 가능한 명령       어(바이트 코드)를 사용한다.

  - VB의 P code를 정확히 해석하려면 VB 엔진을 분석하여 에뮬레이터를 구현하여야 한다.

 

(2) VB에서 사용되는 각종 정보들(Dialog, Control, Form, Module, Function 등)은 내부적으로 구조체 형식으로 파일에 저장한다.

 

간접호출

 

004010A0 주소는 IAT 영역이며, MSVBVM60.ThunRTMain() 함수의 실제 주소가 있다.

- VB 엔진의 메인 함수 : ThunRTMain()

 

암호화 루프

 

위에 루프 동작 원리를 간단하게 설명하면 __vbaVarForInit(), __vbaVarForNext()는 마치 linked list에서 next pointer를 이용해 다음 element를 참조하듯이 문자열 객체에서 한 글자씩 참조할 수 있도록 해 줌

- 정해진 횟수만큼 루프를 돌게 한다.

- loop count(EBK)를 세팅해서 정해진 횟수만큼 루프를 돌게 한다.

 

암호화 방법

 

1. 주어진 Name 문자열을 앞에서부터 한 문자씩 일기(총 4회)

2. 문자를 숫자(ASCII 코드)로 변환

3. 변화된 숫자에 64를 더함

4. 숫자를 다시 문자로 변환

5. 변환된 문자를 연결시킴