[x32dbg/x64dbg] Exception Handling and Call Stack Check 예외 처리 및 콜스택 확인
Reverse Engineering 2025. 7. 19. 18:37 |프로그램에서 발생 시키는 예외를 처리하고 콜 스택을 확인해 보자.
※ 참고
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를 걸도록 해 보자.
마찬가지로 0040456B에서 무조건 점프 하도록 명령문을 jmp 0x004045FE 로 바꾸고 음악 파일을 60초 이상 플레이한다.
Run-time error 윈도우가 뜨기 전, 위 그림과 같이 자동으로 브레이크가 걸린다. 이 부분은 중요하지 않으므로 콜 스택 윈도우로 가보자.
이번에도 우클릭 - Show Suspected Call Stack Frame을 클릭하면 위 그림과 같이 music_player로 돌아갈 주소 004046BF가 표시되어 있다.
004046B9 call dword ptr ds:[<__vbaHresultCheckObj>] 명령이 실행되지 않도록 아래 그림과 같이 004046AB의 jge를 jmp로 바꾼다.
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명령이다.
플레이가 시작되면 음악 파일의 재생 위치 위치로 시간을 가져 오는게 아닌, 타이머를 1초 간격으로 호출하며 스크롤 바를 이동 시키고 다시 그 스크롤 바의 위치로 재생 시간을 구하는게 아닌가 싶다. (VB Decompiler 분석)
004055A0 함수의 내용을 보면 004055F5 에서 어떤 함수 호출 후 [ebp+C]의 값을 edx로 복사하고 004055FE 에서 그 함수의 리턴값을 edx가 가리키는 위치로 복사하는 것을 볼 수 있다. 여기서 [ebp+C]는 이전 함수에서 60,000과 비교할 값을 저장할 [ebp-A4]의 위치 값(0019F9F0)이다. 바로 플레이 시간이 저장되는 것이다.
그런데 004055FE 명령 전 까지 진행 된 상태에서 레지스터를 보면 EBX, EDI 값이 0인걸 알 수 있다.
그래서 004055FE mov dword ptr ds:[edx],eax 를 mov dword ptr ds:[edx],edi로 바꾸면 플레이 시간이 항상 0으로 인식될 것이다. 하지만 이렇게 하면 HScrollBar도 항상 0인 위치를 가리키게 된다.