1. 프로그램의 완성과정
    1. 소스코드 작성
      1. 편집기나 visual studio 와 같은 툴을 이용하여 소스코드를 작성한다
    2. 컴파일
      1. 컴파일러가 컴파일을 담당한다. 언어별로 컴파일러가 달라진다. 
      2. 사람이 작성한 소스코드를 기계어 코드로 바꾸어 준다. 
      3. 목적코드(object)가 완성된다. 
      4. 장점
        1. 소스보안 - 소스코드 대신에  obj파일만으로 컴파일가능. 
        2. 분업화
        3. 모듈화, 이식성, 확장성
      5. C컴파일러, 컴파일러 버전에 따라 코드문법이 달라질 수 있다. 표준을 항상이해하고 따라갈 수 있어야 한다. 
    3. 컴파일시에 에러가 없으면 링크단계로 넘어가고, 에러가 발생하면 소스코드를 수정한다. 
    4. 링크
      1. 링커가 담당.
      2. object 파일을 하나로 묶어줌
      3. 실행가능하도록 PE구조 파일을 만들어줌. 
      4. 동적링크 정적링크
  2. Visual Studio 사용법
  3. HELLO World 설명
    1. 헤더파일
      1. #include <stdio.h>                    //! 제일먼저 등장. 헤더에 라이브러리함수들 원형이 선언되어있음. 사용할 함수의 원형이 선언된 헤더파일이 포함되어있어야함. 
    2. 본체 
      1. int main(void){ ... ; return 0;}    //!  반환형 함수이름(수신형) 의형태를 띈다. return 0; 은 운영체제로 리턴. 이 포멧을 그대로 사용하자. 표준에 지정되어있다. 
  4. Printf()함수 , scanf()함수 따라 사용하기 과제


AND

mov eax,dword ptr fs:[18h] //! TEB -> TIB

mov ecx,dword ptr ds:[eax+30h] //! self

movzx eax,dword ptr ds:[ecx+0A4h] //! OSMajorVersino 

shl eax,8

or eax,dword ptr ds:[ecx+0A8h] //! OSMinorVersion




  O/S     VERSION dwMajorVersion dwMinorVersion

          Windows 8                          6.2            6                             2

  Windows 7 6.1 6 1

  Windows Server 2008 R2 6.1 6 1

  Windows Server 2008 6.0 6 0

  Windows Vista 6.0 6 0

  Windows Server 2003 R2 5.2 5 2

  Windows Server 2003 5.2 5 2

  Windows XP  5.1 5 1

  Windows 2000 5.0 5 0

  Windows Me  4.90 4 90

  Windows 98  4.10 4 10



AND

헷갈렸던 부분인데 어디에도 명확하게 얘기해주지를 않네요. 얼마전 정확하게 정의해주는 곳을 찾아서 복사해 왔습니다. 



[ DLL 의 메모리 상주] 


흔히 얘기하기를 "DLL은 메모리에 한 번 올라가면, 이 DLL을 공유하는 프로세스가 모두 종료될 때까지 메모리에 존재한다" 고 한다.

상당히 애매하지 않나? 메모리라니? 가상 메모리? 물리 메모리? 명확하지 않네.

프로세스가 DLL을 로드한다는 것은 프로세스 가상 메모리에 DLL이 맵핑되었음을 의미하는 것이다.

위의 메모리 효율에서도 설명하였지만 이것이 물리 메모리 페이지에 어떠한 형식으로 남아 있는 것인지의 양상은 다르지만,

해당 프로세스가 종료되면 프로세스의 가상 메모리에서 라이브러리 또한 같이 소멸된다.

프로세스의 가상 메모리라는 것은 말 그대로 프로세스 소유의 가상 메모리이다. 즉, 프로세스별 독립적으로 존재하는 영역인 것이다.


다시 얘기해 "DLL은 물리 메모리에 한 번 올라가면, 이 DLL을 공유하는 프로세스가 모두 종료될 때까지 물리 메모리에 존재한다" 라고 해야 한다.


다음과 같은 단계를 거쳐 이해를 해 보자.

1. 프로세스 A가 실행되며 X.dll을 로드한다. 
    따라서 X.dll은 A의 가상 메모리 영역에 맵핑되면서 물리 메모리에 할당된다.

2. 프로세스 B가 실행되며 X.dll을 로드한다.
   이미 1단계에서 X.dll이 물리 메모리에 올라 있으므로 그대로 참조할 수 있도록 프로세스 B의 가상 메모리 영역에 맵핑만 한다.

   이 상황에서 유의할 것이 X.dll 이 할당된 가상 메모리 주소이다. 프로세스 A와 B가 동일한 주소에 할당한다.

 

   이것이 DLL 공유가 가능한 이유이다. 다시 말해서 두 프로세스가 동일한 DLL을 동일한 가상 주소에 맵핑했기 때문에,
   페이지 단위로 공유가 가능하다는 것이다.

3. 프로세스 A가 종료되었다. 그러나 B가 종료되지 않았기 때문에,
    X.dll은 여전히 물리 메모리에 남아있다.

4. 프로세스 B가 종료되었다. 이제 X.dll을 참조하는 프로세스가 하나도 존재하지 않기 때문에 X.dll도 할당된 물리 메모리에서 반환된다.


[ 중복 Loading] 

처음 DLL이 빌드될 때 DLL이 할당되어야 할 가상 메모리 주소가 Linker에 의해 결정된다.

 

만약 X.dll을 0x20000000 번지에 맵핑하기로 한다면, 모든 프로세스는 0x20000000 번지에 X.dll의 주소를 맵핑시킨다.

헌데 아래 상황을 한 번 살펴보자.

1. 프로세스 A가 X.dll을 로드하면서 가상 메모리 주소 0x10000000에 맵핑하였다.

2. 프로세스 B가 Y.dll을 로드하면서 가상 메모리 주소 0x10000000에 맵핑하였다.

3. 프로세스 B가 X.dll을 로드하게 되면, 이미 0x10000000에 Y.dll이 존재하고 있으므로,다른 주소의 메모리 영역에 X.dll을 올리게 된다. 

위와 같은 상황이 발생하면 두 개의 X.dll이 물리 메모리에 올라가게 된다. 즉, DLL도 물리 메모리에 중복적으로 올라갈 수 있음을

기억하자.

'OS > windows 여러가지' 카테고리의 다른 글

LG XTIC USB부팅영역만들기 도구  (0) 2011.08.03
[유틸] ShellcodeExec  (0) 2011.08.01
[유틸] exe to TXT  (0) 2011.08.01
[유틸]bat to exe  (0) 2011.08.01
VMware 아무나 모르는 인터페이스 연결방식의 원리  (0) 2011.06.03
AND