반응형

프로그램에서 발생 시키는 예외를 처리하고 콜 스택을 확인해 보자.

 

Music_Player.zip
9.52MB

 

 

※ 참고

Music_Player.exe.dd32
0.02MB

x32dbg로 분석하며 정리한 comments 파일

[x32dbg설치 위치]\release\x32\db에 복사해 넣으면 comment로 파일 내 중요한 위치의 정보가 표시된다.

 

 

1분 듣기 제한이 있는 Music_Player에서 00404563에서 eax와 60,000을 비교한 후 eax가 60,000보다 작으면 0040456B에 의해 4045FE로 점프하게 된다. 그래서 이 부분을 무조건 점프하도록 jl에서 jmp로 바꾸면 60초 후, 아래와 같은 Run-time error가 발생한다.

 

 

이 상태에서 x32dbg로 돌아와 디버기를 Pause한다.

 

 

그러면 760D10CC에서 멈추게 되는데 이 부분은 중요하지 않다.

 

 

Call Stack 윈도우에서 우클릭 - Show Suspected Call Stack Frame을 클릭한다.

 

 

위에서부터 살펴보면 music_player의 004046BF 주소로 돌아가야 한다는 것을 알 수 있다. 004046BF로 가보자.

 

 

004046BF 바로 위 주소 004046B9에서 call dword ptr ds:[<__vbaHresultCheckObj>] 명령에 의해 Run-time error가 발생한것을 알 수 있다.

 

 

이번엔 Run-time error가 발생할 때 x32dbg가 자동으로 break를 걸도록 해 보자.

 

Options - Preferences - Exceptions - Unknown exceptions 를 선택하고 First chance와 Debugger를 선택하고 저장한다.

 

마찬가지로 0040456B에서 무조건 점프 하도록 명령문을 jmp 0x004045FE 로 바꾸고 음악 파일을 60초 이상 플레이한다.

 

 

Run-time error 윈도우가 뜨기 전, 위 그림과 같이 자동으로 브레이크가 걸린다. 이 부분은 중요하지 않으므로 콜 스택 윈도우로 가보자.

 

 

이번에도 우클릭 - Show Suspected Call Stack Frame을 클릭하면 위 그림과 같이 music_player로 돌아갈 주소 004046BF가 표시되어 있다.

 

 

004046B9 call dword ptr ds:[<__vbaHresultCheckObj>] 명령이 실행되지 않도록 아래 그림과 같이 004046AB의 jge를 jmp로 바꾼다.

 

 

2025.07.18 - [Reverse Engineering] - [Ghidra] iVar1 = (**(code **)(*piVar3 + 0x44))(piVar3,local_a8)의 의미

 

 

Music_Player에서 60,000과 비교하는 플레이 시간을 가져오는 함수를 조금 더 살펴보자.

 

 

00404563에서 eax와 60,000을 비교하기 전, 0040455D에서 [ebp-A4]의 값이 eax로 복사 되는걸 볼 수 있다.

 

 

그전에 00404539~00404545에서 [ebp-A4]의 주소값이 eax로 복사되고 스택에 push되어 함수가 호출된다. [ebp-A4]의 주소는 0019F9F0이고 호출되는 함수에서는 ebp+C 에서 이 값을 찾을 수 있다. 여기서 60,000과 비교할 값을 가져온다는걸 추측할 수 있다.

00404545에 브레이크 포인트를 걸고 어떤 함수로 이동하는지 살펴보자.

 

 

Step Into로 한 스텝 들어가 보면 여러 함수의 목록 테이블 같은 코드로 이동하게 된다. 그 중 00401A38은 4055A0로 이동하는 jmp명령이다.

 

4055A0는 HScrollBar의 위치를 가져오는 함수다.

 

플레이가 시작되면 음악 파일의 재생 위치 위치로 시간을 가져 오는게 아닌, 타이머를 1초 간격으로 호출하며 스크롤 바를 이동 시키고 다시 그 스크롤 바의 위치로 재생 시간을 구하는게 아닌가 싶다. (VB Decompiler 분석)

 

 

 

004055A0 함수의 내용을 보면 004055F5 에서 어떤 함수 호출 후 [ebp+C]의 값을 edx로 복사하고 004055FE 에서 그 함수의 리턴값을 edx가 가리키는 위치로 복사하는 것을 볼 수 있다. 여기서 [ebp+C]는 이전 함수에서 60,000과 비교할 값을 저장할 [ebp-A4]의 위치 값(0019F9F0)이다. 바로 플레이 시간이 저장되는 것이다.

 

ebp+C 에 들어있는 값 = 0019F9F0

 

 

그런데 004055FE 명령 전 까지 진행 된 상태에서 레지스터를 보면 EBX, EDI 값이 0인걸 알 수 있다.

 

 

그래서 004055FE mov dword ptr ds:[edx],eaxmov dword ptr ds:[edx],edi로 바꾸면 플레이 시간이 항상 0으로 인식될 것이다. 하지만 이렇게 하면 HScrollBar도 항상 0인 위치를 가리키게 된다.

 

반응형
Posted by J-sean
: