Android中java和smali转化一键化操作工具java2smali原理分析

Android技术篇 尼古拉斯.赵四 11573℃

最近在小密圈中,有同学咨询到如何快速的将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原理分析

喜欢 (13)or分享 (0)