'Lena'에 해당되는 글 6건

  1. 2010.11.22 [Reversing With Lena] lena's tutorial 16 풀이

1. 개 요
예제 문제 및 강의 내용 출처 : http://www.tuts4you.com/
이번 Lena의 16장 강의에서는 프로그램의 Resouce를 이용하여 크랙하는 방법을 설명한다.

2. 사용도구
Ollydbg :
http://www.ollydbg.de
Resource Hacker : http://www.angusj.com/resourcehacker/

3. 내 용
먼저 OllyDbg를 이용하여 프로그램을 로딩한 뒤 목표가 되는 부분을 살펴보도록 한다.
[ 그림 1 ]
프로그램 실행 후 Help -> "Register Now" 부분을 클릭하면 현재 정식 등록되지 않은 프로그램임을 알 수 있으며, 프로그램 종료 시 [ 그림 1 ]과 같이 Trial version임을 나타내는 화면이 생성된다.
위와 같이 프로그램에서 Dialog Box 생성시에는 주로 DialogBoxParam 함수를 사용하게 되며 DialogBoxParam에 대한 설명은 [ 표 2 ]와 같다.

 The DialogBoxParam function creates a modal dialog box from a dialog box template resource. Before displaying the dialog box, the function passes an application-defined value to the dialog box procedure as the lParam parameter of the WM_INITDIALOG message. An application can use this value to initialize dialog box controls.
int DialogBoxParam(
    HINSTANCE  hInstance, // handle of application instance
    LPCTSTR  lpTemplateName, // identifies dialog box template
    HWND  hWndParent, // handle of owner window
    DLGPROC  lpDialogFunc, // address of dialog box procedure 
    LPARAM  dwInitParam  // initialization value
   ); 
lpTemplateName
Identifies the dialog box template. This parameter is either the address of a null-terminated character string that specifies the name of the dialog box template or an integer value that specifies the resource identifier of the dialog box template. If the parameter specifies a resource identifier, its high-order word must be zero and its low-order word must contain the identifier. You can use the MAKEINTRESOURCE macro to create this value. 

DialogBoxParam API를 호출 전에 필요한 파라미터들을 스택에 PUSH 하게 되며 이중에서 Resource Hacker를 이용하여 lpTemplateName에 해당되는 값을 찾아보기로 한다.

[ 그림 2 ]
[ 그림 2 ]와 같이 해당 Resource Hacker를 이용하여 해당 Dialog를 찾아보면 100번 Tempate name을 갖고 있는 것을 알 수 있다. 따라서 DialogBoxParam 호출 전 스택에 "100"에 해당하는 값을 PUSH 하는 동작이 있을 것임을 예상할 수 있다.

10진수 100의 경우 Hex 값으로 64이므로 "PUSH 64" 명령어가 있는 곳에 모두 Break Point를 설정한다. 설정 방법은 [그림 3 ]과 같이 "Search for" -> "All Commands" -> "PUSH 64" 입력 -> "Set breakpoint on every command"를 차례대로 선택한다.
[ 그림 3 ]
F9를 눌러 프로그램을 실행한 뒤 불필요한 Break Point를 제거한 뒤 프로그램 종료 버튼을 누르면 [ 그림 4 ]부분에서 BP가 걸리며 406716 부분에서 JE 구문에 의해서 프로그램 Dialog 생성할지 안할지 결정하는 것을 유추할 수 있다.
[ 그림 4 ]
406713 주소에서 EAX 값이 1이어야 406741 주소에 있는 DefWindowProcA가 호출되어 Dialog Box 생성없이 프로그램이 바로 종료되는 되는 알 수 있으며, 40670B 에서 호출되어지는 함수에서 EAX의 값이 1로 리턴되어야 해당되어야 하는 것을 알 수 있다. 40670B 에서 호출되어 지는 함수로 Step-in 해보면 [ 그림 5 ]와 같이 43174E 주소에서 마지막으로 EAX 값이 정해지는 것을 알 수 있다. 따라서 43174E 주소의 값을 "MOV AL, 1"로 변경해 주면 EAX의 값이 1로 리턴되는 것을 알 수 있다. ("MOV EAX, 1"을 사용할 경우 뒤에 있는 명령어까지 덮어씌우게 되므로 "MOV AL, 1"을 사용한다.)
[ 그림 5 ]
이 후 변경된 내용을 저장한 뒤 실행해 보면 Help -> "Register Now" 메뉴가 사라졌으며 프로그램 종료시에도 별도의 Dialog Box 생성없이 바로 종료되는 것을 알 수 있다.

4. 결 론
이번 lena151의 강의에서는 프로그램의 resource를 이용한 크랙 방법을 보여준다. 간단하면서도 유용한 리버싱 방법이 아닌가 한다. 하나의 프로그램을 리버싱 할 때도 다양한 방법이 존재하며 쉽고 빠르게 리버싱이 가능하기 위해서는 많은 지식과 경험이 필요한 듯 하다.

                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : geekspark@gmail.com         |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP                                        |
                                                                                                    +----------------------------------+
저작자 표시 비영리 변경 금지
신고
Posted by By. PHR34K