목록Study/Programming (86)
메모장 입니다2
1.특징 -양방향 전달이 가능하다. (커널 유저) 단방향 통신>ReadFile>WriteFile 2.컨트롤 코드 -버퍼 전달 형식 등을 설정할 수 있음. -CTL_CODE() 메크로를 이용하여 간단히 설정 가능. #define IOCTL_TEST_NCTL_CODE(FILE_DEVICE_UNKNOWN,0x4000,METHOD_NEITHER,FILE_ANY_ACCESS)#define IOCTL_TEST_BCTL_CODE(FILE_DEVICE_UNKNOWN,0x4000,METHOD_BUFFERED,FILE_ANY_ACCESS) 3.순서 0)커널] 디바이스 오브젝트 생성. 1)커널] 심볼릭 링크 설정. 2)유저] CreateFile(심볼릭 링크)로 드라이버 핸들 open. 3)유저] DeviceIoControl..
1.개요 -IRP 후킹을 이용한 키로거 제작중, 디바이스 오브젝트에 플레그값(DO_BUFFERED_IO)을 설정 안하니 블루스크린 오류가 발생하여서, 해당 속성값에 대한 정보를 찾게 됨. 2.방식 -쓰레드, 프로세스의 데이터 관련 1)Direct IO 2)Buffred IO 3)Neither IO(디폴트) -DeviceIoControl 관련>DeviceIoControl 함수로 전달되는 데이터 버퍼의 전달형식을 지정>데이터 저장위치가 달라지기 때문에 중요. 1)METHOD_BUFFERED>Buffred IO 방식으로 전달.>입력: 모름 (참고 자료에는 associatedIrp.systembuffer라고 나와있으나, 실제로 테스트 결과 해당 버퍼로 전달시 유저모드에서 확인이 안됨.) 출력: irp->User..
1.개요 -Direct Kernel Object Manipulation(직접적인 커널 오브젝트[개체] 조작) -정의:프로세스 토큰을 직접 변경하여 시스템이나 관리자 권한을 획득 -윈도우 오브젝트`커널 개체`>프로세스나 드라이버가 로드될 때 커널은 커널 개체를 메모리상에 생성 후 관리.>실행부 개체들이 만드는 동기화와 같은 기본적인 기능을 제공>유저모드 코드에서는 확인할 수 없음.>DKOM 기법은 이 커널 개체에 접근하는 것. `실행부 개체`>실행부의 구성요소들에 의해 구현된 개체.>프로세스 관리자, 메모리 관리자, I/O 서브시스템 등이 있음. 2.특징 -장점1)오브젝트 매니저를 거치지 않기 때문에, 커널 오브젝트에 대한 권한 체크가 이뤄지지 않는다. -단점1)견고하지 않기 때문에 오브젝트에 대한 명확한..
1.CompletionRoutine 개요 -IRP 처리 과정에서 IoCompleteRequest()가 호출되면, IRP가 디바이스스텍의 최하단, 즉 버스드라이버의 처리까지 완료된 후에 스텍을 거슬러 돌아오는 시점에 자동으로 호출된다.(등록되있을 경우) -후처리용 콜백함수라 함. 2.선언 -콜백함수 형식 NTSTATUSIoCompletion(PDEVICE_OBjECT DeviceObject,PRIP irp,PVOID Context); -콜백함수 등록VOIDIoSetCompletionroutine(IN PIRP irp,IN PIO_COMPLETION_ROUTINE CompletionRoutine,IN PVOID Context,IN BOOLEAN InvokeOnSuccess,IN BOOLEAN InvokeOn..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
1.설명 -방법1)XOR2)배열에 추가/삭제 2.코드 1)벡터에 추가/삭제->O(N**2)>>vector.find() 자체의 속도복잡도가 느린듯하다. >>set을 이용하면 됨. #include int solution(vector &A) { // write your code in C++11 (g++ 4.8.2) vector temp; vector::iterator iter; for(int i=0; i
0. 설명 1)C++ 벡터에 대해 살짝 공부했다. A.push/pop_back() :뒤에서부터 추가/삭제 A.insert/erase() :원하는 위치를 추가/삭제 A.begin() :처음 위치 점수보기 ---------------------- vector solution(vector &A, int K) { // write your code in C++14 (g++ 6.2.0) for (int i = 0; i < K; i++) { A.insert(A.begin(), A[A.size()-1]); A.erase(A.begin()+A.size()-1); } return A; }