用smali写一个java加法程序和HelloWorld程序
2017-05-20 11:26
399 查看
最近看完丰虫大大的《Android软件安全与逆向分析》前三章,自己动手用smali写一个java加法程序和HelloWorld程序,也算对前期学习的一个总结。
注意:return-void这行不要忘记写,否则之后把smali文件转换成dex文件时会报错。
之后添加main()方法的功能:
保存后,将其转换为dex文件:
导入Android设备:
最后,运行.dex文件:
可以看到:向main()方法输入两个参数5、5,最后得到结果10。
然后完善main()方法的功能:
将.smali文件转换为.dex文件:
将.dex文件导入Android手机:
运行.dex文件:
这样,所有步骤就都完成了,需要注意的是,向Android设备中导入文件,需要获得所操作文件夹的读写权限。
1.java加法程序:
首先搭建好类文件的框架:.class public Ltest2; .super Ljava/lang/Object; .source "test2.java" # direct methods .method public constructor <init>()V .registers 1 .prologue invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method .method public static main([Ljava/lang/String;)V .registers 5 .prologue return-void .end method
注意:return-void这行不要忘记写,否则之后把smali文件转换成dex文件时会报错。
之后添加main()方法的功能:
.method public static main([Ljava/lang/String;)V .registers 5 .prologue #V0 V1 清零 const/4 v0, 0x0 const/4 v1, 0x1 #接收传进来的2个参数 aget-object v0, p0, v0 aget-object v1, p0, v1 #把第一个参数转化成int类型,值存给vo invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 #把第二个参数转化成int类型,值存给v1 invoke-static {v1}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v1 #两个参数相加,值存给vo add-int/2addr v0, v1 #把vo中的结果转化成String类型,值存给vo invoke-static {v0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; move-result-object v0 #构造一个StringBuilder类型对象的新实例 把值赋给v2 new-instance v2, Ljava/lang/StringBuilder; #调用实例的直接方法 invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V #定义一个字符串常量 const-string v3, "The Sum is :" #调用实例方法,把v3与v2里的字符串相加再给v2 invoke-virtual{v2,v3},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v2 #调用实例方法,把v0与v2里的字符串相加再给v2 invoke-virtual{v2,v0},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v2 invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v2 #赋给v1值System.out sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; #输出结果 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V return-void .end method
保存后,将其转换为dex文件:
导入Android设备:
最后,运行.dex文件:
可以看到:向main()方法输入两个参数5、5,最后得到结果10。
2.HelloWorld程序:这个程序功能非常简单,就是输出“HelloWorld”字符串。
首先建立类文件基本框架:.class public LHelloWorld; .super Ljava/lang/Object; .source "HelloWorld.java" .method public constructor <init>()V .registers 1 .prologue invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method .method public static main([Ljava/lang/String;)V .registers 4 .prologue .end method
然后完善main()方法的功能:
.method public static main([Ljava/lang/String;)V .registers 4 .prologue nop const/4 v0,0x0 const/4 v1,0x1 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "Hello World" invoke-virtual{v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V return-void .end method
将.smali文件转换为.dex文件:
将.dex文件导入Android手机:
运行.dex文件:
这样,所有步骤就都完成了,需要注意的是,向Android设备中导入文件,需要获得所操作文件夹的读写权限。
相关文章推荐
- Java - SpringMVC基础入门,创建一个HelloWorld程序
- Java Learning 001 新建一个Java工程 HelloWorld程序
- Java Learning 001 新建一个Java工程 HelloWorld程序
- 用Smali写一个加法程序
- 一个标准的helloworld程序(java)
- JAVA-一个简单的JSP程序(HelloWorld)
- 编写一个java程序,从1加到100,结果是5050。 每做一次加法,就休眠1秒 当程序运行过程中,杀死这个程序。 再次运行,还能从上次的计算结果继续下去。
- 编写一个java程序,从1加到100,每做一次加法,就休眠1秒,当程序运行过程中,杀死这个程序。 再次运行,还能从上次的计算结果继续下去
- 学习笔记_Java_day13_三层的HelloWorld程序(15)--不错,整体三层架构学习
- Java 写一个方法判断一个字符串是否对称 "asdfgasdfg"、编写一个程序,将下面的一段文本中的各个单词的字母顺序翻转,
- 用Java编写一个小程序:键盘输入圆的半径,求圆的面积
- 学习数据结构搜索的的意外收获哈。一个简单的基于java的网页抓取程序。
- 整理下最近写java一个小界面程序的知识整理
- Java语言程序设计-Eclipse入门之HelloWorld程序与例1-1程序
- 一道Java相关的小程序题(一个无序数组里有99个不重复正整数,范围从......)
- java中使用向量做的一个简单翻页程序
- java 一个Icon接口实现的程序
- 一个JNI下c和java程序范例
- Servlet学习笔记_03_使用servlet编写一个简单的helloworld程序
- Java实现的一个词频统计程序