一、常规 JAVA 软件破解流程

先讲一下常规jar包的破解流程。

1. 快速定位。

         1) 通过procmon监控相关软件,查看程序都访问了些啥。
         2) 用jd-gui反编译 jar 包,得到源码。
         3) 搜索关键字以定位。
这种定位方法只是千万种中的一种,根据不同软件的不同执行特性再具体实施不同的定位方案。

2. 修改破解。

1) 用 dex2jar 将 JAR 包转成 Dex 文件。
         2) 再将 Dex 解出 Smali。
         3) 修改 Smali 代码
         4) 将修改后的文件重新打包回 Dex
         5) 最后转成 JAR 包,破解完成。
 

二、直接修改 .class 字节码的方式实现破解

上面的方式基本已经可以解决破解JAR包的需求。但最近研究了一下直接修改.class 字节码的形式来实现修改程序流程的方法,总有会用得上的应用场景的。下面进入正题。
很多时候别人的 jar 包,反编译过来后是没办法直接用Eclipse创建java 工程再编译通过的。各种引用及反编译带来的错误会让人抓狂。既然破解的关键点已经找到了,我们可以不可以直接修改.class 字节码以实现破解呢,答案是肯定的。
此处省略定位环节,不是本文重点。
 

准备工具

1.      jclasslib 源码地址:https://github.com/ingokegel/jclasslib
2.      010 Editor 神器不多说
 

参考资料

1.      The class file format
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.6
2.      中文版Class文件结构
http://gityuan.com/2015/10/17/jvm-class-instruction/
 

Start

假设通过反编译我们已经知道了关键代码的位置。
知道函数路径后,用jclasslib 打开 .class 文件定位的相关函数处。
<ignore_js_op>
点击右边的相关指令可以跳转到指令查询页面:
<ignore_js_op>
可以看到 aload_0 对应的字节码为 0x2a。以此类推,查询到我们需要的特征指令对应的字节码。
指令:
[Asm] 纯文本查看 复制代码
1
2
3
4
5
aload_0
ifnonnull 6 (+5)
iconst_5
ireturn
aload_0
字节码
[Asm] 纯文本查看 复制代码
1
2a c7 xx xx 08 ac 2a (xx xx 是 ifnonnull 后面跟的 2 字节立即数)
用 010 Editor 打开 .class 文件,会自动加载其文件格式的 .bt 格式解析文件
<ignore_js_op>
通过jclasslib 我们知道目标函数在methods 函数表中的19号索引位置,用010找到相应的位置
<ignore_js_op>
通过 .class 文件结构我们知道,具体代码在 struct attribute_info attributes 里面 u4attribute_length 描述了代码区长度。接着下面给出了以1字节为单位的代码区数组。通过查询 attribute_info 结构体我们知道这里的 info 数组其实还包含了很多结构信息在里面,我们可以手工对应一下。
因为我们查看的是 Methods表 u2 attribute_name_index 通常指向的是 Code 结构体,表明这段结构体是 Code 结构体。看一下 Code 结构的说明:
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Code_attribute{
    u2 attribute_name_index;
    u4 attribute_length;
    u2 max_stack;
    u2 max_locals;
    u4 code_length;
    u1 code[code_length];
    u2 exception_table_length;
    {  u2 start_pc;
        u2 end_pc;
        u2 handler_pc;
        u2 catch_type;
    } exception_table[exception_table_length];
    u2 attributes_count;
    attribute_infoattributes[attributes_count];
}
<ignore_js_op>
通过jd-gui 反编译时我们已经知道,这个函数返回的是一个Int型数值,函数体内做了一些判断处理,这里我们将把这个函数修改成直接返回我们需要的数值。
比如 return 1000;
上面这句话对应jvm 指令为:
[Asm] 纯文本查看 复制代码
1
2
sipush 1000
ireturn
对应的字节码是:
[Asm] 纯文本查看 复制代码
1
11 03 E8 AC (03 E8= 1000数字是高字节序)
修改完后的样子
 
<ignore_js_op>
然后,结构体后面多余的字节就可以直接删除了。
现在大功告成,将修改后的 .class 文件替换原来的就可以了。
 

需要注意的细节坑

1.      010 Editor在解析 .class 常量池数组时对 01 0000 (空的 CONSTANT_Utf8 类型)的支持不好,可能导致出错。调试时可以先将出错的这三个字节码删除,并对应修改constant_pool_count 常量池个数,再按 F5 重新解析。
注意:此时索引的序号指向可能是错的,可以结合 jclasslib 查看对应值。
2.      重新打包 JAR 包,运行时提示"AWT-EventQueue-0" java.lang.SecurityException: SHA-256 digesterror for ***.class 。查看Manifest文件看看有没有RSA 加密设定,如果有直接删除,再打包运行就可以了。
 
大大们有更好更简洁的方法还请不吝赐教!

破解 jar 包之直接修改 .class 文件方式的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. 关于压缩jar包时提示*.*没有这个文件或目录的问题以及解决办法:

    关于压缩jar包时提示.没有这个文件或目录的问题以及解决办法: 问题描述: 我在打包jar时,CMD中进入到包的上一层目录. 在命令提示符中输入 提示如下: 从提示中可知没有找到我们想要打包的clas ...

  3. Springboot 打jar包分离lib,配置文件正确方式(二)

    Springboot 打jar包分离lib,配置文件正确方式(二) 背景 从<Springboot 打jar包分离lib,配置文件正确方式>中,可以达到把配置文件和依赖第三方的jar包分离 ...

  4. 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!

    修改jar包配置文件的正确操作,有的时候通过一些解压工具可以对内部的文件进行修改,但是有时候会无效.这就很烦了 一.背景:       有一个springboot项目,事先我已经用编译好打成jar包以 ...

  5. 破解jar包5步搞定,jira7.9.2操作成功,附github代码库

    1,从要破解的程序中拷贝.jar包文件,运行1_jar.sh将其解压.以jira7.9.2为例: $install_dir\JIRA\atlassian-jira\WEB-INF\lib\atlass ...

  6. Maven pom.xml 配置说明: 打jar包不包括指定资源文件和.class xml,配置不跑testCase,建pom父子项目

    **maven如何配置打jar包时,一些class 或者资源文件不打进来,把classpath的xml文件打进jar <build> <!--针对资源文件--> <res ...

  7. JAR包结构,META-INF/MANIFEST.MF文件详细说明[全部属性][打包][JDK]

    转载请注:[https://www.cnblogs.com/applerosa/p/9736729.html] 常见的属性 jar文件的用途 压缩的和未压缩的 jar工具 可执行的JAR 1.创建可执 ...

  8. java项目部署之后,Jar包中配置文件修改

    Java项目发布时,配置文件不像.net项目一样与工程路径保持一致,而是直接包含在了jar包中,此时要修改就没那么方便了,我们可以将配置文件从jar包抽离出来,修改完之后再写入Jar包即可, 也没那么 ...

  9. 如何解决本地mvn编译安装的jar包在IDEA的pom文件中找不到

    在IDEA中maven作为一个内置的工具,不需要任何配置就可以使用,点开settings 可以看到有三个maven可以选择 C:/apache-maven-3.5.3这个maven当然是我自己安装的, ...

随机推荐

  1. redisTemplate实现轻量级消息队列, 异步处理excel并实现腾讯云cos文件上传下载

    背景 公司项目有个需求, 前端上传excel文件, 后端读取数据.处理数据.返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没 ...

  2. vmrun 批量创建vmware虚拟机

    1 准备模板机 具体步骤如下: 1. 下载镜像安装系统 https://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/ 2. 安装完成配置好IP ,关闭 ...

  3. Chapter 3 Phenomenon——24

    My mom was in hysterics, of course. 我的母亲当时是歇斯底里的发疯了. I had to tell her I felt fine at least thirty t ...

  4. 第三方登录:新浪微博登录(OAuth2.0)

    在<Github第三方登录--通用化的第三方登陆实现>中我们实现了一个通用化的第三方登录框架,其中包括OAUth的基本流程以及最简单的用户注册.但是不同的第三方登录因为其细节不同还是有很多 ...

  5. 揭开Future的神秘面纱——结果获取

    前言 在前面的两篇博文中,已经介绍利用FutureTask任务的执行流程,以及利用其实现的cancel方法取消任务的情况.本篇就来介绍下,线程任务的结果获取. 系列目录 揭开Future的神秘面纱—— ...

  6. SAP HANA项目过程中优化分析以及可行性验证

    在项目开发过程中,经常会遇到HANA模型运行效率的问题: 以我们项目为例,HANA平台要求模型运行时间不能超过10秒,但是在大数量和计算逻辑复杂的情况下(例如:ERP中的BKPF和BSEG量表的年数据 ...

  7. C++11 Lambda表达汇总总结

    C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda的语法形式如下:               [函数对象参数] (操作符重载函数参数) mutable或ex ...

  8. JS DOM操作(四) Window.docunment对象——操作内容

    操作内容:即对标签所夹内容的操作 一 非表单元素内容操作 定位 var a = document.ElementById( "id" ) 1.获取内容 var s = a.inne ...

  9. HTML 初识 HTML【 整体结构 文字 图片 表格 超链接】

    HTML        超文本标记语言,页面内可以包含图片.链接,甚至音乐.程序等非文字元素.       网页的本质就是超级文本标记语言,万维网是建立在超文本基础之上的.TML 通过标记符号来标记要 ...

  10. 4.socket(-)之控制台

    一Socket介绍: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API) ...