Android中java和smali转化一键化操作工具java2smali原理分析
来源:互联网 发布:sofifa数据库手机版 编辑:程序博客网 时间:2024/06/11 14:01
最近在小密圈中,有同学咨询到如何快速的将java文件转化成smali文件,因为我们知道在反编译之后都是smali代码,如果我们想进行代码插入,需要将java代码弄成smali代码,然后放进去,但是在这个过程中,比较麻烦,一般都是新建一个Android工程,然后编写需要插入的功能代码,然后在反编译得到smali代码。直接复制过去即可。
而在这个过程中,发现操作有点繁琐,比如我只想插入两个类,结果还得搞一个工程,自己纯手写smali代码也是不理智的,所以本文就来开发一款直接将java文件转化成smali代码的工具,主要原理思路也很简单:
- 第一步:javac命令编译java文件为class文件
- 第二步:dx命令将class文件转化成dex文件
- 第三步:使用baksmali工具将dex文件转化成smali文件
这里可以看到,其实没什么难度这个工具,但是对于后续操作是必须的。其中javac命令是java环境的,所有这个工具是必须依赖于java虚拟机环境的。dx命令其实是Android SDK自带的工具,但是为了方便,这里把dx命令的核心jar拷贝过来,直接运行dx.jar即可。baksmali工具是开源的,直接将dex文件转化成smali文件的。
上面说了大致的步骤,但是在每一步有一些问题需要解决,下面就来一一分析:
第一个问题:javac编译java文件的时候,有可能依赖于第三方jar包,而这里最为基础的就是系统包android.jar,所以这个必须可少,又因为可能有多个java文件,每个java文件之间会相互引用,为了避免编译错误,所以直接一次性编译所有的java文件,命令大致如下:javac -classpath android.jar \java\*.java 这个就是表示依赖android.jar包,来编译java目录下所有的java文件了。
所以我们可以把需要编译的java文件都放在一个指定目录下,然后使用这个命令编译出class文件即可。但是还需要注意一个问题,就是编译出来的class文件必须要在指定包名对应的目录下,不然后面使用dx命令编译会出问题,所以这里还需要解读每个java文件获取其对应的包名,然后根据包名新建对应的文件目录,最后再把对应的class文件拷贝过去即可。
第二个问题:dx命令转化dex文件的时候,因为我们直接引用了dx.jar文件的,而dx命令支持多个class文件编译成dex文件的,所以命令如下:java -jar dx.jar --dex --output=D:\classes.dex classes 这个表示编译出的dex文件保存在D盘的classes.dex,然后需要编译的所有class文件放在classes目录下。
第三个问题:baksmali命令转化smali文件,因为直接引用baksmali.jar文件的,所以命令很简单如下:java -jar baksmali.jar smalidir D:\classes.dex 这个就是把D盘的classes.dex文件反编译成smali文件放在smalidir目录中。
解决了这三个问题,那么工具代码就比较简单了,我们需要引用android.jar,dx.jar,baksmali.jar,可以把这三个jar工具包放在工具的lib目录下,然后所有的java源码保存在java目录下。下面来看一下大致代码实现:
第一步:编译java文件,然后进行拷贝
第二步:将class文件变成dex文件
第三步:将dex文件变成smali文件
工具真的非常简单,就是这三步即可,然后我们把工具打包成java2smali.jar放到指定目录下:
然后查看运行结果:
这个是对应的class文件目录结构,必须是其包名,而转化之后的smali目录结构也是如此:
这样我们就很轻松的获取到Utils.java对应的smali代码了,然后直接把这个smali代码拷贝到需要插入代码的app中即可,注意这里拷贝过去一定要包含包名目录,这里已经生成好了,所以直接从smali这级目录拷贝即可。
工具源码下载地址:https://github.com/fourbrother/java2smali
到这里我们的工具就开发完成了,是不是很简单,但是对于我们后面再进行插桩代码就很简单了,还记得之前我们使用静态方式破解app的时候,需要插入日志信息,那个时候我们需要新加几个类信息,当时的操作还是挺麻烦的,现在有了这个工具就非常简单了。
《Android应用安全防护和逆向分析》
点击立即购买:京东 天猫 亚马逊 当当
更多内容:点击这里
关注微信公众号,最新技术干货实时推送
扫一扫加小编微信
添加时请注明:“编码美丽”非常感谢!
添加时请注明:“编码美丽”非常感谢!
- Android中java和smali转化一键化操作工具java2smali原理分析
- Android中java和smali转化一键化操作工具java2smali原理分析
- android smali代码分析
- Android 静态分析 smali
- Smali和逆向分析
- Smali和逆向分析
- Smali和逆向分析
- Android apk编译/反编译工具baksmali和smali用法
- Android apk编译/反编译工具baksmali和smali用法
- android逆向分析中常用的smali注入代码
- android逆向分析之从smali到java
- baksmali和smali源码分析
- Android开发反编译工具-AXMLPrinter2,smali,baksmali
- Android:apk编译工具_baksmali和smali的使用说明和介绍
- baksmali和smali工具的使用
- android Smali静态分析(一)
- android Smali静态分析(二)
- android逆向分析之smali语法
- ansible-playbook 远程启动程序ansible结束后程序也被关闭
- 点击任意处都可触发拨打电话事件
- Java第二课:汉字的Unicode表位置
- Gradle打包src中的资源文件的配置方法(mapper.xml等)
- 实验三、链栈
- Android中java和smali转化一键化操作工具java2smali原理分析
- 实现一个函数判断year是不是润年。
- ssh的理解
- 欢迎使用CSDN-markdown编辑器
- [c# JAVA]类型转换集锦
- Spark开发环境搭建
- Linux实验二
- eclipse 注释时间显示格式
- 22 谓词推入(pushing predicate) --优化主题系列