微信反编译 源码-SpringBoot玩转代码混淆,避免反编译代码泄露

点击关注公众号,Java干货及时送出

来源:blog.csdn.net/qq_35387940/article/details/127426354

编译

简单就是运行代码,然后我们的代码.java文件被编译成.class文件

图片反编译

就是逆向还原编译生成的jar/war包上的.class文件,就可以看到你的代码写了什么。

比较常用的反编译工具JD-GUI直接把编译好的jar丢进去,大部分都可以反编译看源码

微信反编译 源码-SpringBoot玩转代码混淆,避免反编译代码泄露

图片

那么如果你不想反编译你为别人写的代码怎么办?

怎么做?

来迷惑

本文中的代码混淆就是手段之一。

我会告诉你,但你反编译并听到的并不是真正的代码。

让我们看一下治疗效果的示例图表:

微信反编译 源码-SpringBoot玩转代码混淆,避免反编译代码泄露

图片

文本

我们先看一下我们混淆的一个项目的代码。 我们应该做什么?

图片一共两步

第一步,在项目路径下添加一个文件 proguard.cfg:

混淆器配置文件

#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings
 
#对异常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此选项将保存接口中的所有原始名称(不混淆)-->
-keepnames interface ** { *; }
# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {
                        @org.springframework.context.annotation.Bean *;
                        @org.springframework.beans.factory.annotation.Autowired *;
                        @org.springframework.beans.factory.annotation.Value *;
                        @org.springframework.stereotype.Service *;
                        @org.springframework.stereotype.Component *;
                        }
 
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keep public class com.example.myproguarddemo.MyproguarddemoApplication {
        public static void main(java.lang.String[]);
    }

微信反编译 源码-SpringBoot玩转代码混淆,避免反编译代码泄露

当心:

图片

剩下的看注释,可以配置哪些类不参与混淆微信反编译 源码,哪些枚举保留,哪些方法名不混淆等等。

第二步,在pom文件中添加proguard混淆插件:

更改构建标签上方并添加一些配置


    
        
            com.github.wvengen
            proguard-maven-plugin
            2.6.0
            
                
                
                    package
                    
                        proguard
                    
                
            
            
                
                ${project.build.finalName}.jar
                
                ${project.build.finalName}.jar
                
                true
                
                ${project.basedir}/proguard.cfg
                
                
                    ${java.home}/lib/rt.jar
                    ${java.home}/lib/jce.jar
                    ${java.home}/lib/jsse.jar
                
                
                !META-INF/**,!META-INF/versions/9/**.class
                
                ${project.basedir}/target
                
                
                    
                
            
        
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                
                    
                        repackage
                    
                    
                        com.example.myproguarddemo.MyproguarddemoApplication
                    
                
            
        
    

当心:

图片

图片

然后你可以看到:

图片

然后点击package,正常执行编译打包过程:

图片

之后就可以看到jar的生成:

图片

看看效果

图片

好了,这就是本文的全部内容。

推荐阅读

最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

PS:由于公众号平台修改了推送规则微信反编译 源码,如果不想错过内容,看完后记得点“正在看”,加个“星”,这样每次有新文章推送的时候,将会尽快出现在您的订阅列表里面。 点击“在看”支持我,谢谢!

没有更锋利的矛,盾牌永远不会变得更强。 软件的加密和解密技术是一样的。 只有了解秘密才能更好地加密。 一个不熟悉对手的战士不会有太多胜利的机会,而一个不熟悉泄密技术的软件开发人员会很难开发出不易被攻击的防护技术。

大多数人可能认为揭露秘密是一门高深的学问。 其实,这是因为当时这方面的技术资料匮乏,接触的人也很少,所以“破译”的知识就显得过于神化了。 解密上手并不难。 您需要一些基础知识和一些材料才能轻松入门。 学会揭秘,建议把握:

必须学习汇编语言;

掌握至少一门中间语言;

最好掌握Win32编程,Win32编程是Windows编程的API方法,学习Windows API会让你更深入地了解Windows是如何工作的。 此类书籍包括 Charles Petzold 的《Windows 编程》(用 C 语言解释)。

如果你有精力,看看《Windows核心编程》之类的书,相信会对你的内功大增。

有了这个基础,再参考《加密与解密》这本书,你就会打开解开秘密的大门。

解密技术涉及的内容比较广泛,这里只是简单探讨一下破解者的操作方式——静态分析技术和动态分析技术。

1. 静态分析

高级语言的程序编译有两种方式,一种是编译成机器语言并在CPU上执行,如Visual C++、PASCAL等。由于机器语言之间几乎是一一对应的和汇编语言一样,机器语言可以转换成汇编语言。 这个过程称为反汇编(Disassembler)。 另一种高级语言是在解释时执行的,称为解释型语言。 如Visual Basic、Visual FoxPro、.net系列等,用此类语言编译的程序可以恢复到高级语言的原始结构。 这个过程称为反编译(Decompiler)。

所谓静态分析,就是从反汇编的程序列表中分析程序流程,了解有关模块完成的功能。

1.拆解

编译执行型语言由于直接与CPU的指令集打交道,因此具有很强的指令依赖性和系统依赖性,但编译型程序的执行效率却比解释型语言高很多,比如今天的VC等。非常好的编译语言。

例如下面的VC程序:

TCHAR szBuffer[30]={0};

TCHAR cCode[30]={0};

...

案例IDC_OK:

GetDlgItemText(hDlg,IDC_TXT1,cCode,sizeof(cCode)/sizeof(TCHAR)+1);

wsprintf(szBuffer,TEXT("%ld"),123);

if(lstrcmp(cCode, szBuffer)==0)

MessageBox(NULL, TEXT ("注册成功!"), TEXT ("恭喜您!"), 0) ;

休息;

这个程序经过VC编译器编译后,会被做成机器语言程序,然后就可以在机器上执行了。 由于是机器语言,直接分析是不可能的。 不过,解密者可以使用反汇编工具,例如IDA pro,将二进制机器语言反汇编为汇编代码,并在汇编代码级别分析程序的功能。 例如,在x86系统中,机器码“0xEB”对应的汇编语句是“jmp Short xx”。

这段汇编代码如下:

如果你有一定的汇编语言基础vb反编译 源码,再掌握一些逆向分析技术,上面的汇编代码的功能就很容易理解了。 一般来说,编译成本地机器语言后,工具无法直接恢复源代码。 不过,有了IDA Pro这个非常专业的反汇编工具,结合分析人员的编程知识,这样用Win SDK开发的程序就比较容易手动反编译成C源代码。

2.反编译

解释型语言在编译过程中,其程序代码并不直接转换为计算机可识别的二进制代码,而只是生成中间代码。 目的不是让计算机直接执行,只是为了早期的句型检测。 这些代码被放置在显存的“数据段”中,类库在运行时动态解释存储在“数据段”中的伪代码。 因此,可以看出,很多伪编译程序都有很大的DLL文件,如Visual Basic、Visual FoxPro、Power Builder、Java、.net等。其解释执行语言由于其类库,实现起来比较简单。不需要直接处理机器码,很容易在不同平台上移植。 解释型语言编译出来的代码实际上是“变形的源代码”。 只要能了解其相应的机制,就可以制作反编译器。 用此类语言编译的程序可以恢复到高级语言的原始结构。 这个过程称为反编译(Decompiler)。

目前VB3、Visual FoxPro、Power Builder、Java等语言都可以反编译成原来的编译语言。

.net也是一种解释性语言,只是将名称改为“中间语言(Microsoft Intermediate Language)”。 如果你用IDA反汇编这种程序,你会听到莫名其妙的代码vb反编译 源码,因为它不再是传统意义上的汇编代码。 只有P代码反编译器才能从语言助记符中得到正确的代码。 了解程序的功能。

2. 动态分析

所谓动态跟踪主要是指借助系统级调试器OllyDbg、WinDbg或Visual C++自带的调试器进行一步一步的跟踪分析。

为什么要进行软件动态分析? 这主要是因为:

虽然可以静态地了解各个模块的功能以及整个软件的编程思想,但不可能真正了解软件中各个模块的技术细节。 对于被分析的软件来说,静态分析只是工作的第一步,动态跟踪才是分析软件的关键。

其次,很多软件作为一个整体完成的功能一般需要分解为若干个模块来完成,而后一个模块执行时往往需要使用前一个模块处理的结果。 我们将此结果称为中间结果。 如果我们仅仅静态地分析软件本身,一般很难分析这样的中间结果。 这个结果只能通过跟踪前一个模块的执行才能看到。 另外,在程序运行过程中,某个地方常常会出现很多分支和转移,而不同的分支和转移往往需要不同的条件,而这样的条件通常是通过在分支之前运行程序而形成的。 如果想知道程序运行到哪个分支时,不进行动态跟踪和分析是不可能知道的。

第三,当很多软件运行时,程序的初始执行往往需要对软件旁边的各个模块进行一些初始化工作,而不依赖于系统的重定位。

最后,为了防止非法跟踪和读取,许多加密程序对大部分执行代码进行了加密和变换,只有一小部分程序是明文。 加密程序运行时采用逐块解密、逐块执行的技术。 首先,运行初始明文程序。 在运行过程中,程序不仅需要完成停止跟踪的任务,还负责泄露下一块密码。 。 显然,如果不对软件进行动态跟踪分析,仅靠拆解软件的密码部分是不可能泄密的。

由于Win32程序采用比较简单的平面轮询方式进行显存轮询,并且Win32程序调用系统提供的大量API,并且Win32平台上的调试器具有强大的为API设置断点的功能,因此该功能很重要。 给动态跟踪和破解带来了极大的方便。 因为程序的作者使用的是高级语言,而Windows提倡“透明”,它并不想让程序员知道底层的操作,而只是给他们提供了高级的socket,相当多的中间函数调用了某个低级函数。 因此,解密者经常在底层函数中设置断点。 所以在Windows中,只要使用了Windows功能,就更难弄清楚要向任何寻找线索的人隐藏什么。

看雪公开测试:

参见雪论坛:

-----微信ID:ikanxue-----

看雪安全16年关注安全,专业为您服务!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 微信反编译 源码-SpringBoot玩转代码混淆,避免反编译代码泄露 https://www.wkzy.net/game/127903.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务