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가 호출되도 "메모장" 대신 "사람인"으로 
출력되겠다. 이상!




Advanced Windows Debugging [1] - 디버깅 툴 소개

팀에서 막내와 함께 윈도우 디버깅 스터디를 해보자고 시작한 책이 바로 이 책이다.

"모르는 것은 죄가 아니다 하지만 알려고 하지 않는 것은 대죄다."

 


1. 각종 디버깅 툴 소개
이 장에서는 이 책에서 사용하는 디버깅 툴 뿐만 아니라, 유용한 디버깅 관련 툴을 간단히 소개하고 넘어간다. 그 내용을 정리하면, 크게 세가지로 분류할 수 있다.

  • 메모리 누수 관련 툴
    • Leak Diagnosis Tool : LD Graph와 함께 사용한다.
  • 디버깅 툴
    • Windbg : GUI 기반 유저/커널모드 디버깅 툴.
                   x64버전 Windbg는 x86 프로세스도 디버깅 된다.
    • CDB      : Console 기반 유저모드 디버깅 툴.
                   부팅시 그래픽 서브시스템이 초기화 되기 전 꼭 필요한
                   OS 서브 시스템 프로세스에 어테치가 가능하다.
    • NTSD   :
    • KD       : Console 기반 커널 모드 디버깅 툴.
  • 프로세스/네트워크 룩업 툴
    • Process Explorer
    • Wireshark

2015년 3월 7일 토요일

PRINTING ARCHITECTURE


지금 내가 맡고 있는 제품은 프린트 보안...
수 많은 보안 영역 중에 프린트 보안은 인기도 없고 관심도 없다.
그렇다고 기술적으로 배울게 없는 것은 아니다.
프린트 보안 S/W의 요구사항은 대체적으로 아래와 같을 것이다.
      
      1. 인쇄물에 회사 로고를 넣어줘 
            => 워터마크
      2. 누가 언제 무엇을 인쇄 했는지 관리자가 알 수 있게 해줘
            => 인쇄 로깅
요구사항은 단순 하지만 기능을 구현하려면 알아야 할 것들이
한 두 가지가 아니다. 그 중 첫 번째로 알아야 할 것은 인쇄 프로세스가 되겠다.
오늘은 인쇄 프로세스에 대해 공부해 보자.




이 주제에 대해 구글링을 조금 해보신 분들이라면 알겠지만 제대로된 자료가 많이 없다.
그래서 책을 찾아 봤는데... 인쇄에 대해 깊이 있게 설명하고 있는 책은 많지 않다... 

하지만! GDI로 가장 유명한 책인 Windows Graphics Programming Win32 GDI and DirectDraw을 선택하고, 2.4 Printing Architecture 챕터를 공부해 보기로 한다. 


책을 처음 보기 때문에... 아래 글 수준은 책을 번역하는 정도가 될 것 같다.