新人第一次发帖,有啥违规的地方麻烦各位指出一下,我看到了一定立马修改。
首先感谢@Ganlv 大大的教程给了我思路,输出伪汇编代码再分析,让逆向工作从不停的下断点调试中解脱出来。
咳、其他的感谢词就不说了,小子在这里给各位坛友拜个小年,祝各位坛友在新的一年里学习日益精进,生活美满团圆。
0x0 开整。
首先拿到了个样本文件:样本.zip
解压打开后发现全是乱码,遂上php-parser,用的format脚本是这一个:
[PHP] 纯文本查看 复制代码"""header_info = header_info.replace('{json_data}', json_data).replace('{var_list}',', '.join(list(var_dict)[0:-1])).encode()with open(php_file_path[:-3]+'decode.php', 'wb') as f: f.write(header_info) f.write(temp_file)
如果电脑上没装python3环境的话得装一个,之后运行
[Shell] 纯文本查看 复制代码python parser.py
然后输入上面格式化好的PHP文件路径回车即可生成以.decode.php结尾的修复好变量名并劫持了eval到自定义函数s_eval的文件。
用编辑器打开这个文件,里面被编码的那段虚拟机内运行的代码依然是乱码,这里可以切换文件编码到ISO 8859-1来编辑,npp修改的方式如下图:
这个文件内有两个VM,我们现在只研究第一个VM,因此第二个函数内的VM相关变量代码都可以删掉。之后到第一个VM那段乱码的下面一行加入file_put_contents('pec.vmc',$_var_6);,把虚拟机内部执行的代码另存为出来,之后修改文件,删掉判断VM内执行代码是否加载的部分并美化,即可得到下面的文件:
初步处理后的文件.zip
之后便可以开始研究了。
在程序代码中咱们可以找到这样一句明文:KIVIUQ VIRTUAL MACHINE ERROR : Access violation at address ,于是咱便可以搜索这一句话里面的前几个词找到一个别人破解的资料,但是他的那个代码感觉写的有点不好,而且弄的很乱,因此咱们可以参照他的研究结果按照自己的喜好修复变量名变可读,以及将相关部分自行实现,完成自己的需求。
通过阅读switch可得知,case 1,2,3的时候实际上是设置临时变量数值,a是pop,b是花指令,c是push null,d是啥没搞懂,e是将字符串变为函数指针,f是push 字符串到$memory,emmm这段我可能说的不大明白,因此我建议您对照底下我修改完成的的调试代码来理解。
因为在虚拟机运行过程中程序没有输出,因此我们要在各个地方插桩输出日志,因此理解了各个case是干啥的再在对应的地方设置一下就好了。
[PHP] 纯文本查看 复制代码 |