반응형
반응형

 

Write-up 쓴 날짜 : 2022-10-07 23:12

 

Teksched.exe
2.73MB
patched_Teksched.exe
2.73MB

 

 

주제 - Guiding a program by multiple patching. 

 


분석 1

 

 

Delphi 언어로 작성되어 있다.

 

 

프로그램을 실행하면 위와 같이 창들이 뜬다.

 

등록되지 않았다는 것을 의미하는 "Unregistered"와 "UNREGISTERED VERSION" 문자열이 보인다.


분석 2

 

 

EP 코드는 위와 같다.

 

 

"registration" 문자열을 입력해보면 위와 같이 문자열들이 나온다.

 

"Registration Key accepted!" 문자열을 더블 클릭하여 해당 문자열을 참조하는 주소로 가본다.

 

 

4A584B 주소에서 "Registration Key accepted!" 문자열을 참조한다.

 

그리고 등록키가 틀렸다면 4A586C 주소에서 "Registration Key Failed!" 문자열을 참조한다.

 

4A5839 주소에서 ret 명령어가 있고, ret 명령어 아래에 있는 명령어 주소인 4A5839 주소로 분기해서 들어오는 부분이 없다.

 

4A582C 주소에서 스택에 4A5841을 push 하고, eax 레지스터에 어떠한 값을 넣은 뒤 함수를 호출하고 ret 명령이 나온다.

 

push 한 후에 ret 명령어가 나오면 해당 주소로 unconditional jump를 한다.

(디버깅을 하다가 어떠한 함수의 끝 부분인 return 명령어가 있을 때 push 명령어가 있는지 확인한다.)

(이때 push 명령어에 적힌 주소가 어떠한 루틴의 시작 주소일 것이다.)

 

 

스크롤을 조금 위로 올리다 보면 위와 같은 부분이 나온다.

 

4A55F9 : "Error! You are attempting to register the wrong level of this program (standard,advanced,service)"

4A561D : "Error! You are attempting to register the wrong version of this program"

 

 

스크롤을 더 올리다 보면 위와 같은 부분이 나온다.

 

이 부분이 등록키가 입력되었을 때의 부분이다.

 

4A53B5 : "Enter a Last Name value now.."

4A53D9 : "Enter a Key value now.."

 

 

4A52CA : "Enter a First Name value now.."

 

 

위의 문자열들이 나오는 루틴은 4A51D6 주소의 ret 명령에 의해 실행된다.

(4A51C9 주소에서 4A51DE 주소를 스택에 넣고 ret 명령어가 실행된다.)

 

하지만 4A51DE 주소는 등록 루틴의 시작 지점이 아니다.

 

뭔가 입력했는지 안했는지 검사하는 부분은 지나쳤다.

 

 

위의 부분이 First Name, Last Name, Registration Key 항목에 아무것도 입력하지 않았을 때 메시지를 출력하는 부분이다.

 

그렇다면 3개 항목에 모두 값을 채웠을 때는 4A53E8 주소로 흐름이 진행되므로 4A53E8 주소에 BP를 걸고 F9 키를 눌러 실행한다.

 

 

F9 키를 눌러 실행했다면 위와 같이 About -> Use Reg Key로 들어간 후 slay / slay / slayslay를 입력하고, Register 버튼을 누른다.

 

 

그렇다면 위와 같이 4A53E8 주소에서 멈추게 되는데 F8 키를 눌러 하나 하나 패치하여 원하는 문자열이 나오도록 한다.

 

 

F8 키를 눌러 진행하다 보면 위의 부분에서 4A5461 주소의 call 명령에 의해 763A0B42 주소로 점프하게 되고, 이어서 76F57157 주소로 이동 되는데 이 부분은 ntdll 파일의 영역이다.

 

 

 

4A5461 주소의 CALL 명령은 ntdll 영역으로 이동되므로 위와 같이 nop으로 채우고, F8 키로 이어서 진행한다.

 

 

그러면 위와 같이 4A5479 주소에서 jbe 명령어가 참이 되어 실행되므로 4A55A2 주소로 점프한다.

(jbe : jump in below or equal == 이하이면 점프 == ZF가 1일 때 점프)

 

 

그럼 위와 같이 나오는데 이 부분은 Error 문자열을 출력하는 부분이다.

 

Error 문자열이 안 뜨고 이 부분을 패스하려면 4A562C 주소로 이동해야 한다.

 

그럴려면 4A55ED -> 4A5608 -> 4A5611 -> 4A562C 이렇게 점프해야 한다.

 

 

4A55ED 주소의 je 명령어를 위와 같이 jne로 수정한다.

 

 

그럼 위와 같이 4A562C 주소로 점프하게 된다.

 

F8 키를 눌러 이어서 진행한다.

 

 

진행하다 보면 위와 같이 4A567E 주소에서 4A585F 주소로 점프를 하는데

 

 

4A585F 주소로 점프된 후 4A5963 주소에서 4A5876 점프가 취해지고

 

 

그러면 위와 같이 Registration Key Failed! 문자열이 뜨게 된다.

 

 

그렇다면 위와 같이 4A567E 주소의 jne 명령어를 je로 수정하고, F9 키 또는 F8 키를 눌러 실행한다.

 

 

그러면 위와 같이 등록에 성공했다는 메시지 창이 뜬다.

 


풀이

 

총 3 곳을 패치해주면 된다.

 

4A5461 주소에서 call 명령을 nop으로 채운다.

 

4A55ED 주소에서 je를 jne 명령어로 바꾼다.

 

4A567E 주소의 jne 명령을 je로 바꾼다.

 

그리고 패치된 내용들을 저장하고 패치된 파일로 만든 뒤 실행한다.

 

 

패치된 파일을 실행 후 About -> Use Reg -> Key -> 내용 입력 후 -> Register

 

 

 

그러면 위와 같이 뜨고

 

 

라이센스된 버전이라고 뜬다.

 

 

타이틀 바에 있었던 Unregistered 문자열도 사라졌다.

반응형

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

[Lenatuts4you] 14. DVDMenuStudio  (0) 2022.11.02
[Lenatuts4you] 13. XoftSpy  (0) 2022.11.02
[Lenatuts4you] 11. fjprodsetup  (0) 2022.11.02
[Lenatuts4you] 10-3. CConvert  (0) 2022.11.02
[Lenatuts4you] 10-2. ReverseMe2  (0) 2022.11.02

+ Recent posts