▷▶ CentOS 마스터하기 ◀◁2012. 10.순 서■ 서론1. Cent OS 설치2. 네트워크 설정3. 기본 패키지 설치4. Telnet Daemon 설치5. FTP Daemon 설치6. X Window System 설치7. X Window 한글 설정8. VirtualBox 게스트 확장 설치9. MySql 설정10. Java 설치11. Tomcat 설치12. Apache 설치12-1. zlib 재설치12-2. open_ssl 설치12-3. HTTP Daemon 설치12-4. ssl 설정13. tomcat과 apache 연동14. MySql jdbc 설치 및 dbcp 설정15. 가상호스트 설정■ 맺음말■ 서론정보시스템 이용자의 욕구가 다양화됨에 따라 SW의 규모와 성능이 고도화되었고, 그로인해 HW도 발달해왔다. 예전에는 개인이 접해보기 어려웠던 메인프레임급 HW와 SW를 지금은 개인이 집에서 PC로 간단히 만들 수 있고, 실제로 운영하는 사례도 심심치 않게 있다. 대부분의 사용자들이 서비스 제공자가 제공하는 정보와 서비스를 이용하기만 하던 수준에서 벗어나 본인이 스스로 서비스를 만들고 타인에게 제공하거나 공유하기를 원하게 되었다.이 문서는 이처럼 서버를 만들어 서비스를 제공하고자 하는 사람들이 보다 쉽게 목적을 이루도록 하기 위해 만들었다. 이 문서와 함께 인터넷에 연결된 PC 1대만 있다면 누구나 서버를 만들고 웹, 텔넷, FTP, X-Window, DBMS 등의 서비스를 구축하고 제공할 수 있을 것이다. 그리고 그 방법을 토대로하여 자신이 원하는 다른 서비스를 구축한다면 IT 분야의 광범위한 정보를 조금은 이해하게 되지 않을까 한다.문서는 글과 그림으로 구성된다. 글은 가능한 명령어 위주로 하여 읽는 사람의 혼란을 줄이고자 했다. 명령어를 입력하고 그림의 결과를 본다면 쉽게 이해할 수 있을 것이다. 이 글의 목적은 CentOS를 설치하고 서비스를 구축하는 것이기 때문에 오라클社의 가상화 도구인 버추얼박스 설치에 대해서는 설명하지 않는다. 오라클의 홈페이bles# service iptables restart5. FTP Daemon 설치FTP 또한 대중적인 파일 송수신 서비스이다. FTP도 텔넷과 마찬가지로 서비스를 제공하는 데몬과 서비스를 이용하는 클라이언트 프로그램이 짝을 이뤄 사용된다.# yum -y install ftp# yum -y install vsftpd# sed -i "s/^root/#root/" /etc/vsftpd/ftpusers# sed -i "s/^root/#root/" /etc/vsftpd/user_list# setsebool -P ftp_home_dir=1# setsebool -P allow_ftpd_full_access 1# service vsftpd start(Oracle VM VirtualBox 관리자에서 네트워크 > 포트 포워딩 > 호스트/게스트 IP는 공란, 호스트/게스트 포트를 20 및 21번으로 추가)# sed -i /^COMMIT/i"-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT" /etc/sysconfig/iptables# sed -i /^COMMIT/i"-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT" /etc/sysconfig/iptables# service iptables restart6. X Window System 설치예전에는 원격 서버 전용으로 쓰는 경우 X윈도우는 설치하지 않는 경우가 많았다. 하지만 요즘은 VNC 등을 이용해 원격지에서 X윈도우를 접속하는 사례가 많아져 보안등의 이유가 아니라면 기본적으로 설치하는 추세이다.# yum -y groupinstall "X Window System"# yum -y groupinstall "KDE Desktop"# startx7. X Window 한글 설정한글을 설치하지 않아도 X윈도우나 인터넷을 이용하는데는 문제가 없지만 문서를 작성하거나 한글로 된 자료를 검색할때는 불편이 따른le# source /etc/profile11. Tomcat 설치이제 본격적으로 웹서비스를 설치한다. 톰캣은 단독으로 설치하여 웹서비스가 가능하지만 아파치와 연동하여 동작할때는 웹 어플리케이션 서버(WAS)의 역할을 하게된다.# wget http://mirror.apache-kr.org/tomcat/tomcat-6/v6.0.35/bin/apache-tomcat-6.0.35.tar.gz# tar -zxvf apache-tomcat-6.0.35.tar.gz# mv apache-tomcat-6.0.35 /usr/local/.# cd /usr/local/apache-tomcat-6.0.35/bin# ./startup.sh(Oracle VM VirtualBox 관리자에서 네트워크 > 포트 포워딩 > 호스트/게스트 IP는 공란, 호스트/게스트 포트를 8080으로 추가)# sed -i /^COMMIT/i"-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT" /etc/sysconfig/iptables# service iptables restart12. Apache 설치웹서비스로 잘 알려진 아파치를 설치한다. 톰캣과 마찬가지로 단독으로 운영이 가능하지만 동적인 웹페이지나 DB 연동이 필요하다면 톰캣등의 WAS가 필수적이다. 다만 WAS로 반드시 톰캣을 써야 하는건 아니고 국내 TMAX社의 Jeus나 BEA의 WebLogic, IBM의 WebSpere, RedHat의 Jboss등도 가능하다. 아파치를 설치하기 전에 라이브러리나 각종 모듈 설치가 선행되어야 하는데, 만약 아파치가 먼저 설치되었다면 삭제후 다시 설치해야 할 수도 있다.12-1. zlib 재설치zlib는 보안 라이브러리의 일종인데 기본으로 설치되어 있지만 보안 관련 프로그램이다보니 항상 최신의 배포본을 유지하는 것이 중요하므로 open_ssl을 설치하기 전에 버전을 올리기로 한다.# echo 127.0.0.1 sptest.com www.sptest.jxvf httpd-2.4.3.tar.bz2# yum install -y pcre-devel# cd httpd-2.4.3/srclib/# wget http://mirror.apache-kr.org//apr/apr-1.4.6.tar.bz2# wget http://mirror.apache-kr.org//apr/apr-util-1.4.1.tar.bz2# tar -jxvf apr-1.4.6.tar.bz2# tar -jxvf apr-util-1.4.1.tar.bz2# mv apr-1.4.6 apr# mv apr-util-1.4.1 apr-util# cd ..# ./configure --with-included-apr --with-included-apr-util --enable-modules=all --enable-so --enable-ssl --with-ssl=/usr/local/openssl# make && make install12-4. ssl 설정보안서버 설정하고 웹서비스를 구동시킨다. 톰캣이 구동중이 아니므로 동적인 웹페이지 표출은 안되지만 html등 정적인 웹서비스는 정상작동하여야 하며, http와 https로 서비스가 가능해야 한다.# cd /usr/local/apache2/conf# sed -i /httpd-ssl.conf$/s/^#Include/Include/ httpd.conf# sed -i /mod_ssl.so$/s/^#Include/Include/ httpd.conf# sed -i /mod_socache_shmcb.so$/s/^#Include/Include/ httpd.conf# sed -i "/^#ServerName /cServerName www.sptest.com:80" httpd.conf# cd extra# sed -i "/^#ServerName /cServerName www.sptest.com:443" httpd-ssl.conf# sed -i "/^#ServerAdmin /cAdmin admin@sptest.com" httpdtRoot "/sptest"" httpd.conf# sed -i "/Directory /s//usr/local/apache2/htdocs//sptest/" httpd.conf# echo LoadModule jk_module modules/mod_jk.so >> httpd.conf# echo JkWorkersFile conf/workers.properties >> httpd.conf# echo JkShmFile logs/mod_jk.shm >> httpd.conf# echo JkLogFile logs/mod_jk.log >> httpd.conf# echo JkLogLevel info >> httpd.conf# echo JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" >> httpd.conf# echo JkMount /*.jsp b1ix >> httpd.conf# echo JkMount /red5* b1ix >> httpd.conf# cd extra# sed -i "/^DocumentRoot /cDocumentRoot "/sptest"" httpd-ssl.conf# cd /usr/local/apache-tomcat-6.0.35/conf/Catalina/localhost# echo > ROOT.xml# echo >> ROOT.xml# /usr/local/apache-tomcat-6.0.35/bin/startup.sh# /usr/local/apache2/bin/apachectl start1 + 2 = 3단순한 계산이지만 계산이 되었다는 것이 중요하다.웹페이지 소스에 3이라는 숫자를 적은 것이 아니라, 1과 2를 톰캣에게 주고 더하라는 명령을 JSP 구문으로 전달하여 결과로서 3을 받은 것이다. 이로써 톰캣이 정상적으로 구동되고 있음을 알 수 있다.14. MySql jdbc 설치 및 dbcp 설정톰캣을 단순히 JSP 컴파일만을 위해 사용한다면 큰 의미가 없다. 다양한 사용자 정보를 저장하고 있는 DB와의 연동이
구슬치기 퀴즈 풀이 프로그램(이하 프로그램)은 기본적으로 C언어로 작성되었으며 재귀호출이 핵심 로직이다. 수많은 경우의 수를 모두 풀어봐야 하므로 순차적인 반복 대입이 가능한 재귀호출이 가장 적합하다고 판단했다. 또한 프로젝트가 커지면 유지보수가 어렵기 때문에 가능하면 모듈을 작게 만들고자 했다.
수도쿠 프로그램● 도입누구나 한번쯤 아침 무료신문에서 수도쿠를 풀어본 경험이 있을 것이다. 일반적으로 9x9개의 테이블에 1부터 9까지의 숫자를 넣어 완성시키는 방식인데, 도전은 쉽지만 완성하기는 결코 쉽지 않은 게임이다. nxn 테이블에 n개의 서로다른 숫자를 한번씩만 사용하여 행과 열을 만드는 방진을 뜻하는 “라틴스퀘어”에서 발전한 수도쿠는 1979년 미국인 하워드 간스에 의해 “Number Place”라는 이름으로 소개되었으며, 1986년 일본에서 스도쿠라는 이름으로 출판되어 2005년부터 전세계적인 인기를 얻고 있다. 이러한 수도쿠는 아래의 기본적인 두가지 규칙만을 지키면 된다규칙 : n차 수도쿠 큐브에 대하여,1. 외부큐브(n2xn2)의 각 행과 열은 1부터 n2까지의 숫자를 한번씩만 써야 한다.2. 내부큐브(nxn)에도 1부터 n2까지의 숫자를 빠짐없이 한번씩만 써야 한다.이때 n은 자연수인데,▷ n=1이면1개의 셀이 내부큐브이면서 동시에 외부큐브이고 사용할수 있는 숫자도 1뿐이다. 이렇게 되면 위의 규칙이 무의미하게 되므로 정상적인 수도쿠로 볼수가 없다.▷ n=2이면내부큐브는 2x2, 외부큐브는 4x4개의 셀로 이루어지고 1부터 4까지의 숫자를 사용한다. 가장 작은 수도쿠 큐브이다.▷ n=3이면가장 일반적인 큐브이다. 1부터 9까지의 숫자를 사용하며 이번 프로그램에서도 사용하는 규격이다. 다만 소스에서는 약간의 수정을 통해 n값을 바꿀수도 있다.▷ n>3이면충분히 사용 가능한 큐브이나 흔히 사용하지는 않는다. n이 4라면 1부터 16을 사용한다.위와같이 수도쿠 큐브는 32x32만 있는 것이 아니라 그 이상도 얼마든지 가능하다. 하지만 프로그램의 특성상 n=2와 n=3이 해결되면 그 이상은 큰 의미가 없으므로 n=3인 경우로 가정하고 코딩을 진행한다. 하지만 소스코드 도입부분의 n값만 바꾼다면 얼마든지 그 이상의 큐브를 해결할 수 있다.● 프로그램 흐름 및 해설1. 프로그램 시작2. n2xn2개의 셀들중 빈 셀에 1부터 값 대입3. 빈 셀이 있으면 2번으로, 없으면 외부 및 내부 큐브 검증3-1. 정답이면 현재의 큐브를 출력후 프로그램 종료3-2. 오답이면 리턴하여 마지막으로 대입한 셀값을 1증가후 3번으로 이동4. 프로그램이 종료되지 않고 4번까지 오면 정답은 없다5. 프로그램 종료▷ 행과 열이 존재하는 큐브를 단순화하기 위하여 선형배열로 코딩하였고, 현재의 큐브상태를 저장하기 위한 메모리를 따로 확보하지 않도록 스택을 이용한 재귀호출 방식을 사용하였다. 프로그램이 시작하면 n2행n2열의 큐브를 n2xn2개의 선형배열로 저장하였고, 3번에서 분기된 3-2가 다시 3번을 호출하는 재귀호출이 사용되었다.▷ 위의 FlowChart는 프로그램의 전체적인 흐름만을 파악하기 위한 것으로서, 단순 대입절차는 제외하고 흐름에 영향을 미치는 분기문이나 loop문만으로 작성하였다.● 프로그램 소스 및 해설// *************************************// ** Sudoku(9x9) Solution v.0.1 **// ** Written by Seok-Hun. Lee. **// ** on 2008.10.01 **// *************************************#include #include #include #include #include #define UNIT(3*3)// -> 3차 큐브// 외부큐브의 한 변의 셀 개수(또는 내부큐브의 셀 개수)#define boolint#define false0#define true1void tryCell(int iCell[], int idx, int nmb);// 셀값 대입 함수void printCube(int iCell[]);// 큐브 출력 함수bool verifyCube(int iCell[]);// 검증함수time_t t;// 시작과 끝의 시각을 담을 시간변수int main(int argc, char *argv[]){int i, j;// 루프를 돌리기 위한 임시변수char sT[2];// 문자열 1글자를 저장하기 위한 임시변수int iCell[UNIT*UNIT];// 실제 값이 들어갈 외부큐브printf("Sudoku(%dx%d) Solution v.0.1nn", UNIT, UNIT);if (argc == 2)// 반드시 1개의 인자를 갖어야 한다{if (strlen(argv[1]) != UNIT*UNIT)// 인자의 길이는 외부큐브 셀의 개수와 같아야 한다.{printf("데이터는 %d자여야 합니다.n", UNIT*UNIT);return 1;}for (i=0;i
진법변환 프로그램● 도입논리회로 과목에서는 2진법과 16진법을 기초적으로 공부한다. 이와 함께 8진법, 10진법을 포함한 4개의 기수를 가지고 각각의 진법으로 변환하는 과정을 배우고 후에 소프트웨어 과목에서 프로그래밍을 실습하게 된다. 2진법과 8, 16진법은 1, 3, 4비트로 정확하게 나타내어진다는 공통점을 갖고 있어 각각의 변환은 기본적인 방법 이외에도 편리한 다른 방법이 존재한다. 그러나 그 이외의 M진수에 대하여는 일반적으로 10진수를 거쳐 다시 N진수로 변환해야 한다. 이러한 비실용적이고 단순반복적인 계산절차를 아래와 같이 자동화 하고자 한다.● 프로그램 흐름1. 프로그램 시작2. M진수의 기수와 수, N진수의 기수를 입력3. M진수를 10진수로 변환3-1. M진수 R의 길이가 n이라 할때 x번째 숫자에 M의 (n-x)승을 곱한후 합산3-2. 합산된 결과를 반환4. 변환된 10진수를 N진수로 변환4-1. 10진수 S를 N으로 나눔4-2. 몫이 0이 아니면 4-1로 분기4-3. 몫이 0이면 4-1의 나머지를 마지막부터 처음순으로 연결4-4. 4-3의 결과를 포인터 변수에 전달5. N진수 출력6. 프로그램 종료● 프로그램 소스 및 해설// *********************************// ** File : Notation_Transform.c **// ** Auth : Lee Seok Hun **// ** Desc : M진수를 N진수로 변환 **// *********************************#include #include // strcat 함수등#include // pow 함수등#include // UINT64 타입등을 쓰기위하여#define MAX_BIT_LENGTH64// UINT64 타입은 64비트임.// 10진수 9,999,999,999,999,999,999까지 연산 가능.UINT64 transNto10(char *src, int notationS);int trans10toN(char *rst, UINT64 D10, int notationT);int main(){UINT64 D10;// 10진수 중간 결과물 변수(unsigned __int64 타입)char srcNum[MAX_BIT_LENGTH];// 변환전 수char rst[MAX_BIT_LENGTH];// 변환후 수int notationS;// 변환전 기수int notationT;// 변환후 기수rst[0] = 0;// 결과값 변수를 초기화printf("변환전 수의 기수 = ");scanf("%d", ¬ationS);// 변환전 기수 입력printf("변환전 수 = ");scanf("%s", srcNum);// 변환전 수 입력printf("변환후 수의 기수 = ");scanf("%d", ¬ationT);// 변환후 기수 입력if(!(notationS >= 2 && notationS = 2 && notationT 12, ...)}else// 숫자를 표현하는 문자라면{tc -= '0';// 문자에 대응하는 숫자로 변환('3' -> 3, ...)}if(tc>=notationS)// 기수보다 큰 숫자가 있다면 진법 규칙에 위배되므로{printf("각 숫자는 기수(=%d)보다 작아야 합니다.n", notationS);// 에러 출력후return 0;// 0 반환}acc += (UINT64)(tc*(UINT64)pow(notationS,tmpi-(i+1)));// 임시변수에 누산// 기수(notationS)의 오른쪽 순번-1(tmp-(i+1))승을 숫자(tc)에 곱함// M진수를 10진수로 변환하는 수학 공식}return acc;// 모든 숫자에 대해 계산이 끝난후 acc를 반환}int trans10toN(char *rst, UINT64 D10, int notationT)// 10진수 D10을 notationT진수로 변환하여 rst에 넣어줌{UINT64 tmpQ;// 몫UINT64 tmpR;// 나머지char tmpstr[1];// 숫자를 문자로 변환하기 위한 임시 변수tmpQ = D10 / notationT;// 몫을 구한다.tmpR = D10 % notationT;// 나머지를 구한다.if(tmpR '7' ...)}else// 10이상이면{tmpR = tmpR+'A'-10;// 숫자를 알파벳으로 변환(10 -> 'A', 11 -> 'B' ...)}sprintf(tmpstr, "%c", tmpR);// 나머지를 문자열로 변환(strcat을 쓰기위함)if(tmpQ)// 몫이 0이 아니면{trans10toN(rst, tmpQ, notationT);// 몫을 다시 나눈다.(재귀호출)}strcat(rst, tmpstr);// 나머지를 밑에서부터 위로 붙인다.
Windows 9x, NT 그리고 2000에서의 API 엿보기 테크닉Yariv KaplanAPI 엿보기 유틸리티들은 애플리케이션과 운영체제의 내부구조를 탐험하는데 가장 강력한 도구들중 하나이다. 그러나 불행히도, SDK나 DDK 모두 그런 유틸리티를 제작하는 방법에 대한 어떠한 문서나 데모 예제도 제공하지 않는다. 이 문서는 윈도우즈 애플리케이션에 의해 쟁점이 되는 API 호출을 후킹하는 여러 방법을 제공함으로써 이 주제에 대한 약간의 빛을 뿌려주려고 노력할 것이다.당신만의 API 엿보기 유틸리티를 만들기위해 의자에 앉기전에 당신이 고려해 봐야할 여러 가지가 있다. 먼저, 당신은 한개의 애플리케이션만을 엿볼기를 원하는지, 아니면 시스템 전역적인 API 인터셉터를 설치하기를 원하는지를 결정 할 필요가 있다. 예를들어, 관리자에 의해 설정되어진 규칙들에 따라 특정 프로세스의 실행을 막는 애플리케이션을 작성할 필요가 있다고 가정해 보자. 분명히, 당신은 제한되어야 할 것으로 표시된 새 프로세스의 실행을 감시하고 그것을 끝내버리는 방법을 알아야 할 것이다. 이것을 완성하려면 CreateProcess 함수(실제적으로는, 이 함수의 Ansi 버전과 Unicode버전 모두를 포함한다)를 만들기 위한 호출을 감시하는 시스템 전역적인 API 인터셉터를 설정해야 할 것이다. 애플리케이션이 새 프로세스를 생성하기 위해 이 함수들을 호출할 때 마다 당신의 인터셉터가 제어권을 갖고 필요한 어떠한 작업이라도 수행하게 될 것이다.다른 형태의 애플리케이션들은 한번에 한개의 애플리케이션만을 감시 할수 있는 능력을 갖은 좀더 간단한 API 인터셉터를 요구할 수도 있다. 그 좋은 예는 NuMega의 BoundsChecker이다. 이 툴은 메모리 누수나 윈도우즈 애플리케이션 내부에 잠재되어 있는 버그들을 찾아내기 위하여 API 호출들을 분석하는 능력을 갖고 있다.당신이 시스템 전역적인 해결법을 채용하기로 결정하든, 좀더 쉬운 방법을 적용하든, 당신은 여전히 수많은 API 후킹 테크닉들 중에 한가타겟 애플리케이션 안에서 해당 함수를 호출하는 모든 위치를 패치한다. 수정작업은 (독립적으로 실행 가능한 파일에 대해서는) 디스크상에서 또는 (그 실행파일이 이미 로드 된 후라면) 메모리상에서 될 수 있다. 어려운 부분은 패치가 반드시 되어야 할 위치를 정확하게 잡아내는 것이다. 이것을 하기 위해서 당신은 어셈블리 명령어를 분석할 수 있는 어셈블러 능력을 습득해야 할 것이다. 분명한 것은, 디스어셈블러를 하는 것은 결코 쉬운 작업이 아니며, 그것이 사람들 사이에서 이 API 가로채기 기술을 덜 대중적으로 만들고 있다는 것이다.IAT 패치하기만약 전에 한번이라도 API 후킹에 대해 조사해 본적이 있다면, 당신은 아마도 임포트 주소 테이블(IAT) 패치에 대해 들어본 적이 있을 것이다. 이 기술의 수많은 이점들은 그것을 윈도우즈상에서 API 함수들을 후킹하는 방법들중 가장 우아하고 일반적인 방법이 되도록 해주고 있다.이 기술의 기본은 32비트 윈도우즈 실행 파일들과 DLL들이 이동가능하고 실행가능한(PE) 파일 포맷으로 작성되었다는 사실과 관련이 있다. 이 스펙에 기반한 파일들은 섹션이라고 알려진 여러 논리적인 조각들로 구성되어져 있다. 예를 들어, .text 섹션은 애플리케이션의 컴파일된 코드를 담고 있는반면 .rsrc 섹션은 다이얼로그 박스, 비트맵과 툴바 같은 리소스들을 저장하는 일을 담당하고 있다.윈도우즈 실행파일 안에 존재하는 섹션들 가운데 .idata 섹션은 API 인터셉터를 작성하고자 하는 사람들에게 특히 유용하다. 이 섹션 안에는 (임포트 주소 테이블이라고 알려진) 특별한 테이블이 위치하고 있는데, 그것은 실행파일 코드에 의해 참조되어지는 임포트된 함수의 이름에 대한 파일-상대적 오프셋을 담고 있다. 실행파일이 메모리에 로드될 때마다 윈도우즈는 이러한 오프셋들을 임포트된 함수들의 올바른 주소로 패치한다.왜 윈도우즈는 수고스럽게도 제일먼저 IAT 패치를 처리해야 할까? 아마 당신도 알고 있겠지만, 윈도우즈 실행 파일과 DLL들은 메모리에 로드된 후에 부분에서 쟁점이 되는 API 호출을 추적할수 있으면서 게다가 수정해야 할 위치도 단 한개 - API 함수 자신 뿐이라는 것이다.여기서 사용될 수 있는 접근법은 여러 가지이다. 첫 번째는 목표가 되는 API의 첫 번째 바이트를 중단점 명령(3번 인터럽트)으로 교체하는 것이다. 해당 함수를 부르는 호출은 예외를 발생시킬 것이고, 당신의 API 인터셉터가 목표 프로세스의 디버거로 작동하고 있다면 그 예외가 당신에게 보고될 것이다. 하지만 불행히도 이 접근법에는 많은 문제점이 있다. 첫째로, 윈도우즈 예외처리 구조의 형편없는 수행능력은 시스템을 심각하게 느려지도록 만들 것이다. 두 번째 문제점은 윈도우즈 디버깅 API의 수행과 관련이 있다. 디버거가 종료되자마자 그 디버거의 제어권 아래에 있는 모든 애플리케이션은 종료된다. 당연히 이러한 동작은 당신이 시스템 전역적인 가로채기를 수행중이라면 이것은 결코 사용할수 없고, 사용하려면 목표 애플리케이션이 동작을 중지하기 전에 자신 스스로가 종료될수 있어야 한다.또다른 가능성은 목표 함수를 CPU의 제어권 전송 명령(즉, CALL 또는 JMP)으로 패치하는 것이다. 또한번 말하지만 이 접근법에도 여러 가지 문제점이 있다. 첫째, 가로채어진 함수의 끝부분을 패치가 넘어서 버릴 수 있는 가능성이다. 이 경우는 목표 API가 5바이트(CALL과 JMP는 각각 길이가 5바이트이다)보다 짧을때 발생한다. 또다른 쟁점은 가로채어진 함수의 패치된 버전과 “패치되지 않은” 버전간의 영구적인 교환에 대한 필요성이다. 이것은 당신의 인위적인 루틴이 CPU로부터 제어권을 받으면 그것은 가로채어진 함수를 예전의 후킹되지 않은 상태로 복원시켜야 한다는 것을 뜻한다. 이것은 API 인터셉터가 인위적인 루틴을 되부르는 무한루프를 생성하지 않은채 원본 함수를 호출할수 있어야 한다는 조건이 된다. CPU가 원본 함수를 실행하는 시간동안 시스템의 다른 부분에서 해당 함수에 대한 다른 호출이 발생할수도 있음을 생각해보라. 그 상태에서 함수는 후킹되지 않은 것을 어떻게 보장할 것인가? 그 질문에 대답하기 전에 우리는 윈도우즈 메모리 관리 장치의 내부 구조에 대해 좀 더 이해할 필요가 있다.당신도 아마 알고 있겠지만, 각각의 32비트 윈도우즈 애플리케이션은 자신이 사용할수 있는 고유의 주소 공간을 갖고 있다. 작업 교환시에, 윈도우즈는 새로운 프로세스의 선형 주소 공간을 물리 메모리 맵(이것을 프로세스 메모리 문맥이라고도 부른다)에 반영하기 위해 페이지 테이블을 갱신한다. 결국 프로세스의 고유한 메모리 영역에 대응되는 페이지 테이블 진입점은 다른 물리적 주소를 가리키도록 수정되는 반면 공유 메모리 영역에 대응되는 페이지 테이블 진입점은 그대로 남아있게 된다.윈도우즈 9x 체계 아래서 4GB의 선형 주소 공간은 각기 다른 여러개의 메모리 영역으로 나뉘어져 있는데, 그것들은 모두 미리 정의된 목적을 갖고 있다. MS-DOS와 전역 힙의 첫 부분이 최하단의 4MB를 차지한다. 그 다음 영역은 4MB부터 2GB까지에 걸쳐있고 윈도우즈 9x가 각각의 프로세스 코드, 데이터와 DLL들을 적재하는 곳이다. 각 프로세스의 물리적 주소는 독립적이어서 윈도우즈 9x는 특정한 프로세스가 활성화 되었을때 4MB부터 2GB의 영역에 대응하는 페이지 테이블 진입점이 그 프로세스의 물리적 메모리 페이지에 맵핑된다는 것을 보장할 수 있다. 이러한 개념은 같은 선형 주소를 공유하는 모든 프로세스에게는 적용되지만 같은 물리 주소를 공유하는 것에는 해당하지 않는다(사실 그것은 불가능하다). 4MB부터 2GB까지의 선형 메모리 영역에서 물리 주소 공간으로 통하는 하나의 창문이 있다고 생각해 보자. 이 창문은 한 프로세스에 의해 점유된 고유의 물리 메모리 위치들을 보여주기 위해 그 프로세스가 작동할 때마다 움직여 다녀야 한다.어찌되었든간에 이 구조의 실질적인 이점은 무엇일까? 그것은, 모든 프로세스가 같은 선형 주소를 사용하기 때문에, 윈도우즈는 코드들을 확정하여 고정시키는 작업을 하지 않고도 서로 다른 물리적 위치에 그것들을 불러들일수 있다는 것이키는지는 하나의 문제일 뿐이며, API 인터셉터를 작성할때는 그 타이밍이 좀더 중요한 요소가 된다. 잘못된 순간에 주입을 하게 되면 당신의 인터셉터는 목표 애플리케이션에 의해 불려지는 호출들을 놓치고 말 것이다. 실제로 이 문제는 시스템 전역적인 인터셉터를 작성할 때 나타난다. 이런 경우 인터셉터는 프로세스가 실행된 직후, 가로채어진 함수에 대한 호출을 부르기 전에 즉시 프로세스의 주소공간에 훔쳐보기 DLL을 주입할 필요가 있다. 이것을 수행하는 가장 좋은 방법은 CreateProcess 함수를 감시 하는 것이다. 그런 호출이 발견되면 인터셉터의 인위적인 루틴은 CREATE_SUSPENDED 값을 담고있는 수정된 dwCreationFlags 파라미터와 함께 원본 CreateProcess 함수에게 제어를 넘겨준다. 이것은 목표 프로세스가 시작은 되지만 일시정지 상태에 머무르게 되는 것을 보장해준다. 그러면 인터셉터는 자신의 훔쳐보기 DLL을 목표 프로세스의 주소 공간에 주입할 수 있고 ResumeThread API 함수를 이용하여 그것을 다시 활성화 시킬 수 있다.윈도우즈 아래에서 프로세스들의 실행을 탐지하는 다른 방법들은 아래의 섹션에서 제시된다. 불행히도, 그것들의 비동기적인 특성 때문에 다른 프로세스의 주소공간에 훔쳐보기 DLL을 주입할 적절한 시간을 탐지하기에는 다소 적합지 못하다.프로세스 실행 탐지앞에서도 보았듯이, 새로운 프로세스의 실행을 탐지할수 있는 능력을 갖은 애플리케이션이 종종 필요하다. 하나의 가능성은, 앞에서도 언급되었지만, CreateProcess 함수를 후킹하고 시스템의 다른 부분에서 불려지는 해당 함수에 대한 호출을 감시하는 것이다. 하지만 단지 한개의 함수를 후킹하기 위한 목적으로 시스템 전역적인 API 인터셉터를 작성하는 것은 종종 노력한 만큼의 보상을 기대하기 어렵다.다행히도 윈도우즈 95(OSR 2 이상), 98 그리고 NT/2000에서는 시스템 전역적인 API 인터셉터가 없이도 이것을 완성하는 좀더 쉬운 방법이 있다. 윈도우즈