5天搞定PHP goto解密核心算法

背景

有个朋友做了一个跨境商城小程序, 让我给加几个功能, 一个是收集用户的身份认证信息,一个是商品编辑与跨境商品关联.
就这么两个小的功能, 其实是很简单的,就是前台一个表单,后台数据库存一下就好了.
但是实际比预想的麻烦, 因为他用的是微擎的框架, 结果核心代码全是经过了goto加密的,说到这了,就讲一下php的加密问题.
php这种语言作为一种脚本语言, 代码保护一直以来是个问题, 见过好几个版本的加密, 其中最复杂的算是php官方的zend加密吧.
其他的都是自己创造的. 没有发现几个好的.
比如下面这种:

eval加密示例

5天搞定PHP goto解密核心算法
这种算是代码压缩后,eval加密,
这种解密非常简单, 就是把里面的代码base64解密,然后就出来了,没什么难度

goto加密示例
但是后来碰到了goto加密,结果就悲剧了,原理看起来挺简单,

5天搞定PHP goto解密核心算法
这种虽然能用编译器,比如phpstorm进行格式化,看里面的代码结构,但是要是真想能看里面的代码逻辑,可就是不name容易了
最后我花了5天时间,研究了一下,写出了解密的核心算法

这个解密的理论支撑是算法基础里面的, 有序无环拓扑排序问题

其实实际上这个是有环的
这里面有几个技术点
1.unicode解密
里面\x73\x2e这种的全是unicode加密的,
2.goto干扰问题
例如: goto a; goto b; 这种的 后面的goto b就是干扰项
return $a; goto c; 后面这个goto c也是不可能走到的
exit $e; goto d; 这种后面也是不可能走到的
3.goto限制条件解析
像 foreach, switch,try 这种都是一个封闭的解析范围,里面的 goto都是独立的封闭空间
要提前单独解析
4.分支干扰
里面的goto条件作了一些干扰,进行了翻转
比如: if(a) 这种, 实际看到的if(!a),这种是非正常写法的,要进行翻转
5.for循环的检测, for循环也是转换成了goto
6.if分支的解析
if 有好多分支 ,if, else, elseif ,if直接跳出,这些
7.代码的提取技术
要提取label
要提取出 function
提取出 foreach ,foreach里面还有嵌套的
8.代码格式化问题
如何对代码进行格式化,这也是个复杂点, 要对代码了解的非常清楚
以上是一些要点, 经过完善已经全部实现
最终实现了, 上传文件立马返回解密后的文件,是标准化的,无语法错误, 容易阅读的,
中间优化过程经历了好多困难;这个东西看起来简单,实际上做完美还是不容易;
先写到这吧, 之后会吧一些技术难点详细的跟大家分享.

上一篇:一篇文章理解Windows批处理文件


下一篇:Java学习,java流程控制-break、continue