일단 실행!

 

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 로 바꿔주었다.

패치 성공!

 

+ Recent posts