728x90
728x90
728x90

파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17

 

Downloads / Lenas Reversing for Newbies - Tuts 4 You

 

tuts4you.com

Tutorials 07. Intermediate level patching, Kanal in PEiD

사용도구: 올리디버거 2.01

 

Lena's Reversing for Newbie 07(이하 원본파일) 분석해보자.

 

[사진 1]

원본파일을 실행하면 위와 같은 창이 뜬다. About 버튼을 클릭해보자.

 

 

[사진 2]

프로그램에 대한 설명이 나오는데, 우측 하단의 Register 버튼을 클릭해보자.

 

 

[사진 3]

이메일과 라이센스 넘버를 입력하여 등록할 수 있는데 실패하면 위와 같은 "You have entered ~~" 문자열과 함께 메시지 박스가 뜬다.

 

 

[사진 4]

code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열을 확인할 수 있다. "You have entered" 문자열을 검색해보자.

 

 

[사진 5]

위와 같이 문자열이 사용되는 곳이 확인된다.

 

 

[사진 6]

문자열을 스택에 넣기 전에 JNZ 명령어로 점프하는 부분이 있는데, 이 곳을 JMP 명령어로 무조건 점프하게 패치를 해보자.

 

 

[사진 7]

그러면 위와 같이 "Thank you for registering!" 문자열과 함께 메시지 박스가 뜬다. 그런데 창만 뜨고 정품 등록할 수 있는 뭔가가 뜨지 않는다.

 

 

[사진 8]

다른 방법으로 패치를 해봐야 한다. 문자열이 사용되는 루틴의 윗 부분을 보면 0x004860C8, 0x004040B6, 0x0040714C 3개의 함수를 호출하는데, 맨 위쪽 2개 함수는 별 의미 없는 함수들이고 0x0040714C 함수는 호출 전에 스택에 입력한 이메일과 라이센스 넘버를 저장한다. 따라서 0x0040714C 함수 이 부분을 상세 분석해보자.

 

 

[사진 9]
[사진 10]
[사진 11]

0x0040714C 함수 내부로 들어가면 바로 0x00406FD1 함수를 호출하는데, 호출하기 전에 스택에 이메일과 라이센스 넘버를 저장한다.

 

 

[사진 12]

함수를 호출하면 EAX 레지스터에는 0x0 값이 저장된다. 그리고 AL 레지스터를 TEST 연산한다.

 

 

[사진 13]

그리고 AL 레지스터의 값이 0x0이기 때문에 0x00407163 주소의 JNZ 명령어로 점프하지 않고 0x0040701D 함수가 호출된다. 이 때도 마찬가지로 이메일과 라이센스 넘버를 스택에 저장한다.

 

 

[사진 14]

함수를 호출하면 EAX 레지스터에는 0x0 값이 저장된다. 그리고 AL 레지스터를 TEST 연산한다.

 

 

[사진 15]

그리고 AL 레지스터의 값 0x0을 메모리의 0x005076A0, 0x005076A2 주소에 저장하고 0x00407069 주소로 점프한다.

 

 

[사진 16]

그리고 메모리의 0x005076A1 값과 0x0을 비교한 후 다르면 0x00407122 값으로 점프한다.

 

 

[사진 17]
[사진 18]

0x00407122 주소로 점프하면 위와 같이 라이센스 등록을 실패한다. [사진 15]에서 AL 레지스터의 값을 메모리에 저장하고 메모리의 값을 비교하여 라이센스 등록 성공 여부를 결정하는데, 아직 AL 레지스터의 값이 어디서 결정되는지 모르기 때문에 처음부터 자세하게 다시 분석해야 한다.

 

 

[사진 19]

[사진 9]에서 확인했던 0x00406FD1 함수부터 분석해보면, 위와 같이 함수 4개를 호출한다. 위의 2개 함수는 신경쓰지 않아도 된다. 0x00406F4B 함수를 호출할 때 스택에 이메일과 라이센스 넘버를 저장한다.

 

 

[사진 20]

함수를 호출하고 나면 EAX 레지스터의 값은 0x0이 된다.

 

 

[사진 21]

그리고 0x00407009 주소의 명령어 MOV BL, AL에 의해서 BL 레지스터의 값도 0x0이 된다.

 

 

[사진 22]

그 다음, 0x00401148 함수를 호출하는데 함수 호출 결과 EAX 레지스터의 값은 0x1이 된다.

 

 

[사진 23]

하지만, 0x00407011 주소의 명령어 MOV AL, BL에 의해 AL 레지스터의 값은 다시 0x0이 된다.

 

 

[사진 24]

0x00406FD1 함수가 종료되면 위와 같이 AL 레지스터를 TEST 연산한 후 메모리의 0x005076A0 주소에 값을 저장하고 라이센스 등록은 실패한다. 따라서 0x00406FD1 함수가 종료되기 전에 AL 레지스터의 값이 0x1이 되도록 패치해야 한다.

 

 

[사진 25]

0x00406FD1 함수가 종료되기 직전에 BL 레지스터의 값을 AL 레지스터에 저장한다.

 

 

[사진 26]

위와 같이 패치하면 BL 레지스터의 값에 상관없이 AL 레지스터에는 항상 0x1 값이 저장된다.

 

 

[사진 27]

0x00406FD1 함수가 종료되면 0x00407163 주소의 명령어 JNZ SHORT 00407180에 의해 점프하는데, AL 레지스터의 값이 0x1이기 때문에 무조건 점프한다.

 

 

[사진 28]

그리고 위 코드로 이동하는데, 메모리의 0x005076A1 주소의 값과 0x0을 비교하는데, 큰 의미는 없고 0x00407122 주소로 점프한다.

 

 

[사진 29]

결국 위 코드로 이동하는데, AL 레지스터의 값이 0x0이 아니기 때문에 0x004299F1 주소로 점프한다.

 

 

[사진 30]

그러면 [사진 7]에서 확인했던 라이센스 등록 성공 메시지 박스가 뜨고 추가적으로 위와 같이 다운로드를 제공하는 메시지 박스를 확인할 수 있다.

728x90
728x90

+ Recent posts