吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 32716|回复: 26
收起左侧

[Android 原创] 破解 jar 包之直接修改 .class 文件方式

  [复制链接]
DeathMemory 发表于 2016-11-29 20:23
本帖最后由 DeathMemory 于 2016-11-29 20:59 编辑

一、常规 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 文件定位的相关函数处。
01.png
点击右边的相关指令可以跳转到指令查询页面:
02.png
可以看到 aload_0 对应的字节码为 0x2a。以此类推,查询到我们需要的特征指令对应的字节码。
指令:
[Asm] 纯文本查看 复制代码
aload_0
ifnonnull 6 (+5)
iconst_5
ireturn
aload_0
字节码
[Asm] 纯文本查看 复制代码
2a c7 xx xx 08 ac 2a (xx xx 是 ifnonnull 后面跟的 2 字节立即数)
用 010 Editor 打开 .class 文件,会自动加载其文件格式的 .bt 格式解析文件

3

3
通过jclasslib 我们知道目标函数在methods 函数表中的19号索引位置,用010找到相应的位置

4

4
通过 .class 文件结构我们知道,具体代码在 struct attribute_info attributes 里面 u4attribute_length 描述了代码区长度。接着下面给出了以1字节为单位的代码区数组。通过查询 attribute_info 结构体我们知道这里的 info 数组其实还包含了很多结构信息在里面,我们可以手工对应一下。
因为我们查看的是 Methods表 u2 attribute_name_index 通常指向的是 Code 结构体,表明这段结构体是 Code 结构体。看一下 Code 结构的说明:
[Asm] 纯文本查看 复制代码
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];
}

5

5
通过jd-gui 反编译时我们已经知道,这个函数返回的是一个Int型数值,函数体内做了一些判断处理,这里我们将把这个函数修改成直接返回我们需要的数值。
比如 return 1000;
上面这句话对应jvm 指令为:
[Asm] 纯文本查看 复制代码
sipush 1000
ireturn
对应的字节码是:
[Asm] 纯文本查看 复制代码
11 03 E8 AC (03 E8= 1000数字是高字节序)
修改完后的样子

6

6

然后,结构体后面多余的字节就可以直接删除了。
现在大功告成,将修改后的 .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 加密设定,如果有直接删除,再打包运行就可以了。
大大们有更好更简洁的方法还请不吝赐教!

免费评分

参与人数 10威望 +2 热心值 +10 收起 理由
zhuzaiting + 1 谢谢@Thanks!
ouyangjianping + 1 我很赞同!
cs4062562 + 1 热心回复!
372000 + 1 用心讨论,共获提升!
liuhiaipeng + 1 谢谢@Thanks!
qtfreet00 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
来自星星的我 + 1 感谢楼主提供教程,论坛就缺这个
多情自古空余恨 + 1 十分感谢,教了我整体思路
Freedom_XY_ + 1 s40改手机QQ的时候Halo是神器呀
caijunqill + 1 大神一出手就知有没有,期待大神后续教程

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| DeathMemory 发表于 2019-11-7 15:32
DecayEvent 发表于 2019-7-31 08:28
工具过时了,去国外找找JByteMod.jar可以直接加载jar包的class直接修改class然后保存

感谢提点!
 楼主| DeathMemory 发表于 2016-12-2 15:09
@burniegu 确实,如果纯手工去添加非常复杂的代码逻辑的话这样做就比较麻烦了。这时候可以用 @世事繁华皆成空 大大提到的 Javassist 库去操作字节码就方便多了。
JusonR 发表于 2016-11-29 21:22
hlrlqy 发表于 2016-11-29 21:28
注明下是安卓相关吧
caijunqill 发表于 2016-11-29 22:00
大神一出手就知有没有,期待大神后续教程
liangkaining 发表于 2016-11-29 22:08
看了我眼晕!哈哈不过我是新手,先混hb
wushishen 发表于 2016-11-29 23:31
我记得我以前改游戏的Jar内容,用的是压缩软件打开jar,直接改.class文件,保存,覆盖,好像只能小部分修改,有效果,很久没弄了。。
qtfreet00 发表于 2016-12-1 17:40
我都用javassit,是不是low爆了
passer 发表于 2016-12-2 13:05
666大神牛逼啊
burniegu 发表于 2016-12-2 13:15
改class的字节码好复杂,如果是小改动还好,如果改动大就更难了吧?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表