반응형
반응형

 

Write-up 쓴 날짜 : 2022-10-27 02:37

 

gmvgr30.exe
1.12MB
Tbar0.3.gold.Final.rar
0.15MB
urlegal33.rar
1.22MB

 

patched_Urlegal.exe
0.15MB
patched_movgear.exe
0.43MB

 

eXeScope610.exe
0.58MB
eXeSc650.zip
0.57MB

 

주제 - Reversing using resources

 


Urlegal.exe 분석 및 패치

 

 

먼저, 위와 같이  urlegal33 압축 파일을 해제해준 뒤

 

 

urlegal33 폴더 하위에 있는 SETUP 프로그램을 실행시켜 설치해준 뒤 URLegal 프로그램을 실행하면 

 

 

위와 같이 뜬다.

 

 

File -> Register... 메뉴를 누르면 위와 같이 뜬다.

 

Name과 Code를 입력받도록 되어 있는데

 

 

프로그램을 종료하려고 하면 위와 같이 Nag 창이 뜬다.

 

그리고 I Will Register Soon 버튼을 누르면 프로그램이 종료된다.

 

특정 상황에 자주 쓰이는 API 들이 있는데 위의 창에서는 사용자가 선택할 수 있는 버튼 등이 있는 것을 참고하면 DialogBox와 관련된 API를 사용했을 것 같다.

 

DialogBoxParam 함수는 대화 상자(DialogBox) 템플릿 리소스로부터 대화 상자를 생성하는데

 

대화 상자를 생성하기 위해 사용되는 인자들은 스택에 저장 되고, 인자들 중 하나의 이름은 lpTemplateName이다.

 

lpTemplateName : DialogBoxTemplate 이 인자는 널 종료 문자열로 정의된 템플릿의 이름이거나, 식별자를 의미하는 정수값의 식별자(ID)이다.

만약 대화상자 템플릿이 정수값으로 정의되어 있다면 인자의 High-Order word 값은 반드시 0이어야 하고, Low-Order 값은 식별자를 포함해야 한다.

 

그러므로 즉, TemplateName 값을 알아내면 어디에서 대화 상자가 생성되는지 간단한게 알아낼 수 있다.

 

 

exescope 프로그램에서 설치된 URLegal.exe 파일을 열면 읽기 모드로 열리는데, Resource -> Dialog에 가보면 위와 같이 100, 103, 111, 130, 134, 135, 136, 137, 138이 있다.

 

이 값들이 TemplateName 인자가 나타내는 대화 상자 템플릿의 식별자 ID 값이다.

 

 

ID가 103인 대화 상자를 보면 위와 같은데 이전에 URLegal.exe 프로그램을 실행 후 종료 시 봤던 문자열들이 있다.

 

즉 제거해야 할 대화 상자의 ID 값은 103d(67h)인 것이다.

 

 

URLegal.exe를 Ollydbg에 올린 후 

 

 

디스어셈블리 창에서 우클릭 -> Search for -> All commands -> push 67 입력 -> find

 

어디서 대화상자를 생성하기 위해 lpTemplateName 값을 스택에 저장하는지 알아낸다.

 

 

그럼 위와 같이 뜨는데

 

401240 주소에서 67h를 스택에 밀어넣고 있다.

 

 

401240 주소로 이동하면 위와 같다.

 

401220 주소에 함수 프롤로그가 있다.

 

401245 주소에서 어떠한 함수를 호출하는데, 호출 스택을 이용해 어느 주소에서 위의 명령어들을 호출하는지 찾는다.

(함수 호출이 일어나면 호출된 명령어가 종료되고 return 될 주소가 있는데, 이 return 될 주소가 스택에 저장되므로 스택을 보고 저장된 return 주소로 간다.)

 

401220 주소에 BP를 걸고 Ctrl + F2 키를 눌러 재실행 한 후 F9 키를 누른다.

 

 

F9 키를 누르면 프로그램이 시작되는데, 프로그램을 종료하면 종료되지 않고 BP를 걸어뒀던 401220 주소에서 멈추게 된다.

 

 

그리고 401220 주소에 멈춰 있는 상태에서 스택을 보면 위와 같은데, 호출이 종료되면 4023C0 주소로 return 한다.

 

즉, 4023C0 주소 이전 주소에서 실행되는 명령어가 바로 Nag 창을 호출하는 명령일 것이다.

 

 

4023C0 주소로 이동해보면 위와 같은데 4023BB 주소에서 401220 주소의 함수를 호출한다.

 

그리고 4023B1 주소에서 조건 분기를 하고 있는데 4023AA 주소에서 호출하는 403E18 주소의 함수의 반환값이 0이 아니면 4023F6 주소로 점프하고, 반환값이 0이면 Nag 창을 띄운다.

 

그렇다면 이 4023B1 주소에 있는 JNZ 명령이 등록 상태를 판별하고 있는 것이다.

 

 

4023AA 주소에서 호출하는 함수의 반환값이 0이 아니여야 ZF 플래그가 0으로 설정되고, 그렇게 되면 4023B1 주소의 조건 분기가 수행되어 Nag 창이 안 뜨게 된다.

 

4023AA 주소에 BP를 걸고, Ctrl + F2 키를 눌러 재실행 후 F9 키를 눌러 실행 후 4023AA 주소까지 진행한다.

 

 

4023AA 주소까지 왔다면 F7 키를 눌러 호출하는 함수 내부로 들어간다.

 

 

함수 내부로 들어왔을 때의 EAX의 값은 1이다.

 

그리고 이 함수의 끝은 403E28 주소인데, 403E22 주소에서 eax의 값을 바꾼다.

 

 

그렇다면 403E22 주소의 명령을 eax에 1이 담기도록 수정하면 종료할 때 Nag 창을 띄우지 않을 것이다.

하지만 mov eax,1과 같이 명령을 수정하면 403E25 주소의 mov esp, ebp 명령 부분까지 침범하게 되므로 

 

위와 같이 NOP으로 채운다.

 

패치된 내용을 저장하고 저장한 파일을 실행한다.

(디스어셈블리 창 -> 우클릭 -> copy to executable -> All modifications -> Copy all -> 우클릭 -> Save File

 

 

 

그러면 위와 같이 File -> Register... 버튼이 비활성화 되고, 종료 시에도 Nag 창이 뜨지 않고 종료된다.

 


gmvgr30 분석 및 패치

 

 

gmvgr30을 설치하면 위와 같이 C:\Program Files(x86)\GIF Movie Gear 폴더가 생긴다.

 

 

그리고  movgear.exe를 실행하면 위와 같이 창이 뜨는데 문자열 중간에 30일 남았다는 문구가 있다.

 

 

OK 버튼을 누르면 위와 같이 뜨는데, Start from Scratch를 눌러 실행한다.

 

 

그러면 위와 같이 프로그램이 뜨고, Help -> Register Now... 메뉴를 누르면

 

 

Name과 Code를 입력받는 창이 뜬다.

 

 

그리고 프로그램을 종료하려고 하면 위와 같이 뜨는데, OK 버튼이 몇 초 뒤에 뜬다.

 

 

리소스 편집 프로그램인 exescope를 이용해 movgear 프로그램의 리소스를 확인하면 위와 같이 Resource -> Dialog에서 ID가 100인 대화 상자를 보면 프로그램을 종료할 때 봤던 문구가 그대로 적혀있다.

 

100d는 64h이다.

 

 

movgear.exe를 ollydbg에 올린 후 디스어셈블리 창에서 우클릭 -> search for -> All commands -> 위와 같이 입력 후 -> Find

 

 

그러면 위와 같이 여러 주소에서 push 64 명령을 하는 것이 보이는데

 

push 64 명령을 하는 모든 주소에 BP를 건다.

 

그리고 F9 키를 눌러 실행한다.

 

 

그럼 위와 같이 43AA2D 주소에서 멈추게 되는데, 아직 프로그램이 실행되지 않은 상태에서 멈춘 BP 이므로 43AA2D 주소는 상관 없다.

 

그러므로 BP를 제거한 후 F9 키를 눌러 진행한다.

 

 

그럼 위의 창이 뜨게 되고, Start from scratch를 눌러 실행한 다음

 

 

프로그램을 종료하면 위와 같이 406725 주소에서 멈추게 된다.

 

hOwner  파라미터의 값을 보면 GIF Movie Gear로 되어 있는데, 이 부분이 분석해야 할 부분이다.

 

406725 주소에서 스크롤을 조금 위로 올려보면 40670B 주소에서 431650 주소의 함수를 호출하고 이 함수의 반환값이 1인지 검사 후 1이면, 40672E로 점프하고, 1이 아니면 406725 주소 부분으로 가게되어 Nag 창을 생성한다.

 

위와 같이 40670B 주소와 406716 주소에 BP를 걸고 Ctrl + F2 키를 눌러 재실행 후 F9 키를 눌러 실행하여 40670B 주소까지 온다.

 

 

40670B 주소까지 왔다면 F7 키를 눌러 호출하는 함수 내부로 들어간다.

 

 

그러면 위와 같은 코드들이 보이는데

 

RegOpenKeyExA 함수는 프로그램 등록과 관련해서 자주 사용되는 함수이다.

 

431672 주소에서 RegOpenKeyExA 함수를 호출하고

431678 주소에서 반환값이 0인지 검사한다.

그리고 0이면 431680 주소의 명령이 수행되고, 0이 아니면 431742주소로 점프한다.

 

 

431742 주소는 위와 같은데

 

RegCloseKey()를 호출 후 eax에 ebx의 값을 담은 뒤 함수를 종료한다.

 

 

RegOpenKeyExA 함수의 반환값이 0이면 431680주소로 가게 되고 431680 주소부터는 RegQueryValueExA 함수를 이용해 값을 비교한다.

 

4316A5 주소에서 호출하는 RegQueryValueExA는 Name의 값을 비교하고, 4316C9 주소에서 호출하는 RegQueryValueExA는 Code의 값을 비교한다.

 

하지만 이 부분에서 비교하는 것은 올바른 Name 값과 Code 값이 아니라 그저 레지스트리에 Name과 Code의 값이 있는지 없는지를 검사하는 것이다.

 

4316A7 주소와 4316CB 주소에서 RegQueryValueExA 함수의 반환값이 0인지 검사하는데

현재 프로그램이 등록되지 않았으므로 Name 값을 검사하는 RegQueryValueExA에서 0이 아닌 값이 반환이 될 것이고

그렇다면 eax는 0이 아니므로 4316A9주소에서 431742 주소로 점프하는데 431742 주소는 위에서 봤듯이 함수 종료 부분이다.

 

 

어쨌든 현재 프로그램이 등록되지 않은 상태에서는 RegOpenKeyExA 함수와 RegQueryValueExA 함수의 결과가 모두 431742 주소로 점프하도록 되어 있고

 

43174E 주소에서 EAX에 EBX의 값을 넣고 있는데

 

 

F8 키로 43174E 주소까지 왔을 때 EBX의 값은 FFFFFFFF로 -1이다.

 

eax에 -1이 아니라 1이 담겨야 프로그램 등록 상태로 인지하기 때문에

 

 

위와 같이 43174E 주소의 명령을 mov al, 1로 수정한다.

 

mov eax, 1로 하면 431750주소의 명령 부분까지 침범하게 되므로 AL 레지스터로 하여금 1byte 만 사용하도록 한다.

 

패치된 내용을 저장하고 저장한 파일을 실행한다.

(디스어셈블리 창 -> 우클릭 -> copy to executable -> All modifications -> Copy all -> 우클릭 -> Save File)

 

 

그러면 위와 같이 Help 메뉴에 있던 Register Now... 메뉴가 사라지고

 

 

위와 같이 About 메뉴에서도 등록되었다고 뜬다.

 

 

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 18. ReverseMe  (0) 2022.11.02
[Lenatuts4you] 17. KeygenMe  (0) 2022.11.02
[Lenatuts4you] 15. ReverseMe(Inline patch)  (0) 2022.11.02
[Lenatuts4you] 14. DVDMenuStudio  (0) 2022.11.02
[Lenatuts4you] 13. XoftSpy  (0) 2022.11.02

+ Recent posts