资讯专栏INFORMATION COLUMN

用 Smali 手写一个可运行的 HelloWorld!!!

Panda / 854人阅读

摘要:有些工具如果不方便下载原因你懂的,可以在承香墨影公众号回复工具进行下载,可以下载到本文所有涉及到的资源文件。更多反编译的细节,可以在承香墨影公众号回复反编译,你将获得我整理好的一些关于反编译的资料。今天在承香墨影公众号的后台,回复成长。

一、前言

Android 的 App 实际上并不是运行在 Java 虚拟机中,而是运行在 Dalvik 虚拟机中。Dalvik 虚拟机对 Java 虚拟机做了一些额外的优化,让它更适用于移动设备。而 Dalvik 也有自己独特的汇编语言,Dalvik 就是通过这些汇编的指令集,来运行我们编译好的 Apk 程序。

一般这些内容,我们正常开发 App 是接触不到的,但是如果你有反编译的需求,那你就需要花点时间研究一下它。本文不会介绍 Dalvik 的汇编指令集,它本身已经有完备的文档,没什么好说的。

本文就从逆向思维的路子,教你如何写一个可在 Dalvik 上独立运行的 Hello World 程序。

在这个过程中,我们需要了解 smali 语法,smali 是一种宽松的 Jasmin/dedexer 语法,它可以通过 baksmali 将我们已经编译好的 dex 格式的汇编语言,反汇编成 smali 文件,供我们阅读。

那么,我们的第一个 Dalvik 版本的 Hello World ,就从一个编写一个 smali 文件开始吧。

二、开始编写 Smali

既然是 smali 文件,当然是以 .smali 为文件后缀,这里先创建一个 SmaliHello.smali 文件,直接上代码,再来看每行的含义。

第 1~3 行,实际上是声明了 smali 文件的头,每个 smali 文件都会有它们。.class 表示类名,这里定义了一个 public 的类,全类名是 com.cxmyDev.smalidemo.SmaliHelo.super 表示它的父类,这里是 Object。.source 表示它对应的 Java 文件的文件名,这只是个标记,实际上在真实反编译的场景下,如果代码被混淆了,.source 可能会没有值。

第 6 行,定义了一个 # direct methos ,它是 baksmali 为我们添加的一行注释,表示之后紧跟着这个类相对应的方法,需要注意的是,只会包含构造方法和静态方法,这里不展开讨论了。

第 7~14 行,以一个 .method 开始,.end 结尾,表示它是一个方法,而 publi constructor 表示它是一个公有的构造方法,这里其实就是 Java 类默认的构造方法,如果我们不声明构造方法,编译器会为我们创建一个无参的构造方法,这里就是它了。没啥好说的,直接写就好了。

第 16~28 行,它也是一个方法,public static 表示它是一个公有的静态方法,方法名是 main。而之后紧跟的 ([LJava/lang/String;])V 表示它需要传递一个 String 数组,并且返回值是 void。再来看看方法内部的代码,第 17 行,.registers 表示寄存器的声明,这里声明了 3 个寄存器,供后面使用,.param 表示了方法传递的参数,参数名叫 args ,并且是一个 String 数组类型。.prologue 表示一个开场,之后跟随的才是我们业务逻辑的代码。

第 21 行,sget-object 表示创建了一个 PrintStream 对象,并存入 v0 寄存器中。

第 23 行,const-string 表示什么了一个字符串 "Hello CxmyDev!",并存入 v1 寄存器中。

第 25行,invoke-virtual 表示调用了 PrintStream 中的 printIn() 方法,参数传递的是 v1 寄存器中的值,就是之前存储的 "Hello CxmyDev!"。

到这里,smali 中的代码,我们已经逐行认清楚它是干嘛的了,有些细节就不展开讲了,不了解的可以看看 Dalvik 的语法和 smali 的语法,有兴趣可以先看看这两个链接。

Dalvik-bytecode:

https://source.android.com/de...

Dex 格式:

https://source.android.com/de...

三、编译 smali

编写完 smali 代码之后,接下来就要将它编译成 dex 文件了,这就需要用到 smali.jar 这个工具。你可以在 Bitbucket 上直接下载到 jar 包。

https://bitbucket.org/JesusFr...

smali.jar 最新的版本版本是 2.2.1,所以这里下载这个版本就可以了。(不方便下载的话,文末有下载方式)

先来看看 smali.jar 的帮助文档,直接使用 java -jar 命令即可。

我们这里主要会用到它的 assemble 命令,再来看看 assemble 的帮助文档,使用 java -jar snali.jar a 命令即可查看,aassemble 的缩写。

可以看到,使用 -o 就可以指定输出的 dex 文件,然后再指定编译的 smali 文件即可。

java -jar smali-2.2.1.jar a -o hello.dex SmaliHello.smali 

执行完成,如果没有报错的话,可以在当前目录下,生成一个 hello.dex 文件。如果有其它输出,应该就是报错了,查看一下报错信息解决它就好了。

得到 hello.dex 文件之后,我们还需要将它放到我们的 Android 设备上,才可以运行,这个非常简单,使用 adb push 命令即可。

最终运行这个 dex 文件,还需要使用到 dalvikvm ,使用 adb shell dalvikvm -h 命令,查看帮助文档,文档比较长,这里截取关键部分。

这里我们主要是使用 -cp 指定 classpath 即可执行,它后续接收的是类的完整签名,包含包名。

然后我们就需要使用 dalvikvm -cp 命令即可执行,主要指定要执行的类,需要包含包名的全类名。

这里,就可以输出我们之前编写的 Hello CxmyDev! 了。

下面备份一下输入的命令。

adb shell push hello.dex /sdcard/
adb shell dalvikvm -cp /sdcard/hello.dex com.cxmydev.smalidemo.SmaliHello 
四、Dex 的 Java 代码

到这里就算是将清楚,从零编写一个 smali 代码,到编译成 dex 并成功执行的所有过程了。

我们再来看看,我们编辑的 smali 代码,到底用 Java 代码编写,是什么内容,可以帮助我们更好的理解它。

其实很简单,再使用 jadx 工具,对 dex 进行反编译。因为我们这里也不涉及混淆,所以代码结构非常的清晰。

这里就是初学 Java 的时候,一个标准的 Java 程序,有个 main 函数为程序的入口函数。

五、小结

本文到这里就算是完成了整个逆向的反逆向流程,相信能让你加深对反编译和 smali 的理解。

有些工具如果不方便下载(原因你懂的),可以在承香墨影公众号回复 smali工具 进行下载,可以下载到本文所有涉及到的资源文件。

更多反编译的细节,可以在承香墨影公众号回复 Android反编译,你将获得我整理好的一些关于反编译的资料。

今天在承香墨影公众号的后台,回复 成长。我会送你一些我整理的学习资料,包含:Android反编译、算法、设计模式、Web项目源码。

推荐阅读:

Glide 这样用,更省内存!!!

跳槽前,不思考这些等于白跳!!!

哪些年熬过的夜,终将会"回报"你的

当你只有一个设备的时候,如何做好屏幕适配

Android 源码,在线阅读更方便!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14011.html

相关文章

  • 安卓动态调试七种武器之长生剑 - Smali Instrumentation

    摘要:长生剑长生剑是把神奇的剑,为白玉京所配,剑名取意来自于李白的诗仙人抚我顶,结发受长生。这种方法就是,又称插桩。本地变量统一用表示。 作者:蒸米@阿里聚安全 0x00 序 ​随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的。另外工具是死的,人是活的,如果能搞懂工具的原理再结合上自身的经验,你也可以创造出属于自己的调试武器。因此,笔者将会在这一系列...

    weizx 评论0 收藏0
  • 浅谈Android应保护(一):Android应逆向基本方法

    摘要:的工作原理是,反编译文件,遍历代码,搜索配置文件中配置的需要监控的,如果找到一个的调用,则分析其参数,然后调用包空间下对应的类的静态函数。这些静态函数实现都是解析参数,打印输出信息。 对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击。使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码、数据,修改其代码逻辑和机制等操作。这篇文章...

    oneasp 评论0 收藏0
  • Android逆向从入门到入土(smali修改,so修改)

    摘要:闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分反编译,即语法学习层,汇编学习。不多说,做过安卓开发都可以改,重点是的阅读修改。想要深入了解相关知识,可以百度关键字安卓,安卓,安卓,安卓。 闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分:1.dex反编译,即smali语法学习;2.Native层,...

    woshicixide 评论0 收藏0
  • Android逆向从入门到入土(smali修改,so修改)

    摘要:闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分反编译,即语法学习层,汇编学习。不多说,做过安卓开发都可以改,重点是的阅读修改。想要深入了解相关知识,可以百度关键字安卓,安卓,安卓,安卓。 闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分:1.dex反编译,即smali语法学习;2.Native层,...

    frank_fun 评论0 收藏0
  • apk包破解与反编译

    摘要:是反编译的神器,用来提取内的资源。工具使用主要是将的反编译成源码,方便阅读。首先将文件改名为文件然后解压包,可以得到一个文件,这个就是文件编译再通过工具打包而成的二进制文件。是的反编译器把二进制的可执行文件翻译成代码。 处于学习和研究的目的,还有为了反破解和反逆向的目的,有时候需要破解apk,关于apk包的破解,需要使用三个反编译工具: 提取资源:apktool, http://ib...

    opengps 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<