cr0 레지스터를 이용한 Write Protection 제거 시스템 프로그래밍



컨트롤 레지스터는 현재 수행중인 태스크의 특성과 프로세스의 동작모드를 결정 짓는 특별한 레지스터이다.
32 비트와 32 비트 호환 아키텍쳐에서 이 레지스터들은 32 비트이고, 64 비트에서는 64 비트다.
mov CRn
인스트럭션으로 이 레지스터들을 건드릴수 있고..

CR3 레지스터는 페이지 디렉토리를 찾아가기 위한 레지스터이고.. 나머지는.. RTFM!

CR0 는 CPU 의 operating mode 와 상태를 제어하는 플래그를 포함하고 있다. 오홋.. ^^
PG, CD 등...중요한 플래그들이 많지만 일단 관심대상은 아니고.. ^^

WP
Write Protect (bit 16 of CR0) — Inhibits supervisor-level procedures from writing
into user-level read-only pages when set; allows supervisor-level procedures to write
into user-level read-only pages when clear. This flag facilitates implementation of the
copy-on-write method of creating a new process (forking) used by operating systems
such as UNIX*.

Copy-On-Write 매커니즘과 관련있는 넘이었군..
결국 이 플래그를 조작하면 write protection 속성을 바꿔치기 할 수 있다는 거다.



//
// 콘트롤 레지스터 관련 (IA-32 manual vol3, ch 2.5
// CR0 (Control Register Zero) 레지스터의 WP 비트(16)는 쓰기 속성제어에 사용됨
//
#define CR0_WP_MASK 0x0FFFEFFFF

VOID ClearWriteProtect(VOID)
{
__asm
{
push eax;
mov eax, cr0;
and eax, CR0_WP_MASK; // WP 클리어
mov cr0, eax;
pop eax;
}
}

VOID SetWriteProtect(VOID)
{
__asm
{
push eax;
mov eax, cr0;
or eax, not CR0_WP_MASK; // WP 비트 세팅
mov cr0, eax;
pop eax;
}
}




더 자세한 내용은 IA-32 메뉴얼의 4.1 섹션을 참고하면 된다.
요는 페이지 레벨의 프로텍션을 en/disable 하기 위해서는 PDE, PTE 의 플래그와 CR0 의 WP 비트를 조작한단 거다.

• Clear the WP flag in control register CR0.
• Set the read/write (R/W) and user/supervisor (U/S) flags for each page-directory and pagetable
entry.

핑백

  • 서동필님의 이글루 : 참고 2008-08-06 13:04:41 #

    ... t.htm (SSDT, Service ID List)http://www.cmkrnl.com/arc-newint2e.html (Adding Native APIs)http://somma.egloos.com/2131561 (CR0, Remove the Write Protection)http://research.microsoft.com/sn/detours/ (Detours ... more

  • zXEr's Blog : WP in Control Register CR0 2009-12-04 11:19:50 #

    ... el® 64 and IA-32 Architectures Software Developer’s Manual, 2009.2. somma, cr0 레지스터를 이용한 Write Protection 제거. ... more

덧글

  • 마진가 2006/01/20 10:19 # 답글

    RTFM 이란 말은 뭐예요????죄송합니다 제가 정말 무식한놈이라서^^
  • 마진가 2006/01/20 10:21 # 답글

    무식하게 질문해도 될까요????
    그런데 어떤것? 무엇에 대한 write 보호죠????
    메모리 영역?요? 만약 그렇다면 메모리라면....가상 주소공간인가요? 물리 주소 공간인가요?
  • 마진가 2006/01/20 10:23 # 답글

    좀 긁어갈께요~~
  • somma 2006/01/20 13:38 # 삭제 답글

    일단 RTFM 은 Read The Fine Manual 또는 Read The Fucking Manual ^^ 의 약자구여..헤헤
    CR0.WP 비트는 메모리 페이지에 대한 속성제어 입니다.
    결국.. 따지고 보면 물리 메모리에 대한 속성 제어가 맞죠...PTE 는 가상 주소 공간에서 물리 주소를 찾아가는 과정에서 이루어지는 체크일테니까요..
  • 마진가 2006/01/21 11:34 # 답글

    아~~~그렇군요^^ 역시 멋지십니다.^^
  • seyool 2006/01/27 11:48 # 삭제 답글

    형님 멋지십니다 -_-)b
    새해 복 많이 받으세요
  • somma 2006/01/27 18:26 # 삭제 답글

    응..너도 복 많이 받어...ㅎㅎ
  • AmesianX 2007/02/07 22:27 # 삭제 답글

    오.. 항상 고급정보만 올려놓으시네요...

    앞으로도 계속 좋은 정보 기대하겠습니다. 수고하세요..
  • 홍병장 2007/02/07 23:13 # 삭제 답글

    여긴 항상 좋은 정보들만 득실득실하군요
    언젠가는 건들어야 할 개념들....으음~_~

    일단 유저단에서 최대한 알고 들어가야겠습니다
    그래야지 시스템레벨에서의 예술을 감상할수있겠네요 ^__^;
    COW = 소 :-)
  • somma 2007/02/08 17:12 # 답글

    AmesianX, 홍병장 / 좋게만 말씀해 주시니 .. 좀 쑥스럽습니다. 제가 낸 아이디어도 아니고.. 원래 있던 내용들이라서...^^
    약간의 부담도 ...ㅎㅎ
  • seyool 2007/11/22 16:53 # 삭제 답글

    왜 메모리조작한 프로세스가 재실행해도 똑같이 고친게 남아있나 해서 고민했는데,,
    결국은 WP때문에 COW가 일어나지 않아서였네요.
    감사합니다 ㅡ.ㅜ
  • amanaksu 2009/02/17 19:44 # 삭제 답글

    항상 잘 보고 갑니다. ^-^;
    궁금한 점이 있는데요 위처럼 CR0에 대한 접근을 위해서는 Kernel에서만 가능한데 혹시 드라이버를 사용하지 않고 CR0를 제어하거나 또는 다른 방법으로 메모리의 접근을 허용하게 하는 방법은 없을까요? 제가 요즘 User에서 Hidden Process 찾는 프로그램을 만드는 중인데요 API등을 전혀 사용하지 않고 찾아 보려고 방법을 고민중인데 Thread를 찾아도 메모리 속성때문에 정보를 Read할 수가 없네요...ㅜ.ㅡ) 혹시 아신다면 답변 좀 부탁드립니다.
  • somma 2010/05/25 01:57 #

    글쎄요.
    원하시는 작업은 CR0 랑은 상관이 없는듯 한데요.
    phrack 에서였든가 devicephysical memory 를 이용해서 물리메모리에 접근하는 내용의 글이 있을겁니다.
    그 문서를 한번 찾아보심이 좋을 듯 하네요.
  • hoon038 2010/06/14 15:23 # 삭제 답글

    퍼 가도 될까요?
  • somma 2010/06/14 15:25 #

    네 그러세요 :-)
댓글 입력 영역