레이블이 정리인 게시물을 표시합니다. 모든 게시물 표시
레이블이 정리인 게시물을 표시합니다. 모든 게시물 표시

2013년 7월 28일 일요일

해킹의 개요


일년 전 제가 해킹에 대해 공부를 막 시작할때 즈음 만들었던 ppt 자료입니다.

아는게 거의 없었을때 인터넷에서 아무거나 막 찾아서 만들어서

개요랄것도 없는 허접한 자료이지만...

이제 해킹에 관심을 갖고 계신분들은 한번쯤 해킹에 대해 맛볼수 있는 자료일것 같아 공유합니다

상당히 오래전에 만든 ppt고, 출처에 대한 개념이 없었던 때라 몇몇 사진들은

인터넷에서 퍼온 자료인데, 어디서 가져왔는지 기억이 잘 안나네요..

출처는 여기에 나와있는 사이트 중 하나인거 같은데

문제가 된다면 알려주세요 :)



2012년 9월 3일 월요일

윈도우즈 시스템 프로그래밍 [8] - 프로세스간 통신 (IPC) 2.




윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



7장.  프로세스간 통신 (IPC) 1



I. 프로세스간 통신(IPC)의 의미



1. 프로세스의 커널 오브젝트 핸들 테이블

- 마이크로소프트에서 Windows 운영체제 소스코드를 공개하지 않아 핸들 테이블이 어떻게 관리되는지
   알 방법이 없음
- 리소스 생성 과정에서 커널 오브젝트가 생성되면, 해당 오브젝트의 핸들이 반환

① 핸들과 커널 오브젝트의 리뷰 (Review)


=> 핸들 256을 통해 0x2400번지에 할당 되어 있는 메일 슬롯에 접근 가능
      BUT 핸들 256이 0x2400번지의 커널 오브젝트를 의미한다는 정보가 없음
      => 핸들 테이블 개념을 도입


② 핸들 테이블의 도입


- 핸들 테이블은 핸들 정보를 저장하고 있는 테이블로서 프로세스 별로 독립적


2. 핸들의 상속

- CreateProcess 함수 호출 시 다섯번째 인자가 무엇이냐에 따라 부모 프로세스의 핸들 테이블이
   자식 프로세스에게 상속될 수 있음

① 핸들의 상속에 대한 이해

- 자식 프로세스는 부모 프로세스의 핸들 테이블 정보를 상속 받을 수 있음
   but 모든 핸들 정보를 상속 받진 않음
- 핸들 테이블에는 해당 핸들의 상속 여부 컬럼(column)이 존재
- 상속시, 상속 여부에 대한 정보도 변경 없이 그대로 상속됨
   => 자식 프로세스에 상속된 핸들은 또 다른 자식 프로세스 만들때도 상속됨
- 상속되는 핸들을 결정 하는건 프로그래머 몫


② 핸들의 상속을 위한 전달 인자

BOOL CreateProcess (
   LPCTSTR lpApplicationName,
   LPTSTR lpCommandLine,
   ...
   BOOL bInheritHandles // 핸들 상속 인자
   ...
);

bInheritHandles  -> TRUE 전달할 경우 부모 프로세스의 핸들 테이블은 상속됨
  -> BUT 상속 여부가 Y 로 설정된 핸들에 한해서만 상속이 이루어짐


③ 핸들의 상속과 커널 오브젝트의 Usage Count (UC)

- 프로세스가 핸들을 얻게 되었다는 의미 : 핸들 테이블에 대한 정보가 갱신됨

ex) CreateMailslot 호출
      ⑴ 메일 슬롯 리소스 생성
      ⑵ 커널 오브젝트 생성
      ⑶ 핸들 정보가 핸들 테이블에 갱신  // 이때부터 프로세스가 핸들 정보를 얻음
      ⑷ CreateMailslot 함수를 빠져 나오면서 핸들값 반환

- 부모 프로세스 핸들 테이블에 있는 커널 오브젝트들 UC가 1
- 자식 프로세스 생성 후 상속여부가 Y 였던 커널 오브젝트는 UC가 1 증가 => UC=2가 됨


④ 상속이 되기 위한 핸들의 조건

- 핸들의 상속 여부는 리소스 생성되는 순간 결정 (핸들 테이블의 Y or N)

- LPSECURITY_ATTRIBUTES 구조체 = SECURITY_ATTRIBUTES의 포인터로 정의
- NULL 이 전달되면 상속이 되지 않음
   BUT 구조체 변수를 적절히 초기화해 주소값 전달하면 상속 가능

typedef struct _SECURITY_ATTRIBUTES {
   DWORD nLength;   // 구조체 변수 크기
   LPVOID lpSecurityDescriptor;   // 상속과 관계 없음
   BOOL bInheritHandle;   // 상속 여부 결정   TRUE : Y,  FALSE : N
}

ex)

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

HANDLE hMailSlot = CreateMailslot(   ...   , &sa);
CreateProcess(   ...   , &sa,   ...   );




II. Pseudo (가짜) 핸들과 핸들의 중복 (Duplicate)


- 프로세스의 핸들은 Pseudo (가짜) 핸들

1. 프로세스의 커널 오브젝트 핸들 테이블







2012년 9월 1일 토요일

해킹 공부 자료


공부하시면 좋을거 같은 자료들을 정리해 보았습니다.

난이도는 제 마음대로 나눈거라 참고만 하시기 바랍니다.

좋은 자료 있으면 계속 업데이트 하겠습니다.

처음엔 리버싱 혹은 웹부터 공부하시는 걸 권합니다.


해킹 공부에 정해진 순서는 없습니다.

이것저것 해보시고, 가장 재밋었던 부분을 계속해서 파고 들어가시면 됩니다.

찾고, 읽고, 해보고를 반복하시면 뭘 해야하는지를 자연스럽게 아실 수 있을겁니다.



 - update : 2013.04.12 : web, forensic, system 등 추가.

     ps. 쓰다가 지워져서 설명 한줄씩 :-(

 - update : 2013.07.29 : python, network 등 추가



[Reversing]


리버싱 소개 글 : http://carpedm20.blogspot.kr/2012/08/3.html


============[하]============

1. www.reversecore.com

레지스터, PE 구조, 루트킷, dll injection 등

리버싱의 기초부터 실전까지 다루고 있는 블로그 입니다.

블로그 글 처음부터 쭉 보시면 도움이 많이 될거 같습니다.

참고로, 리버싱을 배우시면 루트킷, 키로거 등의

악성코드를 분석하시고 만드실 수 있습니다..


2. http://blog.naver.com/PostView.nhn?blogId=sol9501&logNo=70108175475&categoryNo=93&parentCategoryNo=0&viewDate=&currentPage=5&postListTopCurrentPage=1&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=5

PE 구조, lena's reversing 강좌 등

reversecore와 함께 보시면 좋을 자료들이 많습니다.

이 블로그엔 링크가 자주 나오는데 그거까지 다 보시면

진짜 도움 많이 됩니다.


3. http://zesrever.tistory.com/55

PE 구조 등

위 블로그들 볼때 같이 보시면 도움이 될거 같습니다.


4. http://tuts4you.com/download.php?view.2876

리버싱을 실습해 볼 수 있는 크랙미 자료와 강좌입니다.

기초부터 시작하며 강좌도 정말 좋습니다.


5. http://codeengn.com/

크랙미를 제공하는 한국 사이트입니다.


6. http://simples.kr/

크랙미를 제공하는 한국 사이트입니다.



============[중]============

1. http://sinun.tistory.com/95

악성코드 분석자료가 많은 블로그 입니다.


2. http://fumalwareanalysis.blogspot.kr/p/malware-analysis-tutorials-reverse.html?m=1

악성코드 분석 방법에 대한 튜토리얼이 있는 블로그 입니다.

진짜 교수님 강의급 설명들만 있으며, 나중에 여기 글들

같이 분석해 보고 실습도 해보면 좋겠습니다.

3. http://carpedm20.blogspot.kr/2012/08/bundestrojaner.html


악성코드 Bundestrojaner 를 분석한 글 입니다.

Bundestrojaner는 독일 정부가 감시 목적으로 개발한 악성코드라고 알려져 있습니다.

ollydbg 사용이 익숙해 지신 분들은 한번쯤 분석해 보는것도 좋을 듯 합니다.



4. http://carpedm20.blogspot.kr/2012/08/blog-post_7630.html

스타크래프트 시디키 알고리즘을 분석 한 글입니다.

크랙미 푸는게 질릴때 쯤이면 이렇게 다양한 시도를 해 보는것도

좋은 경험이 될 것 같습니다.


============[상]============

1. http://espionageware.blogspot.kr/

악성코드 분석 자료가 많은 블로그이며 영어입니다.



[System]


시스탬 해킹 소개 글 : http://carpedm20.blogspot.kr/2012/08/1.html


============[하]============

0. http://carpedm20.blogspot.kr/2013/07/blog-post_28.html

백트랙의 기본적인 활용법과 metasploit 명령어 정보를 정리한 ppt 자료


1. http://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/00.html

상당히 어려운 BOF 기법을 기초부터 시작해서

차근차근 알려주는 강좌입니다.

BOF에 관심이 없으시더라도 꼭 한번 읽어보시기 바랍니다.


2. http://www.securitytube.net/video/1175

시스템 해킹을 실습해 볼 수 있게 해주는 Metasploit 강좌입니다.

참고로 Backtrack이랑 Metasploit은 동영상 강좌로

배우시는게 제일 빠릅니다.

유투브에 검색하시면 정말 많은 강좌들이 있으니 참고하시기 바랍니다.


3. http://www.offensive-security.com/metasploit-unleashed/Main_Page

Metasploit을 만든 회사에서 지원하는 튜토리얼입니다.

튜토리얼 중 msfconsole 부분 번역 :
http://carpedm20.blogspot.kr/2012/08/metasploit-unleashed-msfconsole.html
http://carpedm20.blogspot.kr/2012/08/metasploit-unleashed-msfconsole-2.html
http://carpedm20.blogspot.kr/2012/08/metasploit-unleashed-msfconsole-3.html


4. http://www.hackingdna.com/

Backtrack 에서 사용할 수 있는 툴들의 사용법이 상당히 많은 블로그 입니다.

스캔, 스니핑, 크랙, 파일 받기, 보내기, 스샷 찍기, 웹캠 실행 등..

여러분들의 환상은 Backtrack을 통해 충분히 채우실 수 있을겁니다.

Backtrack을 vmware에 설치하셔서 가상 환경에서만

실습하시기 바랍니다. (해킹은 불법입니다.)


5. http://www.hackingarticles.in/best-of-metasploit-meterpreter-script-meterpreter-cheat-sheet/

meterpreter 에서 자주 사용하는 명령어 입니다.

meterpreter 는 메타스플로잇에서 제공하는 공격 쉘로,

exploit이 성공한 후 타겟과 통신할 때 사용하됩니다.


6. http://youtu.be/YFoWDETyrYghttp://youtu.be/ljnzQoE0KFc

메타스플로잇을 이용해서 윈도우7 해킹 시연 영상입니다.

자세한 명령어의 사용은 나와 있지 않지만, 백트랙과 메타스플로잇으로

해킹을 한 후 어떤 것들을 할 수 있는지 대략적으로 감을 잡으실 수 있습니다.

다시 한번 강조하지만, 해킹은 불법이며,

모의 해킹을 위해서만 해킹을 시연하시기 바랍니다.


7. http://blog.naver.com/PostView.nhn?blogId=ka0r1&logNo=90165963416&redirect=Dlog&widgetTypeCall=true

쉘 코드 작성 강좌입니다.

상당히 긴 글이지만, 그만큼 자세하게 쉘 코드를 작성하는 방법을 설명한 글입니다.


============[중]============


1. http://www.hackerschool.org/HS_Boards/view.php?id=Lib_system&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=hit&desc=desc&no=100

BOF의 기초를 알려주는 강좌입니다.

hackerschool BOF 강좌 보시고나서 보시면 이해도 잘되고

BOF에 대해 정말 많은걸 얻으실 수 있을겁니다.


2. http://devanix.tistory.com/129

BOF 원정대라고, BOF를 실습해 볼 수 있는 워게임이 있는데

그 워게임에 대한 강좌입니다.

BOF 이론 공부부 하시고나서 꼭 한번 실습해 보시기 바랍니다.


3. http://s3ize.blogspot.kr/2012/08/load-of-bof-level1.html

또 다른 BOF 원정대 풀이가 있는 블로그 입니다.

버퍼 오버플로우는 한두번 봐서는 이해가 잘 안되기 때문에

여러군데의 풀이를 보시면서 이해를 하시기 바랍니다.


4. http://5a5in.com/wordpress/?p=1107

BOF 원정대 풀이가 있는 다른 블로그 입니다.


5. http://geundi.tistory.com/118

버퍼 오버플로우에 대한 개념을 이해하기 쉽게 설명해 놓은 글 입니다.

스택에 대해 아주 자세히 설명이 되어 있고, 그림도 많기 때문에

이해하기 쉬울거라 생각됩니다.


6. http://www.hackerschool.org/HS_Boards/data/Lib_system/omega1.txt
http://www.hackerschool.org/HS_Boards/data/Lib_system/omega2.txt

스택 오버플로우 할 때 마다 복잡한 계산을 덜 수 있는

'오메가 프로젝트' 번역 문서입니다.



흔하지 않은 윈도우 공격 코드 작성 튜토리얼 번역글 입니다.

원본 글은 https://www.corelan.be/ 이 곳에서 작성되었고,

exploit-writing-tutorial-part-1-stack-based-overflows 가 원본 글 입니다.

윈도우에서 공격이 왜 가능하고, 어디에서 공격을 시도해야 하며

어떻게 공격 코드를 짜는지 까지 설명해 놓은 문서입니다.

메타스플로잇에서 사용되는 exploit 들이 어떻게 만들어 지는지

대략적으로 감을 잡으실 수 있을거라 생각됩니다.

exploit에 관심이 있으신 분은 꼭 한번 읽어보시기 바랍니다.



8. http://cdpython.tistory.com/28

위에 소개한 exploit-writing-tutorial-part-1-stack-based-overflows 의 다른 번역글입니다.


9. http://www.punter-infosec.com/exploit-writing-tutorials-for-pentesters/

exploit-writing-tutorial-part-1-stack-based-overflows 뿐만 아니라

공격 코드를 작성하는 방법을 설명한 튜토리얼을 모아둔 글 입니다.


10. http://hyunmini.tistory.com/13

작성된 공격 코드를 어떻게 메타스플로잇에서 사용할 수 있는지를

설명한 글 입니다. 위의 튜토리얼에서 작성하신 코드들을

메타스플로잇을 통해 쉘을 얻을 수 있는 코드로 바꿀 수 있을 것 같습니다.


11. Win32 Attack Local Shellcode 작성방법 [달고나]  Win32 Attack 2. Local Buffer Overflow

윈도우 기반 쉘코드 작성 튜토리얼 문서입니다.


12 http://exploit-exercises.com/

BOF 원정대와는 다른 시스템 해킹 워게임 사이트 입니다.

해외 사이트이며, 난이도 별로 vmware 이미지를 제공합니다.



[Network]


네트워크 해킹 소개글 : http://carpedm20.blogspot.kr/2012/08/2_17.html

무선 랜 해킹 소개글 : http://carpedm20.blogspot.kr/2012/08/4.html


============[하]============

1.http://noon.tistory.com/525

무선랜 해킹에 대한 강좌입니다.

참고로 이런 글과 동영상 강좌는 (영어로) 구글링 해보시면 많이 찾으실 수 있습니다.


2. http://blog.naver.com/PostView.nhn?blogId=pureb612b&logNo=10111312995

강좌는 아닌데, vmware 쓰실때 bridge 네트워크랑

NAT 네트워크의 차이를 이해하실 때 도움이 많이 되는 글입니다.


3. http://lifehacker.com/5305094/how-to-crack-a-wi+fi-networks-wep-password-with-backtrack

백트랙 무선랜 크랙


4. http://www.hackingdna.com/2012/05/wep-cracking-on-backtrack-5.html

백트랙  wep 무선랜 크랙


5. http://www.youtube.com/watch?v=LmeS4jzXi-o

백트랙 wpa wpa2 무선랜 크랙 영상


6.http://www.youtube.com/watch?v=sqnGoKCNbRU

백트랙 wep 무선랜 크랙 영상


ps. 무선랜 크랙은 백트랙의 air 시리즈와 youtube 동영상으로 충분함.



============[중]============


1. https://www.evernote.com/shard/s157/sh/751d6e1e-0b7d-4338-8869-490cc06adb95/02731c8ffa6fa837314d981477bd009d

네트워크 스캔 nmap, zenmap 명령어 사용법

nmap으로도 충분하다고 생각되지만, 어쨋든 공격하고자 하는 타겟의

열린 포트, 닫힌 포트, 운영체제, ip 라우팅 경로 등 다양한 정보를 얻으실 수 있습니다.

원본 글이 삭제되었는데, 문제가 된다면 삭제하겠습니다.


2. http://carpedm20.blogspot.kr/2013/07/loco.html

카카오톡 LOCO 프로토콜 분석 발표자료

네트워크 지식 외에 약간의 crypto, reversing, coding 지식이 필요합니다.


3. http://www.bpak.org/blog/2012/12/kakaotalk-loco-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%B6%84%EC%84%9D-1/

위의 ppt를 만들면서 많은 도움을 얻었던 블로그 입니다.

프로토콜 분석을 위한 핵심 정보들을 자세히 설명해 주셨으며, 여기 글들만 충분히 이해하신다면

LOCO 프로토콜과 카카오톡 봇을 구현해 보실 수 있을겁니다 :)


4. http://carpedm20.blogspot.kr/2013/05/python-facebook-bot.html

페이스북 봇을 구현하는 방법을 설명한 글입니다.

현재 위의 방법을 사용해 학교 포탈 공지를 제공하는 페이스북 봇을 구현했으며,

많은 분들이 사용중 입니다 :)

참고 : https://www.facebook.com/hexa.portal



[Web]


============[하]============


1. http://webhacking.kr/

가장 유명한 워게임. 난이도가 고루 분포되어 있습니다.

여기 문제의 대부분을 푸셨다면, 더 이상 이런 글들을 보지 않으셔도 될겁니다.


2. http://suninatas.com/

webhacking.kr 보다는 쉽다고 평가되는 워게임 사이트 입니다.


3. http://www.hackthissite.org/

해외에서 유명한 워게임

난이도가 쉬운편이며, 해외에서 많이 유명하기 때문에 그만큼 풀이도 많이 있습니다.


4. http://www.hacker.org/

독특한 워게임. 위의 워게임들과는 스타일이 조금 다릅니다.


5. http://tools.web-max.ca/encode_decode.php

워게임 푸실때 자주 이용되는 사이트.

url, base64, base85 등 인코딩, 디코딩 사이트입니다.


6. http://tools.web-max.ca/encode_decode.php

웹 문제 풀 때 이외에도 crypto 문제가 나올때 자주 이용하는 사이트.



============[중]============


1. http://totoriver.egloos.com/3403564

웹 해킹 관련 글 많은 블로그입니다.

상당히 좋은 정보들을 많이 공유하시고, webhacking.kr 도메인 소유자인듯 보입니다.


2. https://lael.be/84

웹 해킹에서 가장 많이 사용되는 sql 인젝션을 설명한 글 입니다.

공격 쿼리가 어떻게, 왜 작성되는지에 대한 정보를 얻으실 수 있을겁니다.


3. lael.be/attachment/1109936462.pdf

기초적인 db의 구조에 대한 설명을 시작으로

인젝션 쿼리를 어떻게 만들 수 있는지에 대한 문서입니다.

sql 인젝션에 대해 잘 모르시는 분들은 이 문서를 읽는 것부터 시작하면 좋을 것 같습니다.


4. Blind Sql Injection – MySQL 5.0

sql 인젝션 중 하나인 블라인드 인젝션을 설명한 문서입니다.


5. http://k1rha.tistory.com/entry/Sleep-으로-블라인드-인젝션-걸기-Sleep-for-Blind-Injection

블라인드 인젝션시 주로 활용되는 sleep 함수의 사용법을 설명한 글 입니다.

sleep 외에도 공격 쿼리가 제대로 작동하는지 확인하는 방법은 다양하므로

검색을 통해 찾으실 수 있을겁니다.


6. http://coffeenix.net/data_repository/pdf/googledork.pdf

구글 해킹에 대해 설명한 문서입니다.

검색 엔진인 구글을 통해 어떻게 해킹을 할 수 있는지 설명한 문서입니다.

주로 웹해킹의 타겟을 찾을 때 사용될 수 있으며, 구글 검색 실력도 향상될 수 있습니다 :)




[Forensics]




포렌식에는 그다지 관심이 없지만, ctf write up을 찾을때

몇번 들렸던 블로그 입니다.

흔하지 않은 국내 포렌식 관련 블로그이며, 상당히 수준있는 글들이 많이 올라오니

포렌식에 관심이 있으시다면 꼭 한번 들르시길 바랍니다.




[CTF]




전세계에서 진행되는 ctf 의 결과들을 종합해서 팀 랭킹을 알 수 있는 사이트 입니다.

현재 KAIST의 곤이 10위네요 :)

ctf 마다 weight를 다르게 측정하는것 같습니다.

또한 ctf 스케쥴을 확인 할 수 있고, 지나간 ctf 의  write-up을 쉽게 찾으실 수 있습니다.

write-up 을 보는 것도 ctf 성적 뿐만 아니라  해킹 공부에도 도움이 되니

자주 들러서 읽어보시는 것도 좋을 것 같습니다.



전세계의 워게임 사이트들을 토대로 세계 랭킹을 알 수 있음

국내에 이름이 잘 알려진 해커들도 랭킹에 있음

wechall 자체에서도 문제를 제공함



ctf 켈린더 및 지난 ctf 자료 ( http://captf.com/ )





[Universal]

0. http://carpedm20.blogspot.kr/2013/07/blog-post.html


일년전 해킹공부를 시작할 때 만들었던 해킹의 개요 ppt

정보는 부족하나 해킹으로 어떤걸 할 수 있는지에 대한 정보를 얻을 수 있습니다.



1. http://www.hackerschool.org/

국내 해킹 포럼 사이트며, 도서관에는 정말 좋은 정보가 많이 있습니다.


2. http://resources.infosecinstitute.com/

해외 해킹 포럼 사이트입니다.

정말 좋은 자료가 많습니다.

한번씩 흥미로운 글들도 올라옵니다.


3. http://www.darknet.org.uk/

해외 해킹 포럼 사이트입니다.


4. http://www.ehacking.net/

해외 해킹 포럼 사이트입니다.


5. https://community.rapid7.com/welcome

해외 해킹 포럼 사이트입니다.


6. http://www.phrack.org/issues.html

해외의 유명 보안 잡지 사이트입니다.

자랑스런 한국인의 이름도 있습니다.


7. http://www.exploit-db.com/

취약점 데이터를 제공해 주는 사이트입니다.

참고로, BOF가 정말 많이 보이실겁니다.



8. http://securityproof.org/ko_main.html

국내 해킹 포럼입니다.



9. http://www.wowhacker.com/

국내 해킹 포럼입니다.

요즘은 활동을 잘 안하는거 같은데, 자료들은 정말 좋습니다.


10. http://www.securityplus.or.kr/xe/

국내 해킹 포럼이며, 매일 보안 뉴스를 업데이트 해 줍니다.


11. https://www.defcon.org/

세계 최대 해킹 대회를 개최하며, 컨퍼런스를 여는 데프콘의 사이트 입니다.

과거 컨퍼런스 자료들을 보실 수 있습니다.


12. http://hummingbird.tistory.com/

보안 관련 글이 꾸준히 올라오는 블로그 입니다.


13. http://openmalware.org/

악성코드 파일과 분석 자료를 공유하는 포럼입니다.

얼마전에 불법이라는 이유로 사이트 사용이 불가능해졌는데

조만간 다시 이용이 가능해 질 것 같습니다.


14. http://www.overthewire.org/wargames/

리버싱, 시스템, 암호학 등 다양한 워게임 제공

난이도 상



[Python]


0. http://stackoverflow.com/questions/101268/hidden-features-of-python

파이썬홀릭님들은 꼭 한번 보시고 꼭 익히셔야할 파이썬 파워코드들!!!


1. http://carpedm20.blogspot.kr/2013/04/python-email.html

활용 : 해킹 후 지속적으로 파일 전송


2. http://carpedm20.blogspot.kr/2013/04/python-irc.html

활용 : 악성코드 만들 때 irc 서버로 통신


3. http://www.ibluemojo.com/school/python_essential.html

파이썬 문법 요약 정리


4. http://www.pythonchallenge.com/

파이썬 워게임(?) 사이트


5. http://coreapython.hosting.paran.com/howto/tut/index.html

파이썬 자습서


6.  http://www.ibluemojo.com/school/python_essential.html

요약정리 강추. 파이썬을 배우고자 하시는 분들은 이것만 정독하셔도 충분하실 것 같습니다 :)


7. http://docs.python.org/2/library/

파이썬 기본 라이브러리 설명


8.  http://www.pythonforbeginners.com/cheatsheet/python-mechanize-cheat-sheet/

브라우저 모듈 mechanize 튜토리얼 (웹 파징을 하신다면 필수 모듈)


9. http://www.pythonforbeginners.com/

파이썬 튜토리얼 다수 보유


10. http://code.activestate.com/recipes/langs/python/?query_start=1

짧은 예제 천국


11. http://sebsauvage.net/python/snyppets/

고퀄 짧은 예제 (snippet)


12. http://twitter.com/pythonbeginners

파이썬 유용한 정보 알려주는 트위터 계정


13. http://pythonweekly.com

매주 파이썬 새로운 정보 제공, 메일 받을수도 있음


14. https://twitter.com/PythonWeekly

파이썬 위클리 트위터 계정


15. https://www.facebook.com/groups/pythonkorea/

파이썬 코리아 페이스북 그룹


16. http://carpedm20.blogspot.kr/2013/07/python-web-framework-flask.html

파이썬 웹 프레임워크 Flask 예제 (개인 블로그 소스)


2012년 8월 29일 수요일

윈도우즈 시스템 프로그래밍 [7] - 프로세스간 통신 (IPC)




윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



7장.  프로세스간 통신 (IPC) 1



I. 프로세스간 통신(IPC)의 의미



- IPC = Inter-Process Communication ( 프로세스 사이의 통신 )
- 통신 : 기본적으로 데이터를 주고 받는 행위
- 대부분 하나의 프로그램 = 하나의 프로세스 but  여러개의 프로세스를 가진 프로그램도 종종 있음



1. 프로세스 사이에서 통신이 이뤄지기 위한 조건


- 서로 통신하고자 하는 프로세스가 만날 수 있는 여건 (공유하는 메모리 영역이 존재)이 되어야 함
- 여건이 허락되지 않으면 전화 or 메신저 같은 보조 수단이 필요


2. 프로세스들이 서로 만날 수 없는 이유


- 프로세스는 서로 데이터를 주고 받을 만한 접선 장소가 없기 때문에 데이터 주고받는 것은 불가능
- 프로세스는 자신에게 할당된 메모리 공간 이외의 접근은 불가능


3. 프로세스들이 만나지 못하게 디자인한 이유 


- 안정성을 높이기 위해





II. 메일 슬롯 방식의 IPC




1. 메일 슬롯 (Mail Slot)의 원리


- 파이프와 더불어 대표적인 IPC 기법
- 메일 슬롯 : 편지를 넣을 가느다란 우체통의 입구
- 기본 원리 : 데이터를 주고받기 위해 프로세스가 우체통을 마련


2. 메일 슬롯 (Mail Slot) 구성을 위해 필요한 요소


 ① Receiver가 준비해야할 것

HANDLE CreateMailslot (
   LPCTSTR lpName,
   DWORD nMAXMessageSize,
   DWORD lReadTimeout,
   LPSECUritY_ATTRIBUTES lpSecurityAttributes
);

1) lpName : 생성하는 메일 슬롯의 이름
   - 주소의 기본 형식 : \\computer name\mailslot\[path] name

2) nMaxMessageSize : 메일 슬롯의 버퍼 크기를 지정
   - 0을 전달할 경우 시스템이 허용하는 최대 크기로 지정

3) lReadTimeout : 최대 블로킹 시간을 ms 단위로 전달
   - 메일 슬롯은 전소오딘 데이터를 읽기위해 파일 입/출력 함수 ReadFile 함수를 이용
   - 메일 슬롯이 비어 있다면 데이터가 채워질 때 까지 Blocking 상태에 놓임 
   - 0을 전달하면 데이터가 있든 없든 블로킹 상태를 빠져나와 다음 단계를 실행
   - MAILSLOT_WAIT_FOREVER을 인자로 전달하면 데이터가 존재할 때 까지 블로킹 상태에 놓임

4) lpSecurrityAttributes : 핸들의 상속 여부를 지정

5) 함수의 변환 타입 : HANDLE
   => 메일 슬롯은 커널에 의해 관리되는 리소스 이므로 커널 오브젝트가 생성되며, 그 핸들이 반환됨


② Sender가 준비해야 할 것

- 메일 슬롯 이름을 알아야 함 (&주소 ( 디렉토리))

ex)

   HANDLE hMailSlot;
   hMailSlot=CreateFile("\\\\.\\mailslot\\ ", ...);   // 파일을 생성하거나 개방할때 사용
   CHAR message[50];
   WriteFile(hMailSlot, message, ...);

- CreateFile, WriteFile : Windows에서 제공하는 파일 관련 시스템 함수 ( <-> ANSI 표준함수)
- CreateFile을 통해 메일 슬롯으로 보내기 위한 통로(리소스)를 형성
   => 데이터 전송을위한 Data Stream을 형성
- 메일 슬롯은 파일이 아니지만 파일 입/출력 함수를 사용
   -> Windows 파일 시스템을 기반으로 구현되어 있기 때문

- 주소 골격 : \\computername\mailslot\[path] name
- 주소에서 'mailslot' 부분은 바뀌지 않음
- computername에 '.'의 의미 : 로컬 컴퓨터






- Sender 프로세스는 우체통(메일 슬롯)의 주소를 알고 있어야 데이터 전송이 가능
- 메일 슬롯 = 메모리 공유 역할
- 데이터 전송이 양방향이 아닌 단방향(우체통)
- 여러개의 리시버가 같은 주소를 가질 수 있음
   => 센더가 그 주소로 전송하면 모든 메일 슬롯에 데이터 전송이 가능 (브로드 케스팅)





- CreateFile : 파일 만들거나 오픈
- WriteFile : 파일에 데이터 작성

- IPC 메일 슬롯을 이용하지 않고 파일만으로 데이터를 주고받을 수 있음
   ex)
       프로세스 A가 파일 a.txt를 만들고 프로세스 B가 a.txt를 읽음
        => BUT 안정성에 문제가 있음 ->  메일 슬롯을 이용

ex) Receiver.cpp

#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox");

int _tmain(int argc, LPTSTR argv[]) {
   HANDLE hMailSlot;
   TCHAR messageBox[50];
   DWORD bytesRead;

   hMailSlot = CreateMailSlot (
      SLOT_NAME,
      0,
      MAILSLOT_WAIT_FOREVER,
      NULL
   );

   ReadFile(hMailSlot, messageBox, sizeof(TCHAR)*50, &bytesRead, NULL);

   closeHandle(hMailSlot);   // UC 1줄여 커널 오브젝트의 소멸을 도움

ex) Sender.cpp

#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox");

int _tmain(int argc, LPTSRT argv[]) {
   HANDLE hMailSlot;
   TCHAR message[50];
   DWORD bytesWritten;

   hMailSlot=CreateFile (  //  Receiver과 연결을 만들기 위해
      SLOT_NAME,
      GENERIC_WRITE,  // 여기서부터
      FILE_SHARE_READ,
      NULL,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      NULL   // 여기까지 거의 고정
   );

   _fgetts(message, sizeof(messsage)/sizeof(TCHAR), stdin);
   WriteFile(hMail, message, _tcslen(message)*sizeof(TCHAR), &bytesWritten, NULL);

   CloseHandle(hMailSlot);

- 메일 슬롯 주소에서 '.'는 컴퓨터 자신, '*'는 모든 컴퓨터
  => 브로드 케스팅 이용 가능




III. Signaled vs Non-Signaled => 커널 오브젝트의 상태




1. 상태에 대한 이해


- 상태(state)라는 용어를 사용하는 이유는 변하기 때문
- signaled (신호를 받는 상태)와 Non-Signaled (신호를 받지 않는 상태)
- 커널 오브젝트를 구성하는 멤버 변수 중 하나가 상태 정보를 저장함
   => TRUE : Signaled   FALSE : Non-Signaled


2. 프로세스 커널 오브젝트 상태 (state)에 대한 이해


- 프로세스가 생성될 때 프로세스 커널 오브젝트가 생성됨
   => 처음 상태 : Non-signaled
- 프로세스가 종료되면 Signaled 상태로 변경됨
- Signaled 된 커널 오브젝트는 Non-Signaled 상태로 변경되지 않음
   => 종료된 프로세스를 다시 재개하지 못하기 때문 ( 새로운 프로세스를 다시 실행해야 함)


3. 커널 오브젝트의 두가지 상태를 확인하는 용도의 함수


- 커널 오브젝트의 상태를 확인하는 대표적인 함수

ex) DWORD WaitForSingleObject (
         HANDLE hHandle,   // 확인하려는 커널 오브젝트의 핸들
         DWORD dwMilliseconds   // 커널 오브젝트가 Signaled 될 때 까지 기다릴 수 있는 최대 시간
       );

- dwMilliseconds에 IFINITE 인자 전달시 Signaled 될 때까지 기다림

- WaitForSingleObject 반환값
   1) WAIT_OBJECT_0 : 커널 오브젝트가 Signaled 되었을 때 반환값
   2) WAIT_TIMEOUT : Signaled 되지 않고 dwMillisecons가 다 되었을 때
   3) WAIT_ABANDONED : 오류 발생시



4.  커널 오브젝트의 상태 확인이 필요한 상황

      => 하나의 프로그램이 여러개의 프로세스로 구성되는 경우 (CPU 코어 수의 증가에 따라)


- 이런 상황에서 WaitForSingleObject 사용







참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저 





2012년 8월 27일 월요일

윈도우즈 시스템 프로그래밍 [6] - 커널 오브젝트와 오브젝트 핸들




윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



6장. 커널 오브젝트와 오브젝트 핸들



I. 커널 오브젝트에 대한 이해


- 커널 : 컴퓨터를 운영하는데 있어서 중심이 되는 운영체제의 핵심 부분
   -> 일반적으로 커널과 운영체제를 같은 의미로 사용

- 커널 오브젝트 : 커널에서 관리하는 중요한 정보들을 담아둔 데이터 블록


1. 커널 오브젝트의 이해


- 프로세스의 생성과 소멸, 상태 벼화, 관리는 모두 운영체제 몫
- 여러개의 프로세스르 관리하면 고정적으로 저장하고 갱신할 정보가 존재
ex) 프로세스 상태 정보 ( Running, Blocked, Ready 상태 ), 우선순위 정보
   => 운영체제 내부에 저장되어야 할 정보, 변경될 때 마다 갱신되어야 함
   -> 프로세스 스케쥴러가 이를 바탕으로 프로세스를 관리

- 프로세스에 관련된 정보를 저장, 참조 및 변경할 수 있는 구조체 존재 
  (편의상 '프로세스 관리 구조체'라 함)

- 프로세스가 생성된 후 정보를 초기화 한 것이 커널 오브젝트


- 프로세스 관리 구조체는 어떻게 구성되어 있는지 알 수 없음 (마이크로소프트가 공개하지 않음)
   => 프로세스의 커널 오브젝트는 프로그래머가 직접 생성하거나 조작하는 것을 막음



2. 그 이외의 커널 오브젝트


- 프로세스 내에 쓰레드를 생성할 때, IPC를 위해 사용하는 파이프나 메일 슬롯을 생성할 때도
   커널 오브젝트를 생성해야 함

- 커널 오브젝트 종류에 따라 다른 구조체를 생성
ex) 파일 커널 오브젝트 -> 파일 속성 정보 (Read모드, Read / Write모드 ... )
       프로세스 커널 오브젝트 -> 프로세스 우선 순위 정보 (스케쥴링을 위해)

=> ∴ Windows 운영체제는 프로세스, 쓰레드와 파일 같은 Resource 들을 원활히 관리하기 위해
          데이터를 저장하는 메모리 블록이 존재 => 커널 오브젝트

- 데이트 블록 : 커널 오브젝트   |   프로세스나 파일 : Resource

- Windows 커널에 의해 관리되는 리소스 수 만큼 커널 오브젝트도 생성됨




II. 오브젝트 핸들(Handle)을 이용한 커널 오브젝트의 조작


- 프로그래머는 직접 커널 오브젝트를 조작할 수 없음
- 리소스의 특성을 변경하기 위해선 (프로세스 우선 순위 변경 같은)
   해당 리소스 커널 오브젝트를 조작해야함
   -> 마이크로소프트에서 제공하는 시스템 함수를 이용 (안정적인 방식)

1. 프로세스 우선순위 (Priority) 변경


ex)

BOOL SetPriorityClass (
   HANDLE hProcess;   // 우선 순위를 변경할 프로세스의 핸들
   DWORD dwPriorityClass;   // 새롭게 적용할 우선 순위
);

- 핸들 (Handle) : 커널 오브젝트에 할당되는 숫자 (정수형)


2. 커널 오브젝트에 할당되는 숫자 = 핸들 (Handle)


- Windows는 커널 오브젝트를 생성할 때 마다 핸들을 하나씩 부여


3. 핸들 정보


- 핸들 정보를 얻는 방법은 커널 오브젝트 종류에 따라서 다양함 ( 프로세스, 파일, 쓰레드 ...)
- GetCurrentProces 함수 -> 현재 실행되고 있는 프로세스의 핸들을 얻을 떄 사용
  => 항상 같은 값을 리턴(-1)
- '-1'은 자기 자신을 의미
- 함수가 호출되어 실행되는 중에 (함수는 여러개의 명령어로 구성) CPU 할당시간을
  다른 프로세스에 넘겨줄 수 있음
  => 우선순위를 넘기는 기준은 CPU 관점에서 명령어 단위가 기준




III. 커널 오브젝트와 핸들의 종속관계



1. 커널 오브젝트의 종속 관계


- 커널 오브젝트는 Windows 운영체제에 종속적

① 커널 오브젝트에 종속적인 것이 아니라, 운영체제에 종속적인 관계로
     커널 오브젝트의 소멸 시점은 운영체제에 의해 결정됨
② 커널 오브젝트는 여러 프로세스에 의해 접근이 가능 (물론 함수 호출을 통한 간접 호출)

2. 핸들의 종속 관계


- 핸들 (핸들 테이블) 은 운영체제에 종속적이지 않고 프로세스에 종속적 
   ex) 프로세스의 우선 순위를 높이기 위해서는 핸들을 이용해 커널 오브젝트에 접근.

- PROCESS_INFORMATION 구조체

typedef struct _PROCESS_INFORMATION {
   HANDLE hProcess;   // 프로세스 핸들
   HANDLE hThread;   // 쓰레드 핸들
   DWORD dwProcessID;   // 프로세스의 ID
   DWORD dwThreadID;   // 쓰레드의 ID
} PROCESS_INFORMATION;


3. 프로세스 핸들과 ID


- 운영체제는 프로세스 생성시 프로세스들을 구분짓기 위해 ID(식별자)를 할당
- 프로세스 핸들 : 프로세스의 커널 오브젝트를 가리키기(구분짓기) 위함
- 프로세스 ID : 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위함
- CreateProcess 함수를 통해 프로세스를 생성하면 쓰레드라는 시스템 리소스도 생성됨




IV. 커널 오브젝트와 Usage Unit



1. CloseHandle 함수에대한 정확한 이해



CreateProcess 함수 호출이 커널 오브젝트의 생성 원인이나 단지 프로세스의 생성을 요청할 뿐
프로세스 생성의 주체는 운영체제이다. (함수가 아님)
- 프로세스 생성시, 그 프로세스르 위한 커널 오브젝트가 생성됨
- but 프로세스가 소멸한다고 해서 커널 오브젝트가 소멸하진 않음
   => 소멸할 수도 있으나 하지 않을 수도 있음

- BOOL CloseHandle (
      Handle hObject   // 핸들을 닫음(반환)  ->  핸들의 소멸, 리소스 해제를 의미하지 않음
   );



2. 커널 오브젝트와 Usage Count


- 자식 프로세스의 종료코드는 자식 프로세스 커널 오브젝트에 저장됨
- if 자식 프로세스가 종료될 때 커널 오브젝트도 소멸되면 종료코드는 사라짐
   =>  ∴ 프로세스가 종료되어도 커널 오브젝트는 동시에 소멸하지 않음

- 해당 커널 오브젝트를 참조하는 대상이 없을 때 소멸하는 것이 이상적
   => windows가 커널 오브젝트를 소멸 시키는 방법

- 프로세스의 생성과 동시에 커널 오브젝트의 Usage Count=1
- 프로세스에 접근 가능한 핸들 수가 늘어날때 마다 Usage Count 증가
- 자식프로세스의 Usage Count=2 (부모 프로세스 참조 + 자기자신 참조)
   => 부모프로세스가 CreateProcess 함수 호출과정에서  PROCESS_INFORMATION
      구조체를 통해 자식 프로세스의 핸들을 얻기 때문


- 핸들값은 커널 오브젝트에 매핑되지 않음 -> 각각의 핸들 테이블에서 핸들 값을 사용
   => ∴ 핸들 값, 핸들 테이블은 프로세스에 종속적

- 자식프로세스가 사라지면 프로세스에 종속적인 핸들 테이블이 사라지나
  부모 프로세스에서 자식 프로세스 커널 오브젝트를 보고 있으므로 (핸들 테이블에서 사용중) 
  커널 오브젝트는 사라지지 않고 단지 Usage Count를 2에서 1로 감소시킴
  => UC(Usage Count)가 존재하는 이유

- 운영체제 영역에서 커널 오브젝트가 있음 = 커널 오브젝트의 소멸은 운영체제게 UC를 통해 정함
- UC가 0이 되면 커널 오브젝트는 소멸 ( but 파일은 물리적으로 남아있음)


Q1. 프로세스 생성시 자기 자신의 커널 오브젝트를 핸들 테이블에서 참조하는가?

- 프로세스 생성시 자기 자신의 커널 오브젝트에 대한 핸들정보는 핸들 테이블에 저장하지 않음
   but GetCurrentProcess는 상수(-1)을 리턴
- 함수들은 -1이 리턴 되면 현재 프로세스를 지칭 한다고 인식함 (windows의 약속)

Q2. 자식프로세스가 종료된 후 부모 프로세스가 자식 프로세스의 커널 오브젝트를 참조한다고 해서
       커널 오브젝트를 남겨둘 이유가 있는가?

- 부모 프로세스는 자식 프로세스가 정상 종료 햇는가가 궁금함
- 자식 프로세스가 소멸되자 마자 자식 프로세스의 커널 오브젝트가 소멸되면
   부모 프로세스는 자식 프로세스의 정상 종료 여부를 알지 못함
   =>  ∴ UC를 통해 운영체제가 커널 오브젝트를 관리!


- STARTUPINFO si = {0, };   // 프로세스 생성시 초기 정보를 전달하는 목적
   si.cb= sizeof(si);

- PROCESS_INFORMATION pi; /// 생성된 프로세스의 정보를 얻기 위한 구조체 (핸들값 얻을 수있음)

- 자식 프로세스가 종료되더라도 부모 프로세스의 참조에 의해 자식 프로세스의 커널 오브젝트는 남음
   -> but 종료코드를 얻고 더이상 커널 오브젝트를 참조할 필요가 없다면 UC를 0으로 만들어 운영체제가 소멸시키도록 해야함
      ( 자원 낭비를 막기위해 )
   => CloseHandle (pi.hProcess);   // 함수를 이용해 UC를 하나 줄여 메모리 낭비 방지





참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저 



2012년 8월 25일 토요일

윈도우즈 시스템 프로그래밍 [5] - 프로세스의 생성과 소멸



윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



5장. 프로세스의 생성과 소멸



I. 프로세스 ( Process ) 의 이해



1. 프로세스란 무엇인가?


- 프로세스 = 실행 중에 있는 프로그램


2. 프로세스를 구성하는 요소


① execution of "C" program

- Data 영역 : 전역 변수, static 변수의 할당을 위한 공간
- Stack 영역 : 지역 변수, 함수 호출시 전달되는 인자 값의 저장을 위한 공간
- Heap 영역 : 동적 할당 (malloc, calloc) 함수를 위한 공간
- Code 영역 : 시행 파일을 구성하는 명령어들이 올라가는 메모리 영역

② register Set

- 프로그램 실행을 위해선 레지스터가 절대적으로 필요
- 레지스터의 상태도 프로세스의 일부로 포함시킬 수 있음
   => 컨텍스트 스위칭(context switching)의 이해에 중요!

 

II. 프로세스의 스케쥴링과 상태 변화


1. 프로세스의 스케쥴링


- 하나의 CPU가 여러개의 프로세스를 번갈아가며 실행
  => 고속으로 실행하므로 사용자는 동시라고 느낌
∴ 여러개의 프로세스가 CPU 할당 시간을 나누기 때문에 동시 실행처럼 보임


2. 스케쥴링의 기본 원리


- 스케쥴링 : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일
- 스케쥴러 : 스케쥴링 알고리즘을 적용해 프로세스를 관리하는 운영체제 요소 ( 모듈)


3. 멀티 프로세스는 CPU를 바쁘게 함


- A프로세스가 I/O에 관련된 일( ex. 네트워크 송수신 )을 할 경우, 운영체제는 스케쥴러를 통해
   다른 프로세스가 실행되도록 스케쥴링 함

- I/O가 프로그램 실행에서 많은 부분을 차지


4. 프로세스의 상태변화



① S(Start)에서 Ready 상태로의 전이
- S는 프로세스가 생성되었음을 의미 => 생성과 동시에 Ready 상태가 됨
- Ready 상태 = CPU에 할당 되기를 기다리는 상태
   -> 멀티 프로세스 운영체제 => 실행 중인 프로세스가 있을것

② Ready 상태에서 Running 상태로의 전이
- 스케쥴러는 Ready 상태의 프로세스 중 하나를 실행할 수 있음

③ Running 상태에서 Ready 상태로 전이
- 프로세스는 생성시 중요도에 따라 우선순위 (Priority) 가 매겨짐
   => 다시 Ready상태가 된 프로세스는 다른 프로세스(우선순위가 높은)가 종료되기를 기다려야 함

④ Running 상태에서 Blocked 상태로 전이
- 실행 중에 있는 프로세스가 멈추는 (Blocked) 상태로 들어가는 것
- 데이터 입/출력에 관련된 일을 하는 경우 발생
   => 입/출력에 시간이 많이 걸림 -> 입/출력 진행 중인 프로세스는 잠시 Blocked 상태로 돌리고
   Ready 상태의 프로세스를 대신 실행시킴

 ⑴ 프로세스 A가 파일을 입/출력 해야하는 상황을 만남
 ⑵ Blocked 상태가 되어 파일 입/출력을 진행
 ⑶ 프로세스 A가 Blocked 되는 동시에 Ready 상태의 프로세스가 Running 됨 

⑤ Blocked 상태에서 Ready 상태로의 전이
- Blocked 상태는 스케쥴러에 의해 선택될 수 없는 상태
   => Ready 상태와의 차이점. Ready 상태에선 스케쥴러에 의해 실행 가능
- 입/출력이 완료된 Blocked 프로세스는 다시 Ready 상태가 되어 스케쥴러의 선택을 기다려야 함.




5. 프로세스의 상태 변화, 시나리오 다시 이해


- Running -> Ready : 해야할 일이 있으나, 어쩔 수 없이 양보해야하는 상황
  ex) 우선순위가 높은 프로세스의 등장

  but 항상 스케쥴러의 관심 대상이 됨

- Running -> Blocked : 해야할 일을 하고, 다른 프로세스에 Running 상태를 양보
  ex) I/O 관련 작업 -> CPU 연산을 필요로 하지 않음 => 다른 프로세스의 CPU 연산을 양보

but 스케쥴러의 관심 대상이 되지 않음 -> Blocked 작업이 끝난 후 Ready로 가서 선택을 기다림





III. 컨텍스트 스위칭 (Context Switching)


- 실행중인 프로세스의 벼녕은 시스템에 많은 부하를 줌
- CPU 내에 레지스터는 현재 실행 중인 프로세스 데이터로 채워짐
   =>  프로세스가 바뀌면 레지스터 값도 백업 후 변경되어야 함.
- Running -> Ready 될 때 레지스터 값은 메모리에 저장해 두어야 함 (Back Up)

- Running 프로세스와 Ready 프로세스가 바뀔 떄 => 컨텍스트 스위칭 발생
  -> 실행되는 프로세스의 변경과정에서의 컨텍스트 스위칭은 시스템에 부담을 줌
  => 레지스터가 많을수록, 프로세스별 관리 데이터가 많을 수록 더 함 -> 멀티 프로세스의 단점.



IV. 프로세스의 생성


1. 프로세스의 생성


방법 1 : 실행 파일을 더블 클릭해 독립적인 프로세스를 생성
방법 2 : 프로그램 실행 중에 또 하나의 프로세스를 생성


2. CreateProcess 함수의 이해


- Windows에서 프로세스 생성을 위해 제공되는 함수
- CreateProcess 함수를 호출하는 프로세스 -> 부모 프로세스 (Parent Process)
- 호출 당하는 프로세스 -> 자식 프로세스 (Child Process)

BOOL CreateProcess (
   LPCTSTR lpApplicationName,   // 
   LPTCSTR lpCommandLine,   // 
   LPSECURITY_ATTRIBUTES lpProcessAttributes,
   LPSECURITY_ATTRIBUTES lpThreadAttributes,
   BOOL bInheritHandles,
   DWORD dwCreationFlags,
   LPVOID lpEnvironment,
   LPCTSTR lpCurrentDirectory,
   LPSTARTUPINFO lpStartupInfo,   // 
   LPPROCESS_INFORMATION lpProcessInformation   // 
)

① lpApplicationName : 생성할 프로세스의 실행파일 이름
- 경로명을 지정할 수 있음
- 경로를 지정하지 않으면 프로그램의 현재 디렉토리에서 찾게 됨

② lpCommandLine : 
- argc, argv와 같이 새로 생성하는 프로세스에 인자를 전달할 때
- lpApplicationName이 NULL일 경우 표준 검색경로에 따라 실행할 파일을 찾음

③ lpStartupInfo :
- STARTUPINFO 구조체 변수들을 초기화 한 후, 이 변수의 포인터를 전달함

④ lpProcessInformation
- 생성하는 프로세스의 정보를 얻기 위해 사용되는 인자
- PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달






참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저