MS-Windows에서 php_screw 사용하기
2015.11.17 17:54
PHP_Screw는 일본의 pm9.com이라는 곳에서 만든 리눅스용 PHP 소스코드 암호화 솔루션이다.
개인적으로 윈도우용 PHP를 자주 사용하는데, 윈도우용으로 포팅을 못할 것도 없겠다 싶어서 작업해 봄.
가장 큰 거는 PHP extension에서 복호화시 tmpfile로 임시파일을 생성해서 php본체에 전달하던 것을 memstream을 사용하게 바꾼 것.
tmpfile 함수가 윈도우 권한 문제 때문인지 컴파일은 되는데, php 상에서 자꾸 뻑만 나고 동작이 제대로 되지 않았다.
콘솔에서 실행되는 descrew 파일을 추가하고, 암호화시 오리지날과 다르게 원본파일은 확장자를 변경 안하고 그대로 냅두는 대신, 암호화된 파일의 확장자에 .screwed가 추가되게 함.
그리하여 아래와 같이 작업 진행.
툴 : Visual Studio 2012(VC11) Express, Visual Studio 2015(VC14) Express
PHP 버전
* MS-Windows (Windows 8.1, 10) : 5.6.15, 7.0.0RC7, 7.0.5, 7.1.0 (php7의 경우, inttypes.h 추가해야 됨 -> 일단 작업파일에는 추가해뒀음.)
* Linux (CentOS 6.3, 7) : 5.3.3, 7.0.6
- 리눅스에서 컴파일할 때는 오리지날 php_screw와 동일하게 phpize / ./configure / ./make 콤보를 날려주면 됨
작업물 : 깃헙 (PHP 7.0.5 이전: 여기서 다운로드)
VC 컴파일 설정(솔루션내 프로젝트들 중에서 php dll 모듈 프로젝트에만 해당)
* 컴파일 설정내용은 여기서 다운로드에서 php_screw1.5-bab2_include_php705_src.zip 파일의 프로젝트 / 솔루션 설정을 비주얼스튜디오에서 확인.
- extension의 기본값은 Release_TS에 x64로 되어있음. (확실치 않음. 기억이 가물가물...)
- 콘솔용 인코더,디코더의 기본값은 Release_TS에 WIN32(x86)으로 되어 있으며 추가 작업 필요없음.
* PHP include 쪽 폴더를 새로 작업하려면 컴파일 할 때 아래 항목들만 추가해서 작업하면 됨.
- 링커 설정에서 php7ts.lib, php7.lib 위치와 이름을 정확하게 지정
- nts(Non Thread Safe) 라이브러리 사용하여 컴파일: 전처리 선언(PreprocessorDefinitions)에서 ZTS 항목 제거
- 64비트 컴파일: 프로젝트 설정(ProjectConfiguration)에서 WIN32 대신 x64 항목을 선택
* 컴파일러는 Visual C 2012(VC11)기준으로 되어 있음
- Visual C 2015(VC14)로 컴파일 하려면 솔루션을 연 후, PHP extension의 프로젝트 속성에서 아래와 같이 컴파일 옵션을 수정
- 전처리 선언(PreprocessorDefinitions)에서 PHP_COMPILER_ID 확인
** 위 선언(PHP_COMPILER_ID)는 php본체에서 검사하는 항목이라서 반드시 존재해야함하며, Php본체를 컴파일 한 VC 버전과 동일해야 함. 예를 들면 아래와 같다.
** php5 via VC 11 -> PHP_COMPILER_ID="VC11" (Visual C 2015(=VC14)에서 컴파일하더라도 이렇게 설정)
** php7 via VC 14 -> PHP_COMPILER_ID="VC14" (Visual C 2012(=VC11)에서 컴파일하더라도 이렇게 설정)
소스는 깃헙에서...
내가 작업한 놈들끼리는 당근 잘 돌아가고 있고, 윈도우용 내가 만든 버전에서 암호화 시킨 파일이 원래의 리눅스용 pm9버전 php_screw에서도 잘 돌아가는 것까지 확인함.
그런데, 문제가 있는게...
아래 내용 겁나 중요함.
김정균님의 mod_screwim 작업내역에 언급된 것으로, php_unscrew등의 설명대로 키값의 유추 가능한 문제가 있으므로, my_screw.h의 키를(기존 전역변수) 사용자가 직접 수정하여 지역변수화+함수화해서 운용하는 것이 좋겠음 실 사용 모듈에는 기존 "XOR + 압축" 대신, 다른 알고리즘으로 변형할 필요가 있다.
( 하나의 파일로 끝내는 방식이다보니, *.so든 *.dll이든 무슨 수를 쓰던 간에 키 값은 언젠가는 반드시 노출된다. )
또는, mod_screwim을 사용하는 것도 좋은 방법이 될 것 같다. 소개페이지를 보면 요구 OS가 Unix like라고 적혀있지만 코드가 잘 짜여져 있어서 거의 수정없이 *.so에서 *.dll로 바로 옮길 수 있을 것 같다. 나는 능력이 안되어서 포기 ㅎ
php 소스코드 암호화 솔루션 중에 오픈소스인 것들이 깃헙에 몇가지 있는데 (예를 들면 php-beast, screw_plus 등...), php_screw의 암호화는 단순하게 보면 "XOR + 압축" 이다 보니, 이를 확장한 종류라고 (개선은 아니라고) 생각해서 별로 신경쓰지 않았는데 (지시 방식은 다르지만 Blowfish 지원하는 php_blenc가 있기도 하고...), 반면에 윗 단락의 내용은 보고나서 며칠동안 정신을 차릴 수가 없었던게, 전역변수가 Dis-assembly시에 쉽게 노출된다는 것을 이번에 처음 알았다. 전산 쪽에 문외한인 나를 탓해야지.. 아오~ ㅠㅠ
이래저래 찾아보니, 하나의 파일 안에 널문자로 구분되는 식이니 전역이든 지역이든 제대로 숨기는 방법은 없는 것 같다.
지금 상태에서 더 키값을 꼬아버리면 웹서버 같은 곳에서는 CPU가 죽어날 거 같다.
그냥 이걸 포크해서 원래 하고 싶었던 것을 해야겠다.
KISA에서 개발 & 배포하는 LEA를 붙여봤는데, 괜찮아 보인다.
이 정도면 매우 훌륭해 보이니, 내 작업에 한 번 적용해봐야겠다.
( 작업한 거 올림. 언제 끝날지 모르겠다. https://github.com/edp1096/php_amho )
참고:
- Visual Studio를 이용하여 php extension 만들기
* http://blog.slickedit.com/2007/09/creating-a-php-5-extension-with-visual-c-2005/
* http://bloodguy.tistory.com/entry/PHP-Extension-만들기-Visual-C-2008
- php_screw 버그 수정
* http://cshapio0.blogspot.kr/2015/03/porting-php-screw-15-php-extension-to.html
* http://code.htmlasks.com/porting_php_screw_1_5_php_extension_to_windows_crashes_the_httpd_exe
* http://www.kissthink.com/archive/Do-gymnastics-PHP_SCREW-by-thin-your-source-code,-compiled-with-5.3.6-Windows-VC6,-VC9,-thread-safe-versions-lack-%EE%88%B3-band.html
- C 변수 선언은 위쪽으로 - C99
* http://stackoverflow.com/questions/11993416/error-c2275-rhandle-illegal-use-of-this-type-as-an-expression
- 파일포인터 > 스트림 변경
* http://stackoverflow.com/questions/16716078/how-to-change-the-source-code-when-called-zend-compile-file-before-it-is-parse
- zend_mm_heap currupted 오류
* php 소스 - ext에서 phar쪽 소스
- inttypes.h 못 찾을 때 (PHP7) - C99
* https://code.google.com/p/msinttypes/ (깃헙에 추가했음)
그 외:
- dl() 로딩
* http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=46682#c_46682
- php_stream tmpfile
* http://linux-documentation.com/en/package/php/streams.file-api.html
* http://worldwalker.co.kr/entry/cassandra-pdo-%EC%84%A4%EC%B9%98-centos?category=0
노다 쿠니마사님, 좋은 거 만들어주셔서 감사합니다. (--)(__) 꾸벅
끝.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | 툴 북마크 | 꿈돌이 | 2021.02.11 | 81312 |
19 | Git .gitignore | 꿈돌이 | 2017.03.18 | 819 |
18 | node.js 전역 모듈 제거 | 꿈돌이 | 2017.03.16 | 3606 |
17 | System unique id 추출 | 꿈돌이 | 2016.06.23 | 888 |
16 | Sass 관련 링크 | 꿈돌이 | 2016.06.12 | 353 |
15 | 디렉터리 안에 신규 파일 생성여부 확인 | 꿈돌이 | 2016.04.26 | 1964 |
14 | Chromium chrome://flags 설정 파일의 위치 | 꿈돌이 | 2016.04.12 | 465 |
» | MS-Windows에서 php_screw 사용하기 | 꿈돌이 | 2015.11.17 | 5736 |
12 | C# GDI 좌표 | 꿈돌이 | 2015.08.31 | 136455 |
11 | C# Dictionary | 꿈돌이 | 2015.08.28 | 582 |
10 | 브라우저 설정 - HTML5 그리드 | 꿈돌이 | 2015.08.25 | 205 |
9 | 안드로이드 루팅없이 특정 어플 실행 막기 | 꿈돌이 | 2015.06.28 | 1241 |
8 | 원격데스크톱 연결 - 로컬계정 사용 | 꿈돌이 | 2015.05.25 | 31391 |
7 | 윈도우8.1 프리징 해결 방법 | 꿈돌이 | 2015.04.07 | 556 |
6 | xe 업로드 된 파일이 첨부목록에서 사라질 경우 | 꿈돌이 | 2015.03.30 | 1226 |
5 | php-mailer 메일 전송 안 될 경우 | 꿈돌이 | 2015.03.28 | 1045 |
4 | GTK3/Cairo 버튼 클릭시 이벤트 처리 | 꿈돌이 | 2015.03.16 | 8712 |
3 | 윈도우8.1 core 버전에서 원격데스크톱 사용 | 꿈돌이 | 2015.03.13 | 2524 |
2 | C sprintf 숫자에서 문자열로 변환 | 꿈돌이 | 2015.03.10 | 409 |
1 | C 문자열 처리를 위한 다차원 배열 | 꿈돌이 | 2015.03.02 | 548 |