[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 이기 때문에 동작하리라 생각 합니다.
아래는 스크린 샷 입니다.
주의 ! 위의 Command 를 입력하고 한 번이 아닌 두번의 Enter 키를 입력해야 합니다. 나중에 스크린 샷을 수정 하도록 하겠습니다. J
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
- Anonymous
February 23, 2009
PingBack from http://www.clickandsolve.com/?p=13605