반응형

 

Write-up 쓴 날짜 : 2022-09-24 01:40

 

pcsurgeon.exe
3.21MB
files.zip
1.57MB
patched_using_ollydbg_pcsurgeonl.exe
3.21MB
patched_using_x32dbg_pcsurgeon.exe
3.21MB

 

목적

1. 프로그램 타이틀 바에 있는 Nag 문자열을 제거

2. About 메뉴의 Unregistered Version을 패치

 

주제 - "The plain stupid patching method", searching for textstrings


 

 

이번 프로그램은 Borland Delphi로 만들어진 프로그램이다.

 

 

 

 

 

Windows 11에서 프로그램을 실행하니 위와 같이 실행은 되지만 에러가 뜨고, 프로그램 내 문자열들도 제대로 출력되지 않는다.

 

혹시나 하는 마음에 Windows 7에서도 실행해보았지만 위와 같이 문자열들이 제대로 뜨지 않는다.

 

 

하지만 Windows XP에서 실행하면 위와 같이 설정(?)하는 것과 실행되었을 때 프로그램 내 문자열들이 제대로 출력된다.

 


 

프로그램 상단에 "<unregistered - 15 days remaining..>" 문자열이 있고

 

 

상단 메뉴 중 "help" -> About 메뉴를 열면 위와 같이 나오는데, <Unregistered Version> 문구와 Use Reg Key 문구가 있다.

 

이번 챕터의 목적은 위의 두 문구를 제거하거나 바꾸는 것이다.

 


풀이

 

패치는 Ollydbg와 x32dbg 두 개에서 해볼 것인데, Ollydbg는 XP 환경에서 할 것이고, x32dbg는 Windows11 환경에서 할 것이다.

 

또한 Ollydbg에서의 패치는 총 두 군데 즉, 각 문자열로 가는 조건 분기 부분의 점프 명령어를 수정하지만

x32dbg에서의 패치는 한 군데 즉, 변수의 값을 바꾸어서 모두 패치되게 할 것이다.

 

1-1. XP 환경에서의 Ollydbg 타이틀바에 있는 문구 삭제

 

 

위의 사진은 이 프로그램의 EP 코드이다.

 

 

EP 코드 부분에서 마우스 오른쪽 마우스 -> Search for -> All referenced text strings

 

 

그러면 위와 같이 프로그램 내의 참조되는 문자열들이 뜬다.

 

이 상태에서 마우스 오른쪽 버튼을 누른다.

 

 

그러면 위와 같이 Search for text가 있는데 이 메뉴를 누른다.

 

 

그리고 위와 같이 입력하여 검색한다.

 

 

그럼 위와 같이 나오는데 해당 주소로 이동해본다.

 

 

그럼 위와 같이 5CC83C 주소로 이동하게 된다.

 

 

스크롤을 위로 조금 올리다보면 위와 같이 5CC6D4 주소에서 함수 스택 프레임 부분이 나온다.

 

5CC6D4 주소에 BP를 걸고 재실행 한 뒤 F9 키 또는 Shift + F9 키를 이용해 이 위치로 돌아온다.

 

 

5CC6D4 주소로 왔다면 F8 키로 하나씩 따라가본다.

 

 

따라가다 보면 위와 같이 5CC750 주소에서 조건 분기문이 하나 나오는데

 

그 아래의 메세지 내용을 보니 등록이 만료되었다고 한다.

 

현재 이 부분은 상관없어보이므로 F8 키를 눌러 계속 진행한다.

 

 

5CC836 주소에서 조건 분기가 또 있는데, 이 부분은 프로그램 타이틀 바에 있던 메세지와 같아 보인다.

 

 

이어서 진행하다 보면 5CC894 주소의 CALL 명령에서 프로그램이 실행된다.

 

그렇다면 이전에 5CC836 주소에 있는 조건 분기가 찾던 부분인 것 같다.

 

 

5CC836 주소를 보면 zero가 아니면 5CC935 주소로 점프하라고 한다.

 

 

5CC935 주소는 위와 같다.

 

 

 

그렇다면 5CC836 주소의 jnz 명령을 jmp로 바꾸고 파일로 저장 후 실행한다.

 

패치된 파일 저장은 오른쪽 마우스 -> Copy to executable -> All modifications -> Save File이다.

 

 

그러면 위와 같이 패치된 것을 확인할 수 있다.

 

 

1-2. XP 환경에서의 Ollydbg About 메뉴에 있는 문자열 바꾸기

 

 

위의 1-1에서와 같이 EP 코드에서 오른쪽 마우스 -> Search for -> All referenced text strings -> 오른쪽 마우스 -> Search for text -> 위와 같이 입력

 

 

그러면 위와 같이 문자열이 나오는데, About 메뉴에서 봤던 문자열과는 약간 다르다.

 

Ctrl + L 키를 이용해 다음 일치하는 문자열을 찾다보면

 

 

위와 같이 일치하는 문자열이 나온다.

 

해당 문자열의 위치인 56247B 주소로 이동한다.

 

 

위의 부분이 해당 문자열이 위치하는 부분인데, 562466 주소에서 조건 분기문이 있다.

 

0이 아니면 56248A 주소로 점프하라는 것인데

 

 

56248A 주소는 <Unregistered Version> 문자열을 지나친 주소이다.

 

그렇다면 562466 주소의 조건 분기는 등록되지 않은 버전인지 라이센스 버전인지를 판단하는 것 같다.

 

 

562466 주소의 JNZ 조건 분기문을 JMP 문으로 바꾸고 파일로 저장 후 실행해본다.

 

오른쪽 마우스 -> Copy to executable -> Copy All -> Save File

 

 

그러면 위와 같이 <Unregistered Version> 문자열 대신 Licensed Version 문자열이 있는 것을 확인할 수 있다.

 


2. Windows 11 환경에서의 x32dbg 변수의 값을 바꿔 패치하기

 

위에서 Ollydbg로 한 방법은 사실 라이센스 검사를 몇 번하는지 알고 있을 때 혹은 바꿀 부분이 적을 때는 좋지만 하나하나 수정해야 하는 번거로움이 있다.

 

그래서 조건 분기를 할 때 값을 비교하는데 그 값을 변경하여 등록된 버전으로 로직이 되겠끔 바꾸면 된다.

 

 

x32dbg의 문자열 검색에서 "Unre"만 입력하면 위와 같이 나오는데 5CC83C 주소의 문자열로 간다.

 

 

해당 위치에서 스크롤을 조금 위로 올리다보면 위와 같이 5CC6D4 주소에 함수 스택 프레임이 있다.

 

5CC6D4 주소부터 파악해본다.

 

어셈블리어를 한줄 한줄 따라가다가 5CC711 주소에서 첫 점프문을 만난다.

 

60F3BC에 있는 값이 0과 같으면 5CC727 주소로 점프하라는 것이다.

 

 

위의 부분은 PC Surgeon started 문자열을 띄우는 부분으로 딱히 상관없으니 이 부분은 넘어간다.

 

 

5CC750 주소에서 두 번째 점프문이 있다.

 

이 부분은 60EB8C 주소에 있는 데이터를 eax에 담는데

60EB8C 안에 있는 값은 주소값이고 해당 주소값을 eax에 담는 것이므로

5CC74D 주소의 cmp 명령이 실행될 때는 eax에 담긴 주소값에 있는 데이터 4byte를 읽는 것이다.

 

 

5CC816 주소는 위와 같다.

 

5CC828 주소에서도 이전의 점프문과 같이 60EB8C 주소에서 값을 가져와 0과 비교 후 0이 아니면 점프한다.

 

 

5CC935는 위와 같은데, 이 부분은 이전에 1-1 Ollydbg에서 타이틀바에 출력되는 문자열을 없앨 때 점프했던 부분이다.

 

즉, 5CC750 -> 5CC828 or 5CC836 -> 5CC935이다.

 

 

그렇다면 5CC750에서 같지 않으면 점프니깐 5CC74D 주소의 cmp 명령에서 0이 아닌 값이 eax에 들어있어야 한다.

 

cmp 명령으로 비교 했을 때 두 값이 같으면 0, 다르면 1인데

 

cmp 명령의 결과가 0이면 두 값이 같다는 의미이고, ZF 플래그의 값은 1로 설정된다.

 

반대로 cmp 명령의 결과가 1이면 두 값이 다르다는 의미이고, ZF 플래그의 값은 0으로 설정된다.

 

그리고 JNE 명령은 ZF 플래그가 0일 때 점프하므로 ZF 플래그의 값이 0이게만 하면 되는데

 

5CC74D의 주소의 명령을 cmp가 아닌 mov로 바꿔주고 eax에 1을 넣게 한다면 이후에 eax를 검사할 때도 1이 들어가 있다.

 

ZF 플래그의 값은 0이고, 그러므로 jne 명령이 실행되어 결국 5CC816 주소로 점프한 뒤 5CC828 혹은 5CC836 주소에서 5CC935 주소로 점프하고 그렇게 되면 패치가 됐을 때의 상태가 된다.

 

 

5CC74D 주소의 cmp 명령을 mov로 수정하고 대입하는 값을 0에서 1로 한다.

 

그리고 패치한 파일을 저장하고 XP에 옮겨서 확인하면

 

 

위와 같이 잘 변경되어 있다.

 


CMP로 비교하는 문을 mov로 바꾸고 실행했을 때 Process

 

 EAX에는 610C4A 주소가 담겨있다.

 

 

5CC74D 주소의 명령을 실행하기 전 610C4A 주소의 데이터는 0이다.

 

 

5CC74D 주소의 명령을 실행한 후 610C4A 주소의 데이터는 0100으로 변하는데 리틀 엔디언이므로 0001로 해석해야 한다.

 

 

그리고 5CC74D 주소의 mov 명령어만 실행했을 때 ZF 플래그의 값은 0이다.

 

 

그러므로 5CC750 주소의 JNZ 명령이 실행되어 5CC816 주소로 점프한다.

 

 

그리고 나서 5CC820 주소에서 60EB8C 주소에 있는 데이터를 EAX에 담는데, 이 데이터는 610C4A이고

610C4A 주소에 있는 데이터를 0과 비교하지만 이미 이전에 610C4A 주소에 1을 저장했기 때문에 0과 같지 않으므로 jnz 명령이 수행되어 5CC935 주소로 점프하는 것이다.

 


 

반응형

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

[Lenatuts4you] 8. artgem11  (0) 2022.11.02
[Lenatuts4you] 7. MrBills  (1) 2022.11.02
[Lenatuts4you] 5. Visualsite Designer  (0) 2022.11.02
[Lenatuts4you] 4. pixtopianbook107  (0) 2022.11.02
[Lenatuts4you] 3. ReverseMe  (0) 2022.11.02

+ Recent posts