@Ta
/ 2019-03-30
Thinkphp5.0.24 服务层
创建对象 server_app_builder
调用 ->dirve() //主方法即可开始 在线生成其他网站对接的APP,并且自动进行360加固
如有兴趣,可以发你成品学习参考
/**
* Created by PhpStorm. IEDUser: admin
* Powery by 猫腻王子
* major-> Mobile Application develop Class
* Date: 2019/3/25 14:59
*/
namespace app\taskapi\servers;
use app\common\model\AppBuilderTasks;
use think\Debug;
/*
*app_builder 服务端
*return ['running_time','memory_userd','invalid_qq','curl_times'];
*/
class server_app_builder
{
/*
* 开发人员文档:
* 修改器应该为当前命名的 __CLASS__.vendor命名,系统将会自动引入,并且默认执行 main主方法
*================================================================================
* 任务列队 (Double) status 详情:
* // 0正等待系统接收->0.1列队锁等待中->0.2资源不存在->0.3读写权限失败->1.1开启解包 1.2解包失败->1.3解包成功 ->2.1进行修改器->3进行打包->3.2打包错误->3.3打包成功->4本地签名
//->5.1加固签名导入->5.2加固签名导入失败->5.3签名导入成功
/
6.1加固开始->6.2加固失败->6.3加固成功->6.4加固完毕,生成完毕
*/
public $resources_path; //资源路径
public $decompile_path; //解包资源路径
public $apktmp_path; //打包临时占用位子
public $tool_path; //操作工具
public $apktool_framework;//框架路径
public $complete_nosign;//生成好的初级包
public $complete_sign;//生成好的签名初级包
public $java_env_path;//java环境目录
public $jiagu360_path;//360加固地方
public $msg;
/**
* @return array
* 服务层 APP反汇编生成 执行驱动
*/
public function dirve(){
Debug::remark(__CLASS__);
$this->tool_path = ROOT_PATH.'tmp/tools/';
$this->resources_path = ROOT_PATH.'tmp/resources/';
$this->decompile_path = ROOT_PATH.'tmp/decompile/';
$this->apktmp_path = ROOT_PATH.'tmp/apktmp/';
$this->complete_nosign= ROOT_PATH.'tmp/complete_nosign/';
$this->apktool_framework=ROOT_PATH.'tmp/apktool_framework/';
$this->complete_sign = ROOT_PATH.'tmp/complete_sign/';
$this->jiagu360_path = ROOT_PATH.'tmp/jiagu360/';
$this->java_env_path='D:\env\jdk\bin\\';
// AOP 动作
$limit=1;
$mysql_result=AppBuilderTasks::where('status','
->order('create_time','desc')
->limit($limit)
->select();
if($mysql_result) {
foreach ($mysql_result as $item) {
$this->colony($item);
$this->save_log($item);//记录到日志
$this->task_lock($item,false,'u');
}
}else{
$this->msg[]='系统暂无任务';
}
return [
'running_time'=>Debug::getRangeTime(__CLASS__,null),
'memory_userd'=> Debug::getRangeMem(__CLASS__,null),
'exec_msg'=>$this->msg
];
}
/**
* @param $app_task 任务列队
* @return array
* 批量执行一个任务列队
* 防止用户恶意填写执行参数,或者系统自身错误。请把task_return 错误捕捉,记录到数据库。
*/
private function colony($app_task)
{
//列队锁
if(!$this->task_lock($app_task)){
$this->task_status($app_task,'0.1');
return false;
}
$this->task_lock($app_task,false,'w');//锁住
//资源存在?
if(!$this->resource_has($app_task['resource'])){
$this->task_status($app_task,'0.2');
return false;
}
//可读写??
if(!$this->write_file()){
$this->task_status($app_task,'0.3');
return false;
}
//解包
$this->task_status($app_task,'1.1');
if(!$this->decompile($app_task['resource'])){
$this->task_status($app_task,'1.2');
return false;
}
$this->task_status($app_task,'1.3');
$this->task_status($app_task,'2.1');
if(!$this->update_resource($app_task)){
$this->task_status($app_task,'2.2');
return false;
}
$this->task_status($app_task,'2.9');
$this->task_status($app_task,'3.1');
if(!$this->app_compile($app_task)){
$this->task_status($app_task,'3.2');
return false;
}
$this->task_status($app_task,'3.3');
$this->task_status($app_task,'4.1');
if(!$this->app_sign($app_task)) {
$this->task_status($app_task,'4.2');
return false;
}
$this->task_status($app_task,'4.3');
$this->task_status($app_task,'5.1');
if(!$this->jiagu_360_importsign('2727450911','sign2','2727450911')){ //导入东西
$this->task_status($app_task,'5.2');
return false;
}
$this->task_status($app_task,'5.3');
$this->task_status($app_task,'6.1');
if(!$this->jiagu_360_builder($app_task)){
$this->task_status($app_task,'6.2');
return false;
}
$this->task_status($app_task,'6.4');
//$this->jiagu_360_login('272745091@qq.com','');
//$this->jiagu_360_importsign('2727450911','sign2','2727450911');
// $this->jiagu_360_verifying_sign();
//$this->jiagu_360_builder($app_task);
return true;
}
/**
* @param $app_task
* @param $code
* 记录状态哦
*/
protected function task_status($app_task,$code){
AppBuilderTasks::update(['status'=>$code],['md5name'=>$app_task['md5name']]);
}
protected function save_log($app_task){
$log='';
if($this->msg==null){
return;
}
foreach ($this->msg as $msg){
$log.=$msg.'
';
}
AppBuilderTasks::update(['log'=>$log,'complete_time'=>date("Y-m-d H:i:s")],['md5name'=>$app_task['md5name']]);
}
/**
* 防止系统解包资源不存在
* @param $resource_name
* @return bool
*/
protected function resource_has($resource_name){
if(file_exists($this->resources_path.$resource_name)){
return true;
}
return false;
}
/**
* @param $resource_name
* @return bool 任务列队锁
*/
protected function task_lock($resource,$ischeck=true,$uw='w'){
if($ischeck!==true){
if($uw=='w'){
file_put_contents($this->resources_path.$resource['resource'].'.lock','任务锁定'.date("Y-m-d H:i:s"));
return true;
}else{
unlink($this->resources_path.$resource['resource'].'.lock');
return true;
}
}
if(file_exists($this->resources_path.$resource['resource'].'.lock')){
return false;
}
return true;
}
/**
* 检查 两个目录的权限
* @param $account
* @return bool
*/
protected function write_file(){
if(!file_put_contents($this->decompile_path.'test.txt','test')){
$this->msg[]='服务器内部权限问题!无法写入解包目录'.$this->decompile_path;
return false;
}
unlink($this->decompile_path.'test.txt');
if(!file_put_contents($this->apktmp_path.'test.txt','test')){
$this->msg[]='服务器内部权限问题!无法写入临时解包目录'.$this->apktmp_path;
return false;
}
unlink($this->apktmp_path.'test.txt');
return true;
}
/**
* 解压资源包文件夹
* @param $resource_name
* @param $account
* @return bool
*/
protected function decompile($resource_name){
//如果资源解包完成
$resource_name_name=str_replace('.','',$resource_name);
if(is_dir($this->decompile_path.$resource_name_name)){
$this->msg[]='ok';
return true;
}
//防止禁止了exec运行
if(in_array('exec',explode(',',ini_get('disable_functions ')))){
$this->msg[]='服务器内部权限问题!exec被禁止了';
return false;
}
//资源不存在添加文件夹包
if(!file_exists($this->decompile_path.$resource_name_name))
{
$this->msg[]='创建文件夹给与解包';
mkdir($this->decompile_path.$resource_name_name,0777,true);
}
if(!is_dir($this->decompile_path.$resource_name_name))
{
$this->msg[]='服务器内部权限问题!无法新建资源包目录'.$this->apktmp_path;
return false;
}
$resource_name=escapeshellarg ($this->resources_path.$resource_name); //原包资源路径
$decompile_tmp=escapeshellarg($this->decompile_path.$resource_name_name.'/');//解包文件夹
$cmd=escapeshellcmd($this->java_env_path.'java -jar '.$this->tool_path.'apktool.jar'.' d -f -s '.$resource_name.' -o '.$decompile_tmp.' -p '.$this->apktool_framework);
exec($cmd,$systemout);
if($systemout===1){
$this->msg[]='执行解原始包指令失败!';
return false;
}
return true;
}
/**
* 0创建任务->1开启解包->2进行修改器
* @param $resource_name
* @return bool
*/
protected function update_resource($resource){
return true;
}
/**
* 0创建任务->1开启解包->2进行修改器->3进行打包
* 进行打包 生成特定md5包名,保存到
*/
protected function app_compile($app_task){
$complete_nosign_md5nameAPK=$this->complete_nosign.$app_task['md5name'].'.apk';
$resource_name_name=str_replace('.','',$app_task['resource']);
$decompile_tmp=escapeshellarg($this->decompile_path.$resource_name_name.'/');//解包文件夹
$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'apktool.jar'.' b '.$decompile_tmp.' -o '.$complete_nosign_md5nameAPK.' -p '.$this->apktool_framework;
exec(escapeshellcmd($cmd),$systemout);
if($systemout===1){
$this->msg[]='生成初级包指令失败';
return false;
}
$this->msg[]='生成初级包指令成功';
return true;
}
/**
* 0创建任务->1开启解包->2进行修改器->3进行打包->4签名APP并且移动下载目录(完成)
*/
protected function app_sign($app_task){
$complete_nosign_md5nameAPK=$this->complete_nosign.$app_task['md5name'].'.apk';
$complete_sign_md5nameAPK=$this->complete_sign.$app_task['md5name'].'.apk';
$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'signapk.jar '.$this->tool_path.'sign.pem '.$this->tool_path.'sign.pk8 '.$complete_nosign_md5nameAPK.' '.$complete_sign_md5nameAPK;
exec(escapeshellcmd($cmd),$systemout);
if($systemout===1){
$this->msg[]='生成初级签名包指令失败';
return false;
}
$this->msg[]='生成初级签名包指令成功';
return true;
}
/**
* @param $username
* @param $passwd
* 360登陆
*/
protected function jiagu_360_login($username,$passwd){
$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar –login '.$username.' '.$passwd;
$cmd=escapeshellcmd($cmd);
exec($cmd,$sysout);
foreach ($sysout as $s){
if(strpos($s,'success')!==false){
$this->msg[]='360账号登陆成功';
}
}
}
/**
* @param $resource
* 360加固完毕
*/
protected function jiagu_360_builder($resource){
$this->tmp_false=false;
//$complete_sign_md5nameAPK=$this->complete_sign.$resource['md5name'].'.apk';
$complete_sign_md5nameAPK=$this->complete_nosign.$resource['md5name'].'.apk';
if(!file_exists($this->jiagu360_path.$resource['md5name'].'apk')){
mkdir($this->jiagu360_path.$resource['md5name'].'apk',0777,true);
}
$complete_360_jiaguAPK= $this->jiagu360_path.$resource['md5name'].'apk';
$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar -jiagu '.$complete_sign_md5nameAPK.' '.$complete_360_jiaguAPK.' -autosign -automulpkg';
exec($cmd,$system);
foreach ($system as $sys){
$sys= iconv('gbk','UTF-8',$sys);
if(strpos($sys,'#')!==false || strpos($sys,'下载进度')!==false || strpos($sys,'上传进度')!==false || $sys==''){
continue;
}
$this->msg[]='360加固->'.$sys;
if(strpos($sys,'任务完成')!==false){
$this->tmp_false=true;
}
}
return $this->tmp_false;
}
/**
* @param $resource
* 360导入签名
*/
protected function jiagu_360_importsign($key1,$aliasName,$aliaskey2){
$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar -importsign '.$this->tool_path.'sign.keystore '.$key1.' '.$aliasName.' '.$aliaskey2;
exec($cmd,$system);
foreach ($system as $sys){
if(strpos($sys,'signer saving succeed.')!==false){
$this->msg[]='360加固->签名导入成功!';
return true;
}
}
return false;
}
/**
* @return mixed
* 签名验证
*/
protected function jiagu_360_verifying_sign(){
$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar –showsign';
exec($cmd,$system);
return $system;
}
}