当前位置: 首页 > 工具软件 > goto > 使用案例 >

PHP goto语句加密的解密全过程(实战)

苗承
2023-12-01

PHP goto语句加密的解密全过程

网上发现一款相对简单功能全面的PHP源码,发货100自动发货系统
点击下载原模板演示
因为它不是一款完全免费的源码系统,若要开启全功能需要花费三百多到1000多不等,有兴趣可以去官网fahuo100.cn上面看一下。代码主体部分涉及的授权部分全部以goto语句写成了一个加密代码。如如下这段便是其中一小段代码:

function zcode($string){$E4kA0=!defined("jlBcRUJ");if($E4kA0)goto E4keWjgx9f;goto E4kldMhx9f;E4keWjgx9f:$E4keF0=call_user_func_array("define",array("jlBcRUJ","prSdesQ"));goto E4kx9e;E4kldMhx9f:E4kx9e:$E4keF0=call_user_func_array("explode",array("|=|D|T","H*|=|D|T454E434F4445|=|D|T666168756F3130302E636E"));unset($E4ktIA0);$GLOBALS[jlBcRUJ]=$E4keF0;unset($E4kcVvP1);if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9j;goto E4kldMhx9j;E4keWjgx9j:$E4kcVvP1=&$GLOBALS[jlBcRUJ][00];goto E4kx9i;E4kldMhx9j:$E4kcVvP1=$GLOBALS[jlBcRUJ][00];E4kx9i:unset($E4kcVvP2);if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9h;goto E4kldMhx9h;E4keWjgx9h:$E4kcVvP2=&$GLOBALS[jlBcRUJ][1];goto E4kx9g;E4kldMhx9h:$E4kcVvP2=$GLOBALS[jlBcRUJ][1];E4kx9g:$E4keFvP0=call_user_func_array("pack",array(&$E4kcVvP1,&$E4kcVvP2));unset($E4kcVvP6);if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9l;goto E4kldMhx9l;E4keWjgx9l:$E4kcVvP6=&$GLOBALS[jlBcRUJ][00];goto E4kx9k;E4kldMhx9l:$E4kcVvP6=$GLOBALS[jlBcRUJ][00];E4kx9k:$E4keFvP5=call_user_func_array("pack",array(&$E4kcVvP6,$GLOBALS[jlBcRUJ]{02}));$E4keF8=call_user_func_array("xcode",array(&$string,&$E4keFvP0,&$E4keFvP5,0));return $E4keF8;}

代码格式化

经过这样加密的代码段很长,很多,与乱码无异。为了方便观看,用在线格式化排列工具。这里百度一下了在线格式化工具,我这里用的是http://www.jsons.cn/phpformat/

function zcode($string) {
	$E4kA0=!defined("jlBcRUJ");
	if($E4kA0)goto E4keWjgx9f;
	goto E4kldMhx9f;
	E4keWjgx9f:$E4keF0=call_user_func_array("define",array("jlBcRUJ","prSdesQ"));
	goto E4kx9e;
	E4kldMhx9f:E4kx9e:$E4keF0=call_user_func_array("explode",array("|=|D|T","H*|=|D|T454E434F4445|=|D|T666168756F3130302E636E"));
	unset($E4ktIA0);
	$GLOBALS[jlBcRUJ]=$E4keF0;
	unset($E4kcVvP1);
	if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9j;
	goto E4kldMhx9j;
	E4keWjgx9j:$E4kcVvP1=&$GLOBALS[jlBcRUJ][00];
	goto E4kx9i;
	E4kldMhx9j:$E4kcVvP1=$GLOBALS[jlBcRUJ][00];
	E4kx9i:unset($E4kcVvP2);
	if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9h;
	goto E4kldMhx9h;
	E4keWjgx9h:$E4kcVvP2=&$GLOBALS[jlBcRUJ][1];
	goto E4kx9g;
	E4kldMhx9h:$E4kcVvP2=$GLOBALS[jlBcRUJ][1];
	E4kx9g:$E4keFvP0=call_user_func_array("pack",array(&$E4kcVvP1,&$E4kcVvP2));
	unset($E4kcVvP6);
	if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9l;
	goto E4kldMhx9l;
	E4keWjgx9l:$E4kcVvP6=&$GLOBALS[jlBcRUJ][00];
	goto E4kx9k;
	E4kldMhx9l:$E4kcVvP6=$GLOBALS[jlBcRUJ][00];
	E4kx9k:$E4keFvP5=call_user_func_array("pack",array(&$E4kcVvP6,$GLOBALS[jlBcRUJ] {
		02
	}
	));
	$E4keF8=call_user_func_array("xcode",array(&$string,&$E4keFvP0,&$E4keFvP5,0));
	return $E4keF8;
}

经过排列后,代码的规律也逐渐显现出来,比如里面大量发现有这样一句

$E4keF0=call_user_func_array("define",array("jlBcRUJ","prSdesQ"));

对call_user_func_array()功能了解的朋友应该就知道这句实际意义就是:

$E4keF0=define("jlBcRUJ","prSdesQ");

其中的goto语句如:

if(is_array($GLOBALS[jlBcRUJ]))goto E4keWjgx9j;
	goto E4kldMhx9j;
	E4keWjgx9j:$E4kcVvP1=&$GLOBALS[jlBcRUJ][00];
	goto E4kx9i;
	E4kldMhx9j:$E4kcVvP1=$GLOBALS[jlBcRUJ][00];
	E4kx9i:

经过逻辑分析发现其意义相当于:

if(is_array($GLOBALS[jlBcRUJ])) $E4kcVvP1=&$GLOBALS[jlBcRUJ][00];
	else $E4kcVvP1=$GLOBALS[jlBcRUJ][00];

也就相当于:

$E4kcVvP1=$GLOBALS[jlBcRUJ][00];

原来的代码便成为了:

    function zcode($string) {
	if(!defined("jlBcRUJ"))$E4keF0=define("jlBcRUJ","prSdesQ");
	else $E4keF0=explode("|=|D|T","H*|=|D|T454E434F4445|=|D|T666168756F3130302E636E");
	$E4kcVvP1=$GLOBALS[jlBcRUJ][00];
	$E4kcVvP2=$GLOBALS[jlBcRUJ][1];
	$E4keFvP0=pack($E4kcVvP1,$E4kcVvP2);
	$E4kcVvP6=$GLOBALS[jlBcRUJ][00];
	$E4keFvP5=pack($E4kcVvP6,$GLOBALS[jlBcRUJ] {02}	);
	$E4keF8=xcode($string,$E4keFvP0,$E4keFvP5,0);
	return $E4keF8;

这一段关键就看explode("|=|D|T",“H*|=|D|T454E434F4445|=|D|T666168756F3130302E636E”)的含义了。实际上它是一个数组Array(H*,454E434F4445,666168756F3130302E636E),而$GLOBALS[jlBcRUJ]即用来代表了这个数组,也就是说上面的代码实际上可以写成:

function zcode($string) {
	$E4keFvP0=pack("H*","454E434F4445");
	$E4keFvP5=pack("H*","666168756F3130302E636E");
	$E4keF8=xcode($string,$E4keFvP0,$E4keFvP5,0);
	return $E4keF8;
}

pack()里面表示的东西返回出来什么值我不知道,干脆就拿机器测试一下,结果就是:

function zcode($string) {
	$E4keFvP0="ENCODE";
	$E4keFvP5="fahuo100.cn";
	$E4keF8=xcode($string,$E4keFvP0,$E4keFvP5,0);
	return $E4keF8;
}

好吧,这段代码其实用一句就可以表达出来意思了,那就是:

function zcode($string) {
	return xcode($string,"ENCODE","fahuo100.cn",0);
}

为了让这一句代码让人看不懂什么意思,写代码的人可谓煞费苦心。

总结

goto加密会有一点防君子不防小人(指的可能就是我)的嫌疑,但是我还是要支持正版为底线的,这里的内容仅提供大家学习娱乐。整个源码我已经全部解密掉了,另外为了丰富其内容,在网站框架下添加了比特币等加密货币的支付功能,感兴趣的朋友可以去看一下

 类似资料: