您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
92_如何反编译别人的代码&怎么去防止自己的程序被别人反编译
发布时间:2021-03-30 17:49:49编辑:雪饮阅读()
资源的反编译
apk文件其实本质就是一个zip压缩包。例如这里将昨天用于以代码进行安装应用程序时候所依赖的sdcard目录的这个apk,我们直接复制一份名追加.zip为文件名,就可以直接解压了。
可以看到解压后里面就有了原来的像是清单、布局这类资源文件,但是会发现这些文件用文本类应用程序打开是加密的无法看懂。
好吧,那么这次就要来反编译它们了,首先解压apktool1.4.1.tar.bz2得到apktool.jar,解压apktool-install-windows-r04-brut1.tar.bz2得到aapt.exe、apktool.bat,然后将这三个文件放置于同一个目录如C:\Users\Administrator\Desktop\decode\apktool1.4.1中。然后进入命令行,反编译命令如:
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool d C:\Users\Administrator\Desktop\decode\app-release.apk testDir
该命令中d即decode,后面跟上一个apk的路径,apk路径后面再根上一个希望反编译之后将apk反编译之后的文件的输出目录。若不指定,则默认是输出到apktool(apktool.bat)所在目录的与apk文件同名目录例如app-release.apk的话,就是在app-release下,无论指定或不指定,指定目录或默认这个目录不存在都会自动创建。
当第一次进行反编译的时候可能会出现如下弹窗,确定即可
好吧,这里反编译失败了
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool d C:\Users\Administrator\Desktop\decode\app-release.apk testDir
I: Baksmaling...
Exception in thread "main" java.lang.RuntimeException: bad magic value: 64 65 78 0a 30 33 39 00
at org.jf.dexlib.DexFile.<init>(DexFile.java:377)
at org.jf.dexlib.DexFile.<init>(DexFile.java:274)
at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:48)
at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:33)
at brut.androlib.Androlib.decodeSourcesSmali(Androlib.java:68)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:85)
at brut.apktool.Main.cmdDecode(Main.java:120)
at brut.apktool.Main.main(Main.java:57)
在网络上查询相关资料好像是高版本的apk,有了所谓的加壳保护。
如何反编译过一次后,然后直接再次反编译,输出目录参数一样时候会提示你输出目录已存在。如果要覆盖目标输出目录要使用-f参数
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool d C:\Users\Administrator\Desktop\decode\app-release.apk testDir
Destination directory (C:\Users\Administrator\Desktop\decode\apktool1.4.1\testDir) already exists. Use -f switch if you want to overwrite it.
这个所谓的-f参数是有顺序的,要正好在apk资源前面(个人实践总结,可能还有其它技术细节),这里我测试过直接放在apk资源后面就会给我创建了输出目录“-f”…,而如果是放在d参数前面,又会抛出该命令的帮助信息。。。
正常使用:
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool d -f C:\Users\Administrator\Desktop\decode\app-release.apk
I: Baksmaling...
Exception in thread "main" java.lang.RuntimeException: bad magic value: 64 65 78 0a 30 33 39 00
at org.jf.dexlib.DexFile.<init>(DexFile.java:377)
at org.jf.dexlib.DexFile.<init>(DexFile.java:274)
at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:48)
at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:33)
at brut.androlib.Androlib.decodeSourcesSmali(Androlib.java:68)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:85)
at brut.apktool.Main.cmdDecode(Main.java:120)
at brut.apktool.Main.main(Main.java:57)
在d参数之前:
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool f d C:\Users\Administrator\Desktop\decode\app-release.apk
Apktool v1.4.1 - a tool for reengineering Android apk files
Copyright 2010 Ryszard Wi?niewski <brut.alll@gmail.com>
Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
Usage: apktool [-v|--verbose] COMMAND [...]
COMMANDs are:
d[ecode] [OPTS] <file.apk> [<dir>]
Decode <file.apk> to <dir>.
OPTS:
-s, --no-src
Do not decode sources.
-r, --no-res
Do not decode resources.
-d, --debug
Decode in debug mode. Check project page for more info.
-f, --force
Force delete destination directory.
-t <tag>, --frame-tag <tag>
Try to use framework files tagged by <tag>.
--keep-broken-res
Use if there was an error and some resources were dropped, e.g.:
"Invalid config flags detected. Dropping resources", but you
want to decode them anyway, even with errors. You will have to
fix them manually before building.
b[uild] [OPTS] [<app_path>] [<out_file>]
Build an apk from already decoded application located in <app_path>.
It will automatically detect, whether files was changed and perform
needed steps only.
If you omit <app_path> then current directory will be used.
If you omit <out_file> then <app_path>/dist/<name_of_original.apk>
will be used.
OPTS:
-f, --force-all
Skip changes detection and build all files.
-d, --debug
Build in debug mode. Check project page for more info.
if|install-framework <framework.apk> [<tag>]
Install framework file to your system.
For additional info, see: http://code.google.com/p/android-apktool/
在apk资源后面:
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool d C:\Users\Administrator\Desktop\decode\app-release.apk -d
I: Baksmaling...
Exception in thread "main" java.lang.RuntimeException: bad magic value: 64 65 78 0a 30 33 39 00
at org.jf.dexlib.DexFile.<init>(DexFile.java:377)
at org.jf.dexlib.DexFile.<init>(DexFile.java:274)
at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:48)
at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:33)
at brut.androlib.Androlib.decodeSourcesSmali(Androlib.java:68)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:85)
at brut.apktool.Main.cmdDecode(Main.java:120)
at brut.apktool.Main.main(Main.java:57)
C:\Users\Administrator\Desktop\decode\apktool1.4.1>dir
驱动器 C 中的卷是 系统
卷的序列号是 648D-152C
C:\Users\Administrator\Desktop\decode\apktool1.4.1 的目录
2021/03/30 17:12 <DIR> .
2021/03/30 17:12 <DIR> ..
2021/03/30 17:12 <DIR> -d
回到正题,既然这个apk,这里不能直接反编译,那么久拿几年前的一个apk来试试吧。这里选用了之前一个很火的游戏“雪饮狂刀”来反编一下试试。
C:\Users\Administrator\Desktop\decode\apktool1.4.1>apktool d -f C:\Users\Administrator\Desktop\decode\xykd.apk xykd
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Loading resource table from file: C:\Users\Administrator\apktool\framework\1.apk
I: Loaded.
I: Decoding file-resources...
I: Decoding values*/* XMLs...
I: Done.
I: Copying assets and libs...
还是可以的,真的给成功反编译出来了,不是加密的了
类文件的反编译
在刚才直接解压一个apk文件后会发现里面有一个classes.dex。这里面包含了java的类文件,那么这个类文件同样也是加密的
那么这里还是以上面的xykd这个apk为例,再来反编译下这个类文件,先解压dex2jar-0.0.7.11-SNAPSHOT后得到dex2jar工具,一个用于将蔗渣classes.dex反编译为.jar文件,而生成的.jar文件中就是原来的项目中所有逻辑,包含我们开发时候自己编写的一些.java文件。
那么这里进行反编译命令如:
C:\Users\Administrator\Desktop\decode\apktool1.4.1>C:\Users\Administrator\Desktop\decode\dex2jar-0.0.7.11-SNAPSHOT\dex2jar-0.0.7.11-SNAPSHOT\dex2jar C:\Users\Administrator\Desktop\decode\xykd.apk~1\classes.dex
虽然运行了一会儿会儿最后还是有不少错误
但是classes_dex2jar.jar文件产出了,这个文件就是这个反编译类文件工具之后所生成的。
C:\Users\Administrator\Desktop\decode\apktool1.4.1>dir
驱动器 C 中的卷是 系统
卷的序列号是 648D-152C
C:\Users\Administrator\Desktop\decode\apktool1.4.1 的目录
2021/03/30 17:28 <DIR> .
2021/03/30 17:28 <DIR> ..
2021/03/30 17:12 <DIR> -d
2011/05/15 23:23 5,445,617 aapt.exe
2010/09/04 00:13 69 apktool.bat
2011/05/16 02:36 2,312,482 apktool.jar
2021/03/30 17:07 <DIR> app-release
2021/03/30 17:27 376,566 classes_dex2jar.jar
2010/08/18 08:02 726,528 jd-gui.exe
2021/03/30 16:51 <DIR> testDir
2021/03/30 16:57 <DIR> testDir2
2021/03/30 17:13 <DIR> xykd
5 个文件 8,861,262 字节
7 个目录 46,146,990,080 可用字节
一般的此时,打开jd-gui.exe然后将上面这个classes_dex2jar.jar拖拽进去后就可以查看到反编译过后的所有逻辑文件.java
从这里可以看到这个反编译出来的结果不理想,类名都是很随意的,据说这个是混淆加密的效果。其实这个倒是无所谓,逻辑是不会变的,只是各种类名或方法名等混淆了视线,如果项目比较小,或者非常有毅力有决心,这些都能慢慢整理摸索出线索并完成最后的真正意义上的反编译。但这里关键是刚才反编译过程中出现了错误。那么好吧,这里再试试一开始我们所用的昨天那个在sdcard根目录的apk的classes.dex。
C:\Users\Administrator\Desktop\decode\apktool1.4.1>C:\Users\Administrator\Desktop\decode\dex2jar-0.0.7.11-SNAPSHOT\dex2jar-0.0.7.11-SNAPSHOT\dex2jar C:\Users\Administrator\Desktop\decode\app-release.apk~1\classes.dex
好吧,这个报错更多,几乎是满屏的
但好在最后反编译的结果看起来比刚才xykd.apk更理想,这些代码大致一看好像的确就是自己之前缩写的一模一样。
总结起来感觉这些东西要交错着进行使用,单靠一个工具是不行的。
如何防止自己的程序被别人反编译
这个话题,根据上面反编译的过程中,可以知道最重要的应该就是加壳了。还有就是混淆加密增加难度。当然还会有一些防止反编译的手段了,不过反编译与加密混淆、加壳这些东西都是攻防相克,安全和反安全一直在相互的促进。没有放诸四海而皆准的方案。还需要各自根据自己情况多去了解这些方面的资料信息,才能更好的反编译或者防止别人反编译。
关键字词:android,反编译,加壳,混淆加密