이번에 풀어볼 녀석

클릭하면 설치화면이 뜨며

설치 후 처음 시작할 때, 프로그램은 약간의 시간이 걸리며, 유일한 ID number를 적용중이라고 문구가 뜬다.

 

 

설치가 완료되면

PRO 버전이 깔린다
그리고 Register Key를 입력하라는 창이 뜬다.

프로그램이 등록되었는지 여부를 확인하는 작업을 한다는 것을 알았고, 이를 검증하는 코드가 있을 것이다.

분석을 시작해보자

 

PEiD로 확인

확인한 결과, 해당 프로그램은 Microsoft Visual Basic으로 컴파일된 파일이라는 점을 알았다.

 

VB(Visual Basic)에서는 프로그램 등록 여부 확인 작업DLL의 API에서 수행된다고 한다.

 

VB에서 쓰이는 가장 유명한 비교 API 함수는 아래와 같다.

 

__vbaVarTstEq

__vbaVarTstNe

__vbaVarCmpEq

__vbaStrCmp

__vbaStrComp

__vbaStrCompVar

 

 

 

먼저 함수에 BP를 거는 작업을 해보기 위해 이를 찾아본다.

Ctrl+N으로 Import 함수 찾아보기
찾았다

위에서 봤던 함수 6가지 중 4가지가 이 프로그램에 쓰였다. 

먼저, vbaVarTstEq API함수부터 살펴보겠다.

 

+) 함수를 호출하기 전에 스택을 통해서 필요한 Parameter를 전달하는데,

__vbaVarTstEq함수는 EDX, EAX를 스택에 push해서 파라미터로 쓴다고 한다.

 

 

BP 설정

BP를 걸어준 뒤, F9로 실행한다.

 

BP 설정 후 해당 구간까지 실행

 

F8로 한줄한줄 실행하다가 Serial Key로 보이는 값을 찾았다!

F8로 한줄한줄 실행하다가 Serial Key로 보이는 값을 찾았다.

재실행해본다.

 

 

아까 봤던 key 값 입력

아까 key 값 같이 생겼던 문자열을 입력한 후 OK 버튼을 눌렀더니

Registration이 성공적으로 이뤄졌다는 메세지가 뜬다.

 

 

이 이후로는 등록하라는 메세지 창이 뜨지 않고 잘 실행된다.

 

오늘의 대상
이를 실행하면 install 된다

 

ArtGem.exe 실행시

"UNREGISTERED! REGISTER NOW!"라는 문자열이 뜬다.

 

등록하지 않아도

계속 쓸 수 있도록 패치해보겠다.

 

 

일단, 저 창부터 없애야 겠다.

 

 

[OllyDBG] - [마우스 오른쪽] - [Search for] - [All referenced text strings] - [Search for text]로 찾아본다.

해당 문자열 부분 더블클릭!

 

UNREGISTERED! 문자열을 띄우는 저 부분 위에 

MOV, CMP, JNZ 분기문이 있다.

 

"JNZ"명령어에 대해 조건이 맞지 않기 때문에 바로 밑 명령어가 실행된 것일 것이다. 

하지만 그 조건을 따지지 않고 그냥 이 부분을 실행하지 않게 하기 위해

JNZ를 JMP로 고친 후 저장

 

그러면~ 이렇게 잘 뜬다.

 

 

아직 끝나지 않았다!!

 

 

왼쪽 상단에 [? 부분[(info 부분)에서 [Register]를 클릭

 

아무거나 입력
OK 누른 결과

그 결과, Invalid Key!라며 오류가 난다.

 

 

그렇다면 OK 버튼을 누르고 나서 입력값을 비교하고, 결과를 도출한 것이기 때문에

실행파일을 OllyDBG에 올려서 Invalid Key! 문자열 주변을 보겠다.

 

 

찾았다

예상대로 분기문이 있었다.

하지만 이 부분은 따라가봐도 Invalid Key와 연결이 안된다.

 

그래서 위쪽을 더 살펴봤더니 

이와 같은 구문이 있었고 

이 부분을 통해 Invalid Key 문자열을 출력하는 부분의 주소

[438601]로 바로 이동하는 것이었다.

 

따라서 이 부분을 JNE로 바꿔주었다.

그리고 아까와 같은 값을 이용해 등록을 시도했는데, 

등록 성공!

 

 

 

일단 실행!

 

Unregister 이 자꾸 눈에 띄므로 Registe 하기 위해 이를 클릭 / Email 주소와 License number가 필요해보인다.

 

아무 문자열이나 입력한 후 Register Now를 클릭 했더니

위와 같은 경고창이 떴다.

 

이 경고창을 띄우는 곳을 찾아가보기 위해 OllyDBG 상에서 text로 검색해봤다.

이 곳을 가보자!

 

JNZ로 Register 의 성공과 실패 구문을 나누고 있다

따라서 JNZ 위쪽의 구문을 살펴보았다.

 

CALL 0040714C

POP ECX

XOR EBX, EBX

TEST AL, AL

POP ECX

PUSH EBX

JNZ 004299F1

 

 

0040714C 함수가 호출되고,

해당 함수의 리턴 값이 저장되는 EAX의 일부인 AL 레지스터를 참조하여,

해당 레지스터가 ‘0’이면 "unregistered", 아닐 경우 “registered" 분기문이 나눠지는 구조이다

 

<CMP와 TEST 명령어 비교>

 1) CMP dest, src    
: dest피연산자에서 src연산자를 묵시적으로 빼서 값을 비교
--> 뺀 값이 0일 경우 ZF=1, 다를 경우 ZF=0 으로 세팅됨
: 혼자 사용 X, 언제나 조건 점프 혹은 조건 이동 명령어와 함께 사용됨  

2) TEST opr1, opr2    
: 두 피연산자끼리 AND연산을 수행하여 ZF에 영향을 주지만 결과값 저장 X
: 계산 값이 0일 경우에 ZF가 1로 세트 된다.             
: 혼자 사용 X, 언제나 조건 점프 혹은 조건 이동 명령어와 함께 사용됨
 
★ CMP 명령어는 dest 값과 src 값이 동일한지 확인하는데 주로 쓰임 
★ TEST 명령어는 opr1 값과 opr2 값이 0인지 확인하는데 주로 쓰임  ★   

 

일단 0040714C에 BP를 걸고 실행해본다.

그리고 아무 값이나 입력한 후 Register Now 클릭!

 

실행한 후 0040714C 내부로 들어간다.

0040714C 내부로 들어간 직후

AL의 값은 "8C"이다

 

그 후 00406FD1 함수가 호출되고,

이 함수의 리턴값이 저장된 EAX 값의 일부인 AL 값을 참조하여

[5076A0] 주소에 AL 값을 집어넣고,

JNZ 명령어가 실행된다.

 

조건문 분기되지 않을 경우 “0040701D" 함수가 호출 되고 

AL의 값이 ”[5076A0] / [5076A2]“ 주소에 저장된다.

 

즉, 해당 주소 값들은 프로그램이 등록 상태(이메일, 라이선스 값) 값이 담긴 변수라고 생각할 수 있다.

 

 

 

따라서, 00406FD1 함수 내부로 들어가서 그 리턴값이 나오는 과정을 살펴봐야할 것이다.(AL을 결정하므로)

 

00406FD1 함수 내부

여러 함수들을 거치지만 뒤쪽(406FF9~)에서 AL 레지스터 값을 다루고 있으므로 

[406FF9] 주소 이전에 다뤘던 AL 값은 무시해도 된다.

 

 

ⓐ [406FF9] 주소에 있는 00406F4B 함수 호출 명령어 이후 

AL 값이 'A'라고 결정된다고 치자.

그러면 [407009] | MOV BL, AL에 의해 BL='A'가 된다.

 

ⓑ [407009]  주소에 있는 00401148 함수 호출 명령어 이후

AL 값이 'B'라고 결정된다고 치자.

 

하지만 [407011] | MOV AL, BL 명령어로 인해 

결국 AL 값은 [406FF9] | CALL 00406F4B의 결과로 정해진 AL 값인 'A'가 된다.

 

 

 

결국, 우리가 살펴 봐야 하는 AL 레지스터의 값은 406F4B 함수에서 결정된다는 소리이다.

따라서 406F4B 함수 내부를 살펴보겠다.

 

00401148 함수 내부

쭉 실행하다 보면 “RETN" 까지 오게 된다.

만약 이대로 실행되면 AL=0인 상태로 처음 등록 상태 여부를 비교하는 곳으로 가서

"Unregistered" 문자열이 출력되는 부분으로 넘어가기 때문에

여기서 AL 레지스터 값을 조작해야 하며,

 

 

RETN 명령어를 하기 전, AL 레지스터를 다뤘던 부분인 

[00406FC5] | MOV AL, BL 부분이 바로 패치가 필요한 부분이다.

 

 

따라서 이 부분을 MOV AL, 1 로 바꿔주었다.

패치 성공!

 

pcsurgeon.exe 실행

pcsurgeon 프로그램을 실행했더니

다양한 dll, 드라이버, 시스템 파일이 생겼으며

저런 창이 떴다.

Register for only $20.00 ~ / You have 5 days remaining~ 로 뜨는 것을 보아

"Register를 해야하는 문제" 혹은 "5일 이라는 제한을 없애는"게 목적이라고 생각했다.

 

메인 화면
Help - About

Reg Key를 사용해서 Register 하는 것 같다.

 

 

 

 일단은 메인 화면 상단에서 <unregistered - 5 days remaining..>

문자열이 뜨는 것을 지워보겠다.

 

&amp;nbsp;문자열로 찾기
해당 부분 더블클릭!

검색된 문자열에서 바로 위를 보니 분기문이 2개가 보인다.

일단 직접적으로 관련이 있어보이는 바로 위 분기문

 

 

( MOV ) [60F1DC] 주소에 저장된 값을 EAX에 레지스터에 저장한 후 

( CMP  )                                                          ‘0’과 비교하여 

( JNZ   )                          분기문이 실행되는 것을 확인할 수 있다.

 

 

JNZ → JZ로 변경 후 새로운 실행파일로 저장

 

새로운 실행파일

이를 실행하니 처음에 떴던 창도 안뜨고,

제목에 있던 <unregistered... 도 안뜬다!

 

 

하지만 여기서 끝이 아니지

[Help]-[About]

이 부분마저 바꿔주겠다.

 

 

Search for texts 로 해당 부분을 찾아가본다.

 

 

해당 기능이 실행되는 부분이다.

아까와 같은 패턴이다.

(MOV, CMP, JNZ)

[60EB8C]에 있는 값을 EAX에 넣어주고 0과 비교한 후 ZF가 거짓이면 점프한다.

 

"JNZ" 조건이 충족되지 않아 분기가 일어나지 않고 결국 “<Unregistered.." 문자열이 나타나게 된다.

그리고 밑에는 "Licensed Version" 문자열이 나타나는 것으로 보아 

이곳으로 가줘야 한다. 

이곳을 JMP로 바꿔주었더니

 

아래와 같이 Licensed Version이라고 잘 바뀌었고, Register Key를 입력하는 부분이 사라졌다!

 

VisualSite Designer
실행을 종료할 때마다 이 창이 뜬다.

 

이 문제에서 우리가 해결해야 할 것은 

1. trial 제한을 없애고

2. 프로그램 종료 시 광고를 제거하는 것 

 

 

Ctrl+F8로 실행하면 프로그램의 시작 전에 멈추게 된다.

따라서 이 함수가 실행되기 전 trial 횟수가 검증되는 부분이 있을 것이라 생각했고

 

윗 부분(004898F1) JLE 명령어를 JMP로 바꿔준 후 실행 파일을 따로 저장한다.

 

실행

수정 파일을 실행시키면 라이선스 검증창이 뜨지 않고

프로그램을 바로 열 수 있으며

Quit 버튼을 통해 종료시키면 광고창도 뜨지 않고 프로그램을 무제한으로 이용할 수 있다.

 

 

'Study > Reversing' 카테고리의 다른 글

Malware 프로그램 분석 2  (0) 2021.11.17
Malware 프로그램 분석 1  (0) 2021.11.16
Lena 4번 풀이/Rena's Reversing Tutorial 04  (0) 2021.11.10
악성코드 주요 행위 분석  (0) 2021.11.10
고급 정적 분석 by IDA  (0) 2021.11.10

설치 화면
설치 후 실행. User와 Location 정보를 입력하라고 한다.
하나를 새로 생성한 후 실행해본다.
일단 실행하면 UNREGISTERED VERSION이라고 뜨며
group 생성 수도 제한이 걸려있고
한 그룹당 생성 인원 수도 제한되어 있다.

Register을 해야만 할 수 있다는 것들이 너무 많아서 Register한 것처럼 프로그램을 조작해보겠다

 

OllyDBG 실행

F9를 눌러 계속 실행하다보면 프로그램이 중간중간 정지하게 된다.

이럴때는 Shift + F9를 통해서 빠져나오면 되는데, 그럼에도 불구하고 이상한 루틴에 빠지게 되어 프로그램 종료지점으로 가게 된다.

이런 방법을 '안티 디버깅' 기법이라고 하고, 디버깅 탐지를 막기위해 프로그램 제작자가 심어놓은 기술이라고 보면 된다.

디버깅 옵션에서 예외 사항 무시하는 것에 모두 체크

체크하게 되면 중간중간 멈추는 현상이 나타나지 않는다.

 

Memory Dump - Ctrl+B - UNICODE나 ASCII에 찾고자 하는 문자열 검색

프로그램 중간중간 UNREGISTERED라고 표기되어 있는 부분을 싹 바꿔주겠다

 

일단 제목부분의 주소 확인
Hex Dump창을 가서 확인
버전 정보를 담은 제목을 NOP으로 채워준뒤 따로 저장

 

제목 변경


또 다른 unregistered 내용
바꾸기
문자열 바꾸기 성공. 일단 문자열 바꾸는 것은 여기까지 해보겠다


 

OllyDBG에서 실행한 프로그램의 경고창이 뜬 상태에서 

이 상태에서 잠시 프로그램을 정지하고(F12 또는 일시정지버튼)

call stack (K)을 살펴보면 호출된 함수들의 목록을 확인할 수 있다.

경고창의 내용이 나오는 것을 확인할 수 있다.
이 상태에서 Alt+F9 실행

메모리 상 다양한 dll 파일이 있지만 우리는 사용자가 사용하는 프로그램에서만 사용되는 DLL 을 살펴봐야 한다.

Alt+F9 이후에 프로그램에 뜨는 OK버튼 클릭 --> User Code까지 실행이 됨

 

MessageBox가 뜬 후의 위치로 왔다.

이 MessageBox를 호출한 함수의 루틴을 확인해보기 위해 

Call stack에서 함수 확인

004562ED를 호출한 함수는 00308B1D이다

 

해당 함수를 호출하는 곳을 가서 확인해본다

ⓐ CMP EAX,3 

이 명령어에서 그룹 제한 수 3을 큰 숫자로 늘리거나 

 

ⓑ JL 00408B34

JL 명령어를 통과해야하는데 이를 통과하지 못하고 해당 경고창이 뜬 것임을 알게 되었다.

따라서 이 부분의 명령어를 JMP로 바꾸어 무조건 점프하게 해본다.

 

그룹 생성 수에 제한 없이 계속해서 add 되는 것을 확인할 수 있다!!


인원 수 제한을 푸는 방법도 위와 같다.

똑같이 여기까지 실행한 후 

OllyDBG에서 일시정지, Alt+F9, 확인버튼

 

그러면 그 함수를 부르기 전의 위치로 오게된다.

F8눌러서 RETN으로 넘어가고

 F8 누르면 바로 위에 CALL함수가 있는 다음줄로 넘어간다.

 

MessageBox를 호출한 함수는 00412DEA이다.

  CALL함수가 메시지 박스!!

 

CALL 함수 위쪽을 보면 아까와 비슷한 비교문, JL 문이 있다.

CMP EAX,4에서 숫자를 높이거나

JL을 JMP로 바꿔주면?

 

성공

'Study > Reversing' 카테고리의 다른 글

Malware 프로그램 분석 1  (0) 2021.11.16
Lena 5번 풀이/Rena's Reversing Tutorial 05  (0) 2021.11.10
악성코드 주요 행위 분석  (0) 2021.11.10
고급 정적 분석 by IDA  (0) 2021.11.10
Lena 3번 풀이/Rena's Reversing Tutorial 03  (0) 2021.11.03

+ Recent posts