'Study/System'에 해당되는 글 29건

  1. 2007/10/14 10.9(화) 이론-1
  2. 2007/10/14 10.9(화) 실습-1
  3. 2007/10/14 10.8(월) 이론-1
  4. 2007/10/14 10.8(월) 실습-2
  5. 2007/10/14 10.8(월) 실습-1
  6. 2007/10/13 10.5(금) 이론-CreateProcess
  7. 2007/10/13 10.5(금) 이론-Debuger,KO,TKO
  8. 2007/10/13 10.5(금) 이론-함수호출 과정
  9. 2007/10/13 10.5(금) 실습-1

10.9(화) 이론-1

from Study/System 2007/10/14 14:55 view 19194
1. ReadProcessMemory

 - 프로세스간의 독립성은 보장되지만 디버깅을 위해 함수를 제공한다.
 - ReadProcessMemory, WriteProcessMemory

 - int 3( 브레이크 포인트 ), TF 레지스터 1 로 세팅하면 CPU가 한줄 단위로 읽게 된다.
 - 코드영역을 읽어와서 보여줄 수도 있다.( MinDbg, DebugActiveProcess ) 실행중인 프로세스와 연결!!
 - CreateProcess( option에 DEBUG_ONLY_PROCESS ) 를 준다.
 - WaitForDebugEvent 를 하면 DEBUG_EVENT에 정보가 들어가게 된다.

2. 컴파일 모드

  - Win32 Debug : 개발시, 실행오류체크와 관련된 메크로나 함수가 컴파일 대상에 포함된다.
  - Win32Release : 완성된 프로그램 일 경우 이 모드로 놓고 컴파일 해줌으로써 디버그 모드에서 수행되던 매크로나 함수는 컴파일 대상에서 제외되므로 보다 최적화된 코드가 탄생된다.

  - ASSERT 매크로
    1) Debug에서만 수헹, ASSET(조건식) 0 or 1
    2) 조건식이 거짓일 경우 ASSERT라는 이름의 Dialog박스를 출력하여 오류정보를 보여준다.

  - VERIFY 매크로
    1) Debug 모드에만 수행되며 ASSERT 와 동일한 매크로 이다.

  - TRACE 매크로
    1) Debug모드에서만 수행된다. 형식은 printf와 동일하며 Output 창에 출력된다.

  - OutputDebugString () == TRACE 괄호안의 문자열을 출력한다.

  - Dump()
    1) 디버그 모드에서만 수행한다.
    2) 특정개체에 저장된 데이타의 모든 항목을 Output 스크린상으로 전부 출력할 수 있는 코드를 추가가능.
Tag | ,

10.9(화) 실습-1

from Study/System 2007/10/14 14:36 view 77040
1. Debug 용 에러출력매크로( TRACE, ASSERT, VERIFY )

more..


2. CreateThread 와 종료대기

more..


3. 멀티 스레드와 동기화

more..


4. CrtiticalSection 의 Leave 보장..

more..


5. Atomic( 저수준 단계에서 원자연산 보장!! )

more..


6. ReadProcessMemory

more..


Tag | ,

10.8(월) 이론-1

from Study/System 2007/10/14 14:03 view 21145
1. 세그먼트 레지스터와 GDT( global Descriptor Table )
  -
index address size access
0 1000 5k R/W
1 2000 3k R

  - Segment Register
    1) DS, CS 는 Table의 인덱스를 가리킨다.
    2) mov dword ptr DS[0x1000], 10  : DS레지스터리로부터 1000번지 이동 상대적주소.

2. Data Structure


사용자 삽입 이미지

  - TEB안에는 PEB를 가리키는 포인터가 있다. FS[ 주소 ] : TEB의 정보를 읽을 수 있는 레지스터!!
  - PEB(Process Enviroment Block) : 프로세스를 관리하기 위해 User Mode에 둔다.
  - 직접 접근이 가능하므로 조사하면 많은 정보를 볼 수 있다. ex) dt nt!_PEB ( WinDbg 를 활용하자! )

2. Kernel 상속을 활용한 리다이렉션( 표준출력을 Console창에서 다른곳으로 바꾸는 작업 )

  - STARTUPINFO를 활용한다. 잘 알아보면 하는일이 너무많다...

more..


  - Handle의 공유 문제 : Duplicate 는 떠있는 상태에서 복사해준다.
  - 상속은 이제 만들어진 것에서 유용하다. 부모에게 그대로 상속받는다면 똑같은 Handle이 생성..

  - Kernel Object는 기본적으로 비상속 모드이다 이를 SetHandleInfomation 으로 바꿔준다.
            HANDLE hRead, hWrite;
            CreatePipe( &hRead, &hWrite, 0, 1024 );
            SetHandleInformation( hWrite, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT );

3. 프로세스 열거

  - User : Kernel32.dll ( ToolhelpAPI ) , ntdll.dll ( ZwQuerySystemInformation )
  - Kernel : EPROCESS - EPROCESS - EPROCESS -.. // 링크드리스트로 열거 되어 동기화 되고 있다.
 
  - kernel32.dll 은 NT4.0에서는 지원이 안된다. 대신에 PSAPI.dll 이 있다.

  - 프로세스 열거시 목록을 SnapShot 해둔다. ( 프로세스가 사라질 경우를 대비.. )
    // 프로세스의 목록을 메모리 어딘가에 보관(snapshot)해 둔다.
    HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

4. 특권얻기

사용자 삽입 이미지

  - MSGINA.dll : 로그인창의 다이얼로그가 들어있다.
  - 사용자가 지나dll을 다시 만들어서 로그인 과정을 바꾸는 것도 가능하다.

  - Access Token에는 사용자의 권한이 기록되어 있다.
BOOL EnablePrimary( HANDLE    hProcess, // 권한을 부여할 프로세스
                    char*    pri,      // 권한을 나타내는 문자열
                    BOOL    bEnable   // 가능/불가능 여부
                    )
{

    HANDLE hToken;
    OpenProcessToken( hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken );

    // 문자열로 되어 있는 권한ID( LUID, 64비트 정수 )로 변경한다.
    LUID luid;
    LookupPrivilegeValue(
        ".", // PC이름
        pri, // 권한이름
        &luid ); // luid를 담을 변수

    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;    // 갯수
    tp.Privileges[0].Luid = luid;    // 권한 ID
    tp.Privileges[0].Attributes= bEnable ? SE_PRIVILEGE_ENABLED : 0;

    return AdjustTokenPrivileges( hToken, 0, &tp, sizeof(tp), 0, 0 );
}
Tag | ,

10.8(월) 실습-2

from Study/System 2007/10/14 12:55 view 22080
1. nativeAPI.h 와 ntdll.lib 사용 ( 각 프로세스의 핸들카운트와 스레드시작주소 출력~ )

more..


Tag | ,

10.8(월) 실습-1

from Study/System 2007/10/14 12:18 view 20468
1. TEB에서 값 얻어오기

more..


2. 커널 상속( 콘솔 창에 출력을 edit박스로 받기 )

more..


3. Pipe를 사용한 콘솔창 출력을 에디트 박스로~( 한줄 씩 읽어보기 )

more..


3. 실행중인 프로세스 열거해보기

more..


4. pid 를 사용한 모듈 열거

more..


5. PC끄는 권한 얻어 와서 종료시키기

more..

Tag | ,

10.5(금) 이론-CreateProcess

from Study/System 2007/10/13 20:17 view 24731
1. CreateProcess ~ ko상태

사용자 삽입 이미지
 
  - A.exe에서 CreateProcess로 계산기를 생성함.
    1) &si로 STRARTUPINFO정보를 넘기고 &pi 로 PROCESS_INFORMATION를 얻어온다.
    2) pi에는 &pko(0x8100,000) 와 &tko(0x8200,0000) 를 얻어 올수 있다.(id도 얻어옴)
    3) 생성된 계산기의 참조계수는 부모와 자신이 참조하게 되므로 2가 된다.
    4) 이 때 calc.exe를 닫는다면 참조계수는 1이 되면서 메모리 Leak이 발생한다.
    5) 관리하는 구조체가 남아있는 상태가 되는 것이다.(좀비상태) CloseHandle을 사용하여 죽여야 한다.
    6) 그래서 프로세스의 생성에 성공했다면 참조계수를 꼭 1로 만들어 줘야 한다.(메모리 Leak방지)

  - 다른 프로세스의 종료코드 확인 ; GetExitCodeProcess()
  - PKO 내부에 ExitStatus 에서 이값을 저장하고 있다.
    1) Main_CRT_STARTUP -> 어떤한것 -> main -> return 하면 ExitStatus에 저장.
    2) STILL_ACTIVE (0x103) : 계산기가 살아있다면 가지고 있는값이다!!!

  - 프로세스 강제 종료 : TerminateProcess()
    1) 비동기 함수. 바로 종료되었는지를 확신 하지 못한다.
    2) Process 는 KO의 signal에 상태를 저장하고 있는데 non-signal은 살아있다. signal은 죽었을때 발생.
    3) WaitForSingleObject 로 KO가 signal 이 될때까지 대기 해주면 동기화 할 수 있다.




2. HWND VS ID

  - GetWindowProcessThreadId로 hwnd로 부터 pid를 얻어 낼 수 있다.
  - hwnd로는 대상윈도우에 접근 할려고 한다면 이는 상대적이므로 에러가 발생한다.
  - 하지만 pid는 시스템 전체에서 유니크하기 때문에 접근이 가능하다.
  - pid로 대상윈도우의 HANDLE을 얻기 위해선 OpenProcess를 사용하여 PKO->ObjectTable에 등록해준다.
  - 윈도우의 핸들 => 프로세스ID => 프로세스핸들 얻어서 제어 일종의 공식??

3. 프로세스의 핸들을 얻을 때는 필요한 권한만 요구해야 한다.( 제한된 권한까지 열려고 할땐 에러남 )
  // ALL은 너무 많은 권한
  HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0, pid );
  // 최소 요구의 원칙 - 필요한 권한만 요구하자.****꼭 필요한것만 요구하자.
            HANDLE hProcess = OpenProcess(
                PROCESS_TERMINATE | SYNCHRONIZE,    // 죽이고 | wait 할수 있는 권한
                0,
                pid
                );

Tag |

10.5(금) 이론-Debuger,KO,TKO

from Study/System 2007/10/13 19:07 view 20251
1. Debuger

  - User 모드 디버거 -> VC 디버거
  - Kernel 모드 디버거 -> SoftIce, WinDbg

  - WinDbg 초간단 사용법
    1) Symbol path 에  SRV*C:\symbol*http://msdl.microsoft.com/download/symbols 추가!!
    2) Kernel Debugging 눌러서 Local 로 선택
    3) dt nt!_구조체명   : KMUTANT, EPROCESS, KSEMAPHORE 등등 // 구조체의 내용을 본다.

2. Kernel Object( KO )
 
  - OS가 동작하는 3가지 Object ( 내부적으로 구조체를 갖는다는 의미 )

CreateWindow
CreatePen
CreateFile
User Object GDI Object Kernel Object (KO)
윈도우 객체
핸들이 전역
Public of Process
다른 프로세스에서 접근하여 움직일 수 있다.
펜객체
핸들이 지역
내부에서만 사용가능~
파일 객체
상대적 핸들
Private to Process
다른 프로세스에서 쓰게 하지 못한다.

  - KO의 특징 : 40여가지의 구조체를 가지고 있다. 상대적(한정적)핸들을 가진다.
    1) 공통속성 : 보안, signal, 참조계수, 이름, LIST_ENTRY

  - 상대적 핸들의 개념

사용자 삽입 이미지

사용자 삽입 이미지

  - 모든 커널 Object 소유자는 OS 이다. 파일의 생성후 프로세스가 종료된다면 파일은 누가 관리해줘야 할까?
  - Table의 Index가 곧 핸들값이므로 KO는 복사 되었을때 인덱스값이 달라진다. 이를 상대적 핸들이라 한다.


 

Tag | ,

10.5(금) 이론-함수호출 과정

from Study/System 2007/10/13 17:37 view 21187
1. 함수의 원리
  - USER 레벨
    1) exe 에서 CreateFile() 호출(kernel32.dll 에 있음 - 시스템함수)
    2) kernel32.dll 에서 내부적으로 NtCreateFile 호출( ntdll.dll 에 있음 )
    3) ntdll.dll 에서 기계어 코드를 수행한다.
mov    eax  서비스번호 5
mov    edx  스택주소
Int      2E        // 2E핸들러는 인터럽트를 사용하여 kernel 모드로 온다. eax를 확인하여 함수 호출

  - 보호모드 , 특권 레벨
    1) ZWCreateFile -> OS가 제공해주는 함수를 수행한다.
    2) SSDT ( System Service Dispatch Table )   정리 잘해 놓은 문서~
서비스 번호 함수 포인터
1  
2  
3  
4  
5 ZWCreateFile

  - Windows에서 파일을 열기 위해선 CreateFile을 호출해야 한다.
    1) SSDT Hooking 을 이용하여 이러한 함수의 호출을 막게 된다면 파일을 생성을 막을 수 있다.
    2) Native API는 도움말을 제공하지 않는다. !  포함헤더와 사용법은 다른 자료들을 참고!
    3) 디바이스 드라이버를 만들어야 SSDT를 후킹하여 접근할 수 있다.
    4) 프로세스 열거와 같은 기능은 Native까지 내려가야 한다.( 자세한 정보 표현 )

Tag |

10.5(금) 실습-1

from Study/System 2007/10/13 17:04 view 23724
1. 프로세스 생성과 CloseHandle의 이유 ( 자식을 정말 죽이자~!! )

more..


2. 다른 프로세스의 오브젝트 테이블을 복사 해 오기~!! ( a.txt에 B프로세스가 hello를 쓴다. )

more..


3. 마우스 캡쳐한곳의 윈도우창을 강제종료 시키기( pid를 얻어오는것이 관건 )

more..


Tag | ,