본문 바로가기
해킹/PHP HACKING

CORE PHP HACKING 기본

by 베리베리 2008. 12. 1.
CORE PHP HACKING 기본
작성: 베리베리 2008.12.01
--------------------------

core php hacking 은 php의 핵심적인 코드를 수정하는 것을 의미한다.
수정을 해보면 php 의 동작원리에 대해 배울 수 있고,
여러가지 기능을 추가할 수 있다.

특히.. php 코드에서 zend 라는게 있는데.
zend 는 php 의 핵심적인 기능을 담당하는 코드이다.
php에서 가장 중요하다고 할 수 있다. 앞으로 zend에 대해서 많이 소개를 하게 될것이다..

php 소스를 받아서 압축을 풀면
나오는 폴더중에서

/ext
     /ext/standard
/main
/Zend
/sapi

이 폴더들이 가장 중요한 폴더다.
이 폴더안에서 중요한 파일들을 몇가지 소개하면

/main/main.c
/Zend/zend.c

이 두개의 파일이 가장 중요하다.
main.c 에 있는 php_execute* 라는 함수가 호출되면
zend.c 에 있는 zend_execute_scripts 가 다시 호출되고
zend_execute_scripts 는 ***comiple 과 ***execute 를 실행하도록 되어있다.
php_execute* 가 호출되는 방법은 여러가지가 있는데,

내가 살펴본 방법은 sapi 라는 것을 통해서 호출되는 경우였다.
sapi 란?
아파치같은 웹서버가 php 를 실행시킬때 같은 프로세스안에서 php가 실행될수 있도록
php 가 컴파일 되는 과정에서 아파치를 위해 특별히 주문제작(?)된 함수들을 말한다.(쉬운이해를 위해 주문제작이라고 했지만 php개발자들이 만들어주지 않는 경우에는 자신이 직접 만들어야 한다. ㅋ)

주문제작이므로 다른 웹서버는 사용할 수 없다. 그렇기때문에
컴파일할때 어떤 웹서버에 붙어서 실행될것인지 아니면 독립적으로 실행될것인지 옵션을 지정하게 되어있다.

내가 건드린것은 sapi 를 가장많이 건드렸고
그리고
/main/main.c 와
/Zend/zend.c 그리고
/Zend/zend_execute.c 를
가장 많이 건드렸다.

PHP를 좋아하는 나로서는 아주 흥미로운 일이었고,
c언어를 어느정도 하는 사람이라면 별로 어렵지 않을거라고 생각한다.

오늘은 처음이니까 분석에 도움이 되는 몇가지 기본적인 것들만 소개하고
다음에는 더 자세하게 설명하겠다.

메크로 & 메크로 함수들

메크로란?
메크로함수(macro function)는 매우 많이 호출되는 함수를 쓸때 타이핑이 귀찮아서 또는, 너무길기때문에
어쩔수 없이 사용자가 지정한 어떤 다른이름으로 함수를 호출을 할수있도록 메크로라는 방법을 사용하는 것이다.

1. 구조체 접근을 위한 메크로 함수들

PG
SG
EG

PG(abc) 이렇게 하면 php_globals 라는 구조체의 abc라는 변수를 의미하게 된다.
SG나 EG도 이런식이다.

SG는 sapi 에서 사용되고 EG는 zend_execute.c 에서 사용된다.

주의할점은 zend 쪽은 zend.h 만을 인클루드 하게 되어있는데, PG라는 메크로는
/main/php_globals.h (?) 에 정의되어있다. (파일명은 모르겠지만 분명 main 폴더안에 있다 ㅋ)
그렇기때문에 PG 메크로를 사용할 수 없다.
정 사용하고 싶으면 적절한 헤더파일을 부르면 될것이다. 아니면 그 메크로랑 구조체만 복사해와도 될지 모른다.
알아서 하세요 ㅋ

2. TSRM* 메크로
TSRM 이란건 간단히 설명해서(잘 모르기때문에 -.-)
멀티쓰레드 환경에서 실행될때 각각의 php실행마다 독립적인 작업공간을
보장하기 위한 코드로 이해를 하면 된다.

TSRM 으로 시작하는 메크로들이 있는데 함수호출시에 넘기는것은 TSRMLS_C 또는 TSRMLS_CC 를 사용하고
호출되는 함수에서는 TSRMLS_D 로 받는다.

특이한점은  TSRMLS_CC 인데 이것은  TSRMLS_C 랑 다르건 딱 한가지. 치환(置換; 둘 치, 바꿀 환) 될때 , 이 맨앞에 붙는것만 다르다. 아래 메크로 보면 이해될것이다. 이와 마찬가지로  호출당하는 쪽에서 지정하는 TSRMLS_DC 도 치환될때 , 이 맨앞에 붙는다는 것만 다를뿐  TSRMLS_D 와 동일하다

TSRM 메크로는
/TSRM/TSRM.h 에 있다.

아래는 많이 사용되는 메크로들이다.

#define TSRMLS_FETCH()   void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL)
#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)
#define TSRMLS_D void ***tsrm_ls
#define TSRMLS_DC , TSRMLS_D
#define TSRMLS_C tsrm_ls
#define TSRMLS_CC , TSRMLS_C

다음부터는 기능별로 분석을 해보도록 하겠다.

댓글