2015년 3월 15일 일요일

[Windbg] e 명령어 활용

오늘은 e 명령어에 대해 알아보자.
e 명령은 메모리에 들어있는 값을 바꾸는 enter 명령어다.
프로세스가 실행 중인 레지스터 값도 바꿀 수 있고, 메모리 변수 값도 바꿀 수 있다.

그럼 바로 실습 들어가시겠다.
 (1) Windbg를 실행한다.
 (2) Ctrl+E 누르고 C:/windows/system32/notepad.exe를 실행

자 여기까지 했으면 메모장이 실행됨과 동시에 Windbg가 제어권을 가지고 있을 것이다.
이제 메모장이 출력하는 MessageBoxW의 title 스트링을 바꿔보자.
아래 메시지 박스의 타이틀을 "메모장"에서 "사람인"으로 바꿀 것이다.


우선 메모장이 MessageBoxW를 호출할 때 break point가 잡혀야 하므로,
windbg에서 bp user32!MessageBoxW 한다.

         bp user32!MessageBoxW

이제 메시지 박스가 호출되도록, 메모장 - 편집 - 바꾸기를 클릭하고,
찾을 내용에 "fewf" 아무거나 입력한 후 [다음 찾기]를 클릭하면
MessageBoxW가 호출 되기 직전에 windbg로 제어권이 넘어갈 것이다.

자 이제 "메모장" 이란 타이틀은 MessageBoxW(hwnd, pwcsTitle, pwcsMsg, ..)
2번째 인자로 넘어간 다는 것을 알 수 있다.

그럼 확인해 보자.

0:000> ddu ebp+0n8
0009f360  002b09ea "ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ"
0009f364  03de6dd8 ""ff"을(를) 찾을 수 없습니다."
0009f368  0031f218 "메모장"
0009f36c  00000040

ebp+8이   첫번째 인자 : hwnd 이고,
ebp+12가 두번째 인자 : pwcsTitle
ebp+16이 세번째 인자 : pwcsMsg 이다.

그럼 ebp+12가 가리키고 있는 값을 바꾸면 되겠다.
ebp+12의 값은 0031f218 이다!

0:001> dd ebp+0n12
041dfe94  0031f218 77b99f72 00000000 73731998
041dfea4  00000000 00000000 00000000 00000000

0031f218가 "메모장" 문자열의 [0] 번째 주소다.

0:000> du 0031f218 
0031f218  "메모장"

자 이제 0031f218 주소에 들어있는 값을 바꾸면 되겠다.

ezu : e 변수 값 변경 / zu 유니코드 널 스트링으로!
0:000> ezu 0031f218 "사람인"

du : 유니코드 스트링으로 보여줘
0:000> du 0031f218 
0031f218  "사람인"

자 이제 MessageBoxW로 들어온 값을 아래와 같이 바꿨으니 g 실행하면!!
메시지박스가 출력되면서  MessageBoxW(hwnd, "사람인", ..., ...) 으로 출력된다!





메모리가 변경됐으니, 다시 MessageBoxW가 호출되도 "메모장" 대신 "사람인"으로 
출력되겠다. 이상!




댓글 없음:

댓글 쓰기