본문 바로가기

Study178

Driver Unload할때~ 드라이버를 unload 하고 재시작시 CreateService에서 정말 아주 가끔씩 ERROR_SERVICE_MARKED_FOR_DELETE 에러를 내뱉으며 드라이버 설치되지 않을 때가 있었다...;; 재현하기 힘든 상태라서 원인을 파악하기엔 어려움이 있었지만...드라이버 언로시에 관련된 함수들을 지우거나 강제로 실패하게 만들어 재현 상태를 가상적으로나마 만들어 봤었다.. 문제는 ControlService()함수가 문제였는데.. 언로드시 함수 호출 루틴은 다음과 같다. OpenSCManager -> OpenServiceA -> ControlService -> DeleteService .... 여기서 ControlService 함수에서 서비스 중지 명령을 날린 후 DeleteService 를 호출하는데 C.. 2011. 9. 28.
mprotect의 사용법!!! 윈도우에서 사용하던 코드를 리눅스에 써야 할 일이 생겼다..근데 이게 뭥미?? memcpy시 바로 뻗어버리는 현상이... 분명 리눅스도 뭔가 메모리 보호속성이 있을거라 생각이 들었다..이래저래 찾아보니.. 메모리에 대한 읽기/쓰기/실행 권한이 있더라..... gdb로 별짓을 다해서 그 명령어를 못찾았는데 ..보는 방법은 아래와 같다.(gdb로 보는 방법도 있을듯 하다;;뭘까?) cat /proc/pid/maps pid 부분에 메모리를 보고자하는 프로세스 id를 넣으면 된다. 위 명령어를 실행하면 아래와 같은 모습이 보인다. 현재 64bit에서 해서 주소가 길다.;;; 암튼 보면 rwx가 보일것다..각 주소대 별로 read, write, execute가 가능한지를 보여준다. 암튼 난 r-xp의 속성이 있는.. 2011. 9. 28.
CPU 레지스터 레지스터는 cpu 내부에 존재하는 작은 고속의 메모리라고 할 수 있다고 한다. 레지스터 종류로는 범용 레지스터, 세그먼트 레지스터, 상태 플래그 레지스터, 명령 포인터 레지스터 등이 있다. 범용 레지스터 EAX (Extended Accumulator Register) -> 곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도 EBX (Extended Base Register) ->ESI나 EDI와 결합하여 인덱스에 사용 ECX (Extended Count Register) -> 반복 명령어 사용시 카운터로 사용, ECX레지스터에 반복할 횟수를 지정해 놓고 반복 작업 수행 EDX (Extended Data Register) -> EAX와 같이 사용되고 부호 확장 명령 등에 쓰임 ESI (.. 2011. 9. 28.
Use run-time library 관해.. 라이브러리르 링크해서 컴파일시 아래와 비슷한 링크에러를 자주 겪게 된다. error LNK2005: __strtol already defined int LIBCMT.lib 이번에도 라이브러리를 빌드해서 배포하였는데 라이브러리르 사용하는 프로젝트에서 빌드시 에러가 발생한다는 보고를 받았다. 확인해보니 use run time library 옵션이 맞지 않아 발생하는 에러들이었다. 우리가 라이브러리를 빌드하여 배포할때는 옵션을 Multithreaded 로 옵션을 설정해서 나갔다.. 하지만 그 라이브러리를 사용하는 프로젝트에서 Debug모드에서는 MT(multithreaded)로 Release모드에서는 MD(multithread DLL)을 사용하고 있었다.. 도대체 어느 옵션에 맞추어 라이브러리를 배포해야 하는.. 2011. 9. 28.