Cette page en Français
YAK Pro는 Y et A nother Killer Pro 덕트의 약자입니다.
무료, 오픈 소스, MIT 라이선스에 따라 게시됨.
이 도구는 nikic이 작성한 멋진 PHP 구문 분석 라이브러리인 최고의 기존 PHP 구문 분석기 PHP-Parser 4.x를 사용하여 PHP를 구문 분석합니다.
zip 아카이브를 다운로드하고 PHP-Parser 하위 디렉터리에 압축을 풀거나 git clone을 만들기만 하면 됩니다.
yakpro-po 2.x works on PhpParser 4.x
it will run on php >= 7.0, obfuscating code for php 5.2 to php 7.3
If you are running php 5.3 or higher,
Please use unsupported [yakpro-po 1.x](https://github.com/pk-fr/yakpro-po/tree/1.x) which works on 1.x branch of PhpParser.
yakpro-po.cnf 자체 문서화 파일에는 많은 구성 옵션이 포함되어 있습니다! 한번 보세요!
데모 : yakpro-po 데모.
전제조건: PHP 7.0 이상, PHP-Parser 4.x.
참고: 이 도구는 순수 PHP 소스를 난독화하기 위해 작성되었습니다. 이는 html 및 내장된 php와 함께 사용하기 위한 것이 아닙니다(사용 위험은 사용자 본인의 책임입니다...문장 섞기를 비활성화하려고 할 수도 있습니다...). echo <<<END ... END; 명령을 사용하여 PHP 내에 HTML을 삽입할 수 있습니다. 통사론!
배포하려는 PHP 프로젝트가 있는 경우 PHP는 스크립트 해석기이므로 소프트웨어의 모든 소스도 배포하게 됩니다!
어떤 이유로든 다른 사람들이 귀하의 소프트웨어를 이해, 수정 또는 조정하지 않기를 원할 수 있습니다.
귀하의 소프트웨어는 PHP 런타임 에서 이해할 수 있어야 하지만 사람이 이해하기는 매우 어려워야 하므로 난독화는 이 목표를 달성하는 데 아주 좋은 방법입니다.
모든 주석과 들여쓰기를 제거하고 한 줄의 프로그램 파일을 생성합니다.
if, else, elseif, for, while 을 if goto 문으로 대체하여 수행을 난독화합니다.
문자열 리터럴을 난독화합니다.
다음에 대한 이름을 뒤섞습니다:
문을 섞습니다.
프로젝트 디렉터리를 반복적으로 난독화합니다.
타임스탬프 기반 메커니즘과 유사한 Makefile은 마지막 난독화 이후 변경된 파일만 다시 난독화합니다.
프로젝트 내에서 난독화된 내용을 완전히 제어 할 수 있는 다양한 구성 옵션!
나는 이미 존재하는 일부 PHP 난독화 도구를 테스트하기 시작했지만 내 요구 사항에 모두 맞는 도구를 찾지 못했습니다. 저는 고도로 사용자 정의 가능한 구성 파일을 기반으로 다음을 수행할 수 있는 간단한 명령줄 도구를 원했습니다.
그래서 저는 이 도구를 작성하기 시작했습니다. 버전 1.0이 며칠만에 작성되었습니다...
Note: This setup is also valid for Windows 10 Anniversary with bash installed...
1. Prerequisites: git and php-cli (command line interface) packages.
on ubuntu: (adapt according your linux distribution)
# apt install git
# apt install php-cli
do not forget to install all other php modules that you are using within your software:
for example: apt install php-mysql if you are using mysql...
2. Navigate to the directory where you want to install yakpro-po (/usr/local is a good idea):
# cd /usr/local
3. Then retrieve from GitHub:
# git clone https://github.com/pk-fr/yakpro-po.git
4. Go to the yakpro-po directory:
# cd yakpro-po
5. Then retrieve from GitHub:
# git clone https://github.com/nikic/PHP-Parser.git --branch 4.x
6. Check that yakpro-po.php has execute rights, otherwise:
# chmod a+x yakpro-po.php
7. Create a symbolic link in the /usr/local/bin directory
# cd /usr/local/bin
# ln -s /usr/local/yakpro-po/yakpro-po.php yakpro-po
8. You can now run yakpro-po
# yakpro-po --help
# yakpro-po test.php
Modify a copy of the yakpro-po.cnf to fit your needs...
Read the "Configuration file loading algorithm" section of this document
to choose the best location suiting your needs!
That's it! You're done!
yakpro-po
구성 파일에 따라 난독화합니다! (구성 파일 로딩 알고리즘 참조)
yakpro-po source_filename
코드를 stdout으로 난독화합니다.
yakpro-po source_filename -o target_filename
코드를 target_filename으로 난독화합니다.
yakpro-po source_directory -o target_directory
코드를 target_directory/yakpro-po에 반복적으로 난독화합니다(아직 존재하지 않는 경우 생성).
yakpro-po --config-file config_file_path
config_file_path에 따라.
yakpro-po --clean
구성 파일에 target_directory가 있어야 합니다! target_directory/yakpro-po를 반복적으로 제거합니다.
(처음 찾은 것이 사용됩니다)
--config-file argument value
YAKPRO_PO_CONFIG_FILE environment variable value if existing and not empty.
filename selection:
YAKPRO_PO_CONFIG_FILENAME environment variable value if existing and not empty,
yakpro-po.cnf otherwise.
file is then searched in the following directories:
YAKPRO_PO_CONFIG_DIRECTORY environment variable value if existing and not empty.
current_working_directory
current_working_directory/config
home_directory
home_directory/config
/usr/local/YAK/yakpro-po
source_code_directory/default_conf_filename
if no config file is found, default values are used.
You can find the default config file as an example in the yakpro-po.cnf file of the
repository.
Do not modify it directly because it will be overwritten at each update!
Use your own yakpro-po.cnf file (for example in the root directory of your project)
When working on directories,
context is saved in order to reuse the same obfuscation translation table.
When you make some changes in one or several source files,
yakpro-po uses timestamps to only reobfuscate files that were changed
since the last obfuscation.
This can save you a lot of time.
caveats: does not delete files that are no more present...
use --clean command line parameter, and then re-obfuscate all!
(구성 파일 설정 무시)
--silent do not display Information level messages.
--debug (internal debugging use) displays the syntax tree.
-s or
--no-strip-indentation multi line output
--strip-indentation single line output
--no-shuffle-statements do not shuffle statements
--shuffle-statements shuffle statements
--no-obfuscate-string-literal do not obfuscate string literals
--obfuscate-string-literal obfuscate string literals
--no-obfuscate-loop-statement do not obfuscate loop statements
--obfuscate-loop-statement obfuscate loop statements
--no-obfuscate-if-statement do not obfuscate if statements
--obfuscate-if-statement obfuscate if statements
--no-obfuscate-constant-name do not obfuscate constant names
--obfuscate-constant-name obfuscate constant names
--no-obfuscate-variable-name do not obfuscate variable names
--obfuscate-variable-name obfuscate variable names
--no-obfuscate-function-name do not obfuscate function names
--obfuscate-function-name obfuscate function names
--no-obfuscate-class_constant-name do not obfuscate class constant names
--obfuscate-class_constant-name obfuscate class constant names
--no-obfuscate-class-name do not obfuscate class names
--obfuscate-class-name obfuscate class names
--no-obfuscate-interface-name do not obfuscate interface names
--obfuscate-interface-name obfuscate interface names
--no-obfuscate-trait-name do not obfuscate trait names
--obfuscate-trait-name obfuscate trait names
--no-obfuscate-property-name do not obfuscate property names
--obfuscate-property-name obfuscate property names
--no-obfuscate-method-name do not obfuscate method names
--obfuscate-method-name obfuscate method names
--no-obfuscate-namespace-name do not obfuscate namespace names
--obfuscate-namespace-name obfuscate namespace names
--no-obfuscate-label-name do not obfuscate label names
--obfuscate-label-name obfuscate label names
--scramble-mode identifier|hexa|numeric force scramble mode
--scramble-length length ( min=2; max = 16 for scramble_mode=identifier,
max = 32 for scramble_mode = hexa or numeric)
--whatis scrambled_name retrieves original symbol from obfuscation context.
(usefull for debugging your code when you give away
obfuscated code, and keep the same obfuscation context).
Tip: do not include the $ symbol, or use $ because
$ has special meaning in shell.
-h or
--help displays help.
If your obfuscated software makes use of external libraries
that you do not obfuscate along with your software:
if the library consists of functions:
set the $conf->obfuscate_function_name to false in your yakpro-po.cnf config file,
or declare all the functions names you are using in $conf->t_ignore_functions
example : $conf->t_ignore_functions = array('my_func1','my_func2');
if the library consists of classes :
set the $conf->obfuscate_class_name,
$conf->obfuscate_property_name,
$conf->obfuscate_method_name
to false in your yakpro-po.cnf config file...
... or declare all the classes, properties, methods names you are using in
$conf->t_ignore_classes,
$conf->t_ignore_properties,
$conf->t_ignore_methods.
This is also true for PDO::FETCH_OBJ that retrieves properties from external source
(i.e. database columns).
At first you can test obfuscating only variable names...
If you obfuscate functions, do not use indirect function calls like
$my_var = 'my_function';
$my_var();
or put all the function names you call indirectly in the $conf->t_ignore_functions array!
Do not use indirect variable names!
$$my_var = something;
or put all the variable names you use indirectly in the $conf->t_ignore_variables array!
Do not use PDO::FETCH_OBJ but use PDO::FETCH_ASSOC instead!
or disable properties obfuscation in the config file.
If you use the define function for defining constants, the only allowed form is when the
define function has exactly 2 arguments, and the first one is a litteral string!
You MUST disable constants obfuscation in the config file, if you use any other forms
of the define function!
There is no problem with the const MY_CONST = something; form!
Except for the statements shuffling obfuscation option,
the obfuscated program speed is almost the same than the original one.
$conf->shuffle_stmts is set to true by default.
If you encounter performance issues, you can either set the option to false,
or fine tune the shuffle parameters with the associated options.
You must know that the lesser the chunk size, the better the obfuscation,
and the lower your software performance!
(during my own tests, the maximum of obfuscation costs me about 13% of performance)
You can tune it as you wish!
분할 오류
opcache crashes on Ubuntu 21.10 - php 8.0.8 (segfault) both within apache2 and cli when
shuffle-statements is turned on for big files
works perfectly with newer versions of php (8.0.16 8.1 )
Sedimentation-fault는 프로젝트에서 많은 큰 파일을 난독화할 때 PHP의 가비지 수집기에서 분할 오류가 발생할 수 있다고 문제 #75에서 보고했습니다.
Trying to obfuscate ~5000 PHP files of ~1000 lines each, yakpro-po stopped after processing ~1600 files
with a simple (and frustrating) Segmentation fault
Workaround:
There is a stack overflow in garbage collector. The solution is to increase limit for stack.
To see your current limit, type
ulimit -s
I had 8192 - for a task of this size obviously totally undersized...
Change this to something more appropriate, say
ulimit -s 102400
and retry - the segmentation fault is gone! :-)