Udostępnij za pośrednictwem


[DebugToolBox]MessageBox 호출기록

"이 문서는 https://blogs.msdn.com/debuggingtoolbox blog 의 번역이며 원래의 자료가 통보 없이 변경될 수 있습니다. 이 자료는 법률적 보증이 없으며 의견을 주시기 위해 원래의 blog 를 방문하실 수 있습니다. (https://blogs.msdn.com/kocoreinternals/archive/2008/09/23/windows.aspx)"

[Windbg 스크립트]MessageBox 호출기록

이전에 지원을 하던 Case 에서 저는 C++ Application 에서 표시하는 메시지박스의 내용을 알아야 했습니다. 제가 질문하면 고객은 맞지 않는 답변을 하였고 어떤 메시지였는지 확인할 수 없었습니다.

이런 경우 Script 가 도움을 줄 수 있고 이 스크립트가 여러분께 많은 도움을 주기를 바랍니다.

이 스크립트는 메시지박스가 호출될 때 메시지박스로부터 메시지를 추출하여 Windbg 화면에 출력 합니다.

디버깅을 마친 후 “.logclose” 명령을 입력하여 log 를 닫아야 합니다. 그리고 “ß Text from MessageBox” 메시지를 검색하여 어떤 메시지였는지 확인할 수 있습니다.

DBMon.exe 나 DebugView.exe 를 사용해서 메시지박스 윈도우가 나타내는 메시지를 확인할 수 있습니다.

.NET application 에는 test 하지 않았으나 메시지박스 호출은 .NET Framework 보다 하부 Framework 이기 때문에 동작하리라 생각 합니다.

아래는 스크린 샷 입니다.

clip_image001

clip_image002

clip_image003

주의 ! 위의 Command 를 입력하고 한 번이 아닌 두번의 Enter 키를 입력해야 합니다. 나중에 스크린 샷을 수정 하도록 하겠습니다. J

clip_image004

clip_image005

clip_image006

Source code for MSGBOX_TRACING.TXT:

역자 주)

.dvalloc – 가상 메모리를 할당하는 것 입니다. /b 는 base address 입니다.

Eb 0x7EEEEEEE 50 은 ASM 코드로 push eax 입니다.

Call – target process

MessageBoxExW 에 BreakPoint 를 걸어 놓고 0x7EEEEEEE 에는 push eax 를 설정 그리고 MessageBoxExW 의 첫번째 파라미터인 esp+8 을 eax 에 넣은 후 Call 명령으로 OutputDebugStringW 를 호출하는 것 입니다.

$$

$$ =============================================================================

$$ Log MessageBox messages in a log file.

$$ The log file name starts with MessageBox string.

$$

$$ Compatibility: Win32.

$$

$$ Usage: $$>< to run the script.

$$

$$ Requirements: Public symbols.

$$

$$ Roberto Alexis Farah

$$ Blog: https://blogs.msdn.com/debuggingtoolbox/

$$

$$ All my scripts are provided "AS IS" with no warranties, and confer no rights.

$$ =============================================================================

$$

$$ This location 7EEEEEEE is difficult to be used but

$$ it could be occupied!!!

$$

.dvalloc /b 0x7EEEEEEE 0x400

r @$t0 = 0x7EEEEEEE

eb 0x7EEEEEEE 50

bp user32!MessageBoxExW "r @$t1 = @eip; r @eax = poi(@esp + 0x8); r @eip = @$t0;g"

bp @$t0 + 0x6 ".echo <-- Text from MessageBox; r @$ip = @$t1;g"

.logopen /t /u MessageBox.txt

.printf /D "\nType <b>call kernel32!OutputDebugStringW</b> then press Enter key two times then 'g' command after it.\n"

a 0x7EEEEEEF

$$

$$ ATTENTION! Use .logclose after finishing the debugging session.

$$

$$ =========================

Note: 스크립트가 일부 수정되었습니다. 언제든지 수정될 수 있으며 수정할 경우 코멘트를 넣어 놓도록 하겠습니다.

Comments