커널 오브젝트를 이용한 스레드 동기화 ■ 유저 모드 동기화 메커니즘에 비해 느린 편이지만 유저 모드 동기화 메커니즘에 비해 폭넓게 사용 가능다른 프로세스간 사용 가능 ■ 해당 함수들은 유저 모드에서 커널 모드로의 전환을 필요로 함 -> 커널 모드에서 수행하는 작업을 완전히 배제 하더라도 x86 플랫폼에서 약 200CPU 사이클 정도가 필요한 비싼 작업 -> 새로운 스레드가 모든 캐시를 비우고 스케줄링 되기 위해선 수만 사이클 필요 ■ 대부분의 커널 오브젝트는 동기화를 위해 사용될 수 있다 -> 모든 커널 오브젝트는 시그널, 논시그널 상태가 될 수 있다▶ 시그널 : 사용 가능 상태▶ 논시그널 : 사용 불가 상태 대기 함수들■ 대기 함수를 호출하면 인자로 전달한 커널 오브젝트가 시그널 상태가 될 때 까지 이 함수를 호출한 스레드를 대기 상태로 .. 유저 모드 스레드 동기화 ■ 윈도우는 모든 스레드가 상호 통신 없이 각자의 작업을 수행할 때 최고의 성능을 발휘 -> 하지만 스레드가 독립적으로 상호 통신 없이 독립적으로 수행되는 경우는 거의 없음▶ 상호 통신 없이 독립적으로 수행?○ Process A에서는 File을 읽고 있음과 동시에 Process B에서는 File을 쓰는 작업을 실행 -> 수정 중인 데이터를 읽는 행위 -> 매우 불안정한 데이터 ■ 스레드 상호 통신을 수행해야 하는 상황1. 다수의 스레드가 공유 리소스에 접근하며 리소스가 손상되지 않아야 할 때2. 어떤 스레드가 하나 혹은 다수의 스레드에게 작업이 완료 되었음을 알려야 할 때 ■ 스레드 동기화 중에선 제일 빠름 -> 최상의 성능 ■ 프로세스 내의 스레드들 사이에서만 동기화 수행 가능 원자적 접근■ 원자적 접.. 스레드 스케줄링, 우선순위 ■ 비선점형 운영체제 -> 특정 프로세스가 CPU를 독점하는것이 가능 ■ 선점형 운영체제 -> 특정 프로세스가 CPU를 독점하는것이 불가능, 어떤 스레드가 언제 그리고 얼마만큼 오랫동안 스케줄링될지를 결정 ■ 윈도우는 시간마다 (GetSystemTimeAdjustment 함수 호출시 두번째 매개변수로 반환되는 값 만큼) 모든 스레드 커널 오브젝트 중 스케줄 가능 상태에 있는 스레드 커널 오브젝트를 검사하고, 이 중 하나를 선택하여 스레드의 컨텍스트 구조체 내에 저장된 레지스터 값을 CPU 레지스터로 로드한다 -> 컨텍스트 전환 ■ spy++ 라는 도구로 각 스레드들이 얼마나 많이 수행될 기회(타임 슬라이스)를 부여받았는지 확인 가능 ■ CreateProcess, CreateThread를 호출하면 스레드 .. 스레드 "프로세스내 코드 실행의 주체" ■프로세스는 스스로 실행될 수 없다 -> 프로세스는 어떤 것도 수행할 수 없으면 단순히 스레드의 저장소■독립적인 주소공간이 아닌 프로세스의 주소공간을 공유 -> 프로세스는 자신만의 주소 공간을 가지기 때문에 스레드에 비해 더욱더 많은 시스템 리소스를 사용함■그에 반해 스레드는 프로세스와 비교했을때 상당히 적은 리소스를 사용함(하나의 커널 오브젝트, 스레드 스택 정도) -> 프로세스를 새로 생성해야할 경우 스레드를 생성해보는것도 좋은 경우 -> 프로세스가 좋은 방법일 때도 있고 스레드가 좋은 방법일 때도 있음 스레드 생성 방법 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, .. 프로세스 "여러 스레드의 집합" ■ 프로그램은 보조 기억장치에 존재하며 실현되기를 기다리는 명령어와 정적인 데이터(스레드) 묶음이 프로그램의 정적 데이터가 메모리에 적재되면 프로세스가 된다(실행중인 프로그램)■ 프로세스가 무언가를 수행하기 위해서는 반드시 프로세스의 컨텍스트 내에서 수행되는 스레드가 있어야 함 -> 스레드가 프로그램 내의 코드 수행에 실체■ 하나의 프로세스는 다수의 스레드를 가질 수 있다 -> 여러 스레드는 동시에 코드를 수행한다(사실 말하자면 동시에 모든 스레드를 수행하는건 아님, 모든 스레드가 동시에 수행될 수 있도록 하기위해 운영체제는 퀀텀이라는 단위의 시간을 나누어줌, 각 스레드들은 라운드 로빈 방식으로 퀀텀 만큼만 실행을 하게 되어 동시에 실행되는것과 같이 보임)■ 각 스레드들은 자신만의.. IDA PRO 사용법 2. 데이터베이스 닫기 및 다시열기 IDA 종료(데이터베이스 닫기)그림 1. IDA PRO 종료 시 나오는 Save database 창 ■ Don't pack database 1 -> 수정사항을 4개의 데이터베이스 파일에 반영하고 IDB 파일을 생성하지 않고 IDA를 닫는다 ■ Pack database (Store) 2 -> 4개의 데이터베이스 파일 컴포넌트가 단일 IDB 파일로 묶인다 -> 4개의 데이터베이스 파일은 삭제됨 ■ Pack database (Deflate) 3 -> Store와 동일하나 해당 옵션에선 압축까지된다.Collect garbage 4 -> 데이터베이스를 닫기 전에 쓰지않는 메모리 페이지를 삭제하는 작업을 수행 -> 3 옵션을 병행하면 최소한의 크기를 갖는 IDB 파일을 생성 ■ DON'T SAVE the datab.. IDA PRO 사용법 1. 첫 시작 "IDA Pro는 데이터베이스 애플리케이션" 신규 데이터베이스가 생성되고 실행파일에서 자동적으로 정보를 얻어와 데이터베이스에 필요 정보를 넣는다 -> IDA의 강력함은 원본파일은 그대로 두고 데이터베이스의 데이터만을 분석하고 처리한다는 데에 있음 IDA 데이터베이스파일에 대하여IDA는 선택한 실행파일을 메모리에 올려 분석을 하는것이 목적실행 파일을 메모리에 올리면 IDA의 데이터베이스파일이 생성되는데 .id0, id1, .nam, .til이라는 4개의 파일에 저장된다 4개의 파일은 현재 프로젝트를 닫으면 단일 IDB 파일로 묶여지는데, 때에 따라서압축될수 있음(주로 IDA 데이터베이스파일이라면 IDB 파일을 말한다) 크기는 원본 입력 바이너리 파일의 10배정도 크기가 된다IDA의 디버거로 실행파일을 디버.. 커널 오브젝트 (Kernel Object) "커널에 의해 할당된 간단한 메모리 블록" ■ 커널 오브젝트는 주로 Create*류 함수로 생성->해당 Create*류 함수를 호출하면 각 커널 오브젝트를 구분하기 위한 "핸들" 값을 반환(핸들값은 커널오브젝트에 존재하는게 아님, 프로세스 핸들 테이블에 존재) ■ 커널 오브젝트는 커널에 의해서만 접근 가능한 메모리 블록-> 커널에 의해서만 접근 가능한 데이터 구조체 이기에 해당 데이터 블록은(커널 오브젝트) 애플리케이션(사용자 단)에서 데이터 구조체가 저장되어 있는 메모리 위치를 직접 접근하여 그 내용을 변경하는 것은 불가능 -> 애플리케이션(사용자 단)에서 메모리 직접 접근으로 데이터 변경이 불가능 하다고 데이터 구조체를 구성하는 데이터들을 참조 하거나 변경하는 행위 자체가 불가능 하단 뜻은 아님!! .. 이전 1 다음