php源代码保护——PHP加密⽅案分析解密还原
前⾔
php是⼀种解释型脚本语⾔.
与编译型语⾔不同,php源代码不是直接翻译成机器语⾔.⽽是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进⾏解释运⾏ .在php源代码的保护在原理可以分为3⼤类.
源代码混淆(编码)
OPCODE混淆(编码)
修改解释引擎(虚拟机)
在部署上可以分为2⼤类.
⽆扩展
有扩展
下⾯分析下各种加密⽅案的实现⽅法
PHP 加密⽅案分析
⽆扩展⽅案
源代码混淆
⽆扩展的加密在⼀些⼩开发者⽐较常见。
这种源代码保护⽅式侵⼊性⼩,⽆需对服务器做额外的配置,兼容性较强。
这种情况混淆后的源代码还原⾮常简单,可完全还原出源代码。 有时连注释都会保留 (x 我觉得这种混淆都不能称之为加密
基本流程 压缩代码->混淆变量函数类名->使⽤简单函数和⽅法进⾏编码加密 例:base64 异或
或私信回复“资料”获取
⼿⼯解密
看到这种的php不要慌 这种处理后的⽂件 解密流程的变量和函数名使⽤了⼤量的⾮打印字符 按照正常的流程就可以
ctrl+alt+l 快捷键 格式化代码 (这⾥使⽤的PhpStorm 其他IDE 格式化遇到特殊符号可能出问题 这⾥提前调整好了⽂件编码)
这⾥有⼀个php的特性 php中的base64遇到⾮base64表中字符会直接忽略 不会影响解码
注: PHP7 遇到空字符可能会抛出error 可以使⽤php5.6执⾏ (这⾥有⼀个兼容性问题 )
遇到这种加密最简单的⽅法就是⽂件中最后⼀步执⾏的函数 直接把内容打印出来
这种编码⽅法最后⼀步肯定要使⽤eval执⾏还原后的php代码 所以打印最后⼀个函数基本上php代码就会全部出来 (x 前⾯操作⼀⼤顿毫⽆卵⽤
注: 有保护⽅案也使⽤了call_user_func或call_user_func_array间接调⽤eval
成功还原源代码 <?php phpinfo();?>
⾃动化通⽤解密
PHP提供了强⼤的扩展功能 可以直接通过编写php扩展hook eval相关函数 获取执⾏的源代码HOOK php zend引擎的 zend_compile_string zend_include_or_eval 函数达到⽬的
这⾥演⽰的是 hook zend_compile_string 函数
/* $Id$ */
#include"php.h"
#include"ext/standard/info.h"
static zend_op_array*(*old_compile_string)(zval *source_string,char*filename TSRMLS_DC);
static zend_op_array*evalhook_compile_string(zval *source_string,char*filename TSRMLS_DC)
{
if(strstr(filename,"eval()'d code")){
printf("\n------eval-------\n%s\n------eval-------\n",Z_STRVAL_P(source_string));
}
return old_compile_string(source_string, filename TSRMLS_CC);
}
PHP_MINIT_FUNCTION(evalhook)
{php好看主页源码
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(evalhook)
{
return SUCCESS;
}
PHP_RINIT_FUNCTION(evalhook)
{
old_compile_string = zend_compile_string;
zend_compile_string = evalhook_compile_string;
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(evalhook)
{
zend_compile_string = old_compile_string;
return SUCCESS;
}
PHP_MINFO_FUNCTION(evalhook)
{
php_info_print_table_start();
php_info_print_table_row(2,"eval hooking","enabled");
php_info_print_table_end();
}
zend_function_entry evalhook_functions[]={
ZEND_FE_END
};
zend_module_entry evalhook_module_entry ={
STANDARD_MODULE_HEADER,
"evalhook",
evalhook_functions,
PHP_MINIT(evalhook),
PHP_MSHUTDOWN(evalhook),
PHP_RINIT(evalhook),
PHP_RSHUTDOWN(evalhook),
PHP_MINFO(evalhook),
"0.0.1-dev",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(evalhook)
成功还原源代码
PHP扩展⽅案
源代码混淆
使⽤php扩展的代码混淆和⽆扩展代码混淆⽐较相似,只不过是把代码还原过程从php代码转到了php扩展。
同样是使⽤aes des 异或等加密⽅法直接加密php代码,HOOK翻译php的函数在翻译PHP⽂件前对⽂件进⾏解密操作。这种⽅案也可以完全还原出源代码。在⽆其他混淆和压缩时甚⾄还会保留注释。
⼿⼯解密
这⾥以beast为例.
⾸先在php的扩展⽬录下到beast.so
beast的加密⽅案会把加密key编译进扩展中. 我们只需要寻key就可以完成解密
beast由于是开源项⽬.有现成的符号表和源码这使得反编译寻key变得⾮常简单.
但这样有点太简单了. 所以这⾥演⽰的是在没有源码的情况下使⽤IDA分析解密流程.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论